ftrace introduces instability into kernel 2.6.27(-rc2,-rc3)
Benjamin Herrenschmidt
benh at kernel.crashing.org
Wed Aug 20 17:18:25 EST 2008
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.
More information about the Linuxppc-dev
mailing list