|
From: Masami H. <mhi...@re...> - 2009-06-23 17:26:08
|
Andi Kleen wrote: > Masami Hiramatsu <mhi...@re...> writes: > >> Hi Andi, >> >> Andi Kleen wrote: >>> Masami Hiramatsu <mhi...@re...> writes: >>>> The gcc's crossjumping unifies equivalent code by inserting indirect >>>> jumps which jump into other function body. It is hard to know to where >>>> these jumps jump, so I decided to disable it when setting >>>> CONFIG_OPTPROBES=y. >>> That sounds quite bad. Tail call optimization is an important optimization >>> that especially on kernel style code (lots of indirect pointers >>> and sometimes deep call chains) is very useful. It would be quite >>> sad if production kernels would lose that optimization. >> I think the crossjumping is not the tail call optimization, >> http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gccint/Passes.html > > Statement didn't make sense then. The RTL crossjump pass you're referring > AFAIK does not jump into other functions, it only optimizes jumps > inside a function (unless you're talking about inlines) If so, that's a good news for me. Then just drop the disable crossjumping patch is enough. >>> Also tail calls in C should always jump directly to another function, >>> so they shouldn't be particularly complex to manage. >> Tail call jumps directly into the head of another function, >> not the middle. Thus it is safe. > > cross jumping does neither. > >>>> I also decided not to optimize probes when it is in functions which >>>> will cause exceptions, because the exception in the kernel will jump >>>> to a fixup code and the fixup code jumps back to the middle of the >>>> same function body. >>> Note that not only exceptions do that, there are a few other cases >>> where jumps in and out of out of line sections happen. You might >>> need a more general mechanism to detect this. >> As far as I can see (under arch/x86), Almost all fixup entries are >> defined with ex_table entries, and others jump to the head of >> symbols(or functions). The jumps which jump into the middle of >> some functions are what I need to find, and, as far as I know, >> those fixup jumps are used with exception tables. Of course, >> I might miss some fixup codes, in that case, please let me know:-) > > One case for example are out of line sections generated by gcc itself > with the right options. Hmm, would you know what is the actual name of that section and option? I think another possible solution is decoding those sections and black-listing the target functions when making vmlinux or loading modules. Thank you, -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division e-mail: mhi...@re... |