As far as I can see, almost all callers of unrecoverable_exception() expect it 
to never return.

Can we mark it __noreturn ?

Below is interrupt_exit_kernel_prepare() with then without unrecoverable_exception() declared as __noreturn. (CONFIG_PREEMPT_NONE, and with the BUG_ON() removed)

With the __noreturn added, we get no stack frame on the likely path

000003a8 <interrupt_exit_kernel_prepare>:
 3a8:   81 43 00 84     lwz     r10,132(r3)
 3ac:   71 4a 00 02     andi.   r10,r10,2
 3b0:   41 82 00 30     beq     3e0 <interrupt_exit_kernel_prepare+0x38>
 3b4:   80 62 00 70     lwz     r3,112(r2)
 3b8:   74 63 00 01     andis.  r3,r3,1
 3bc:   40 82 00 34     bne     3f0 <interrupt_exit_kernel_prepare+0x48>
 3c0:   7d 40 00 a6     mfmsr   r10
 3c4:   55 4a 04 5e     rlwinm  r10,r10,0,17,15
 3c8:   7d 40 01 24     mtmsr   r10
 3cc:   7d 20 00 a6     mfmsr   r9
 3d0:   55 29 07 fa     rlwinm  r9,r9,0,31,29
 3d4:   55 29 04 5e     rlwinm  r9,r9,0,17,15
 3d8:   7d 20 01 24     mtmsr   r9
 3dc:   4e 80 00 20     blr
 3e0:   94 21 ff f0     stwu    r1,-16(r1)
 3e4:   7c 08 02 a6     mflr    r0
 3e8:   90 01 00 14     stw     r0,20(r1)
 3ec:   48 00 00 01     bl      3ec <interrupt_exit_kernel_prepare+0x44>
                        3ec: R_PPC_REL24        unrecoverable_exception
 3f0:   38 e2 00 70     addi    r7,r2,112
 3f4:   3d 00 00 01     lis     r8,1
 3f8:   7c c0 38 28     lwarx   r6,0,r7
 3fc:   7c c6 40 78     andc    r6,r6,r8
 400:   7c c0 39 2d     stwcx.  r6,0,r7
 404:   40 a2 ff f4     bne     3f8 <interrupt_exit_kernel_prepare+0x50>
 408:   38 60 00 01     li      r3,1
 40c:   4b ff ff b4     b       3c0 <interrupt_exit_kernel_prepare+0x18>

Without the modification:

000003a8 <interrupt_exit_kernel_prepare>:
 3a8:   94 21 ff f0     stwu    r1,-16(r1)
 3ac:   93 e1 00 0c     stw     r31,12(r1)
 3b0:   81 23 00 84     lwz     r9,132(r3)
 3b4:   71 29 00 02     andi.   r9,r9,2
 3b8:   41 82 00 38     beq     3f0 <interrupt_exit_kernel_prepare+0x48>
 3bc:   81 22 00 70     lwz     r9,112(r2)
 3c0:   75 23 00 01     andis.  r3,r9,1
 3c4:   40 82 00 4c     bne     410 <interrupt_exit_kernel_prepare+0x68>
 3c8:   7d 20 00 a6     mfmsr   r9
 3cc:   55 29 04 5e     rlwinm  r9,r9,0,17,15
 3d0:   7d 20 01 24     mtmsr   r9
 3d4:   7d 20 00 a6     mfmsr   r9
 3d8:   55 29 07 fa     rlwinm  r9,r9,0,31,29
 3dc:   55 29 04 5e     rlwinm  r9,r9,0,17,15
 3e0:   7d 20 01 24     mtmsr   r9
 3e4:   83 e1 00 0c     lwz     r31,12(r1)
 3e8:   38 21 00 10     addi    r1,r1,16
 3ec:   4e 80 00 20     blr
 3f0:   7c 08 02 a6     mflr    r0
 3f4:   90 01 00 14     stw     r0,20(r1)
 3f8:   48 00 00 01     bl      3f8 <interrupt_exit_kernel_prepare+0x50>
                        3f8: R_PPC_REL24        unrecoverable_exception
 3fc:   81 22 00 70     lwz     r9,112(r2)
 400:   80 01 00 14     lwz     r0,20(r1)
 404:   75 23 00 01     andis.  r3,r9,1
 408:   7c 08 03 a6     mtlr    r0
 40c:   41 82 ff bc     beq     3c8 <interrupt_exit_kernel_prepare+0x20>
 410:   39 02 00 70     addi    r8,r2,112
 414:   3d 20 00 01     lis     r9,1
 418:   7c e0 40 28     lwarx   r7,0,r8
 41c:   7c e7 48 78     andc    r7,r7,r9
 420:   7c e0 41 2d     stwcx.  r7,0,r8
 424:   40 a2 ff f4     bne     418 <interrupt_exit_kernel_prepare+0x70>
 428:   38 60 00 01     li      r3,1
 42c:   7d 20 00 a6     mfmsr   r9
 430:   55 29 04 5e     rlwinm  r9,r9,0,17,15
 434:   7d 20 01 24     mtmsr   r9
 438:   7d 20 00 a6     mfmsr   r9
 43c:   55 29 07 fa     rlwinm  r9,r9,0,31,29
 440:   55 29 04 5e     rlwinm  r9,r9,0,17,15
 444:   7d 20 01 24     mtmsr   r9
 448:   83 e1 00 0c     lwz     r31,12(r1)
 44c:   38 21 00 10     addi    r1,r1,16
 450:   4e 80 00 20     blr

Reply via email to