Messages in this thread | | | Subject | Re: ftrace introduces instability into kernel 2.6.27(-rc2,-rc3) | From | Benjamin Herrenschmidt <> | Date | Wed, 20 Aug 2008 17:18:25 +1000 |
| |
Found the problem (or at least -a- problem), it's a gcc bug.
Well, first I must say the code generated by -pg is just plain horrible :-)
Appart from that, look at the exit of, for example, __d_lookup, as generated by gcc when ftrace is enabled:
c00c0498: 38 60 00 00 li r3,0 c00c049c: 81 61 00 00 lwz r11,0(r1) c00c04a0: 80 0b 00 04 lwz r0,4(r11) c00c04a4: 7d 61 5b 78 mr r1,r11 c00c04a8: bb 0b ff e0 lmw r24,-32(r11) c00c04ac: 7c 08 03 a6 mtlr r0 c00c04b0: 4e 80 00 20 blr
As you can see, it restores r1 -before- it pops r24..r31 off the stack ! I let you imagine what happens if an interrupt happens just in between those two instructions (mr and lmw). We don't do redzones on our ABI, so basically, the registers end up corrupted by the interrupt.
Cheers, Ben.
| |