|
From: Masami H. <mhi...@re...> - 2009-06-23 14:21:43
|
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 > > 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. >> 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:-) Thank you, -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division e-mail: mhi...@re... |