Re: [PATCH 2/8] tracing: create automated trace defines

From: Jeremy Fitzhardinge
Date: Thu Apr 16 2009 - 20:47:36 EST


Mathieu Desnoyers wrote:
"all this code" is actually :

rcu_read_lock_sched_notrace(); \
it_func = rcu_dereference((tp)->funcs); \
if (it_func) { \
do { \
((void(*)(proto))(*it_func))(args); \
} while (*(++it_func)); \
} \
rcu_read_unlock_sched_notrace(); \

Which does nothing more than disabling preemption and a for loop to
call all the tracepoint handlers. I don't see the big win in laying out
the stack to call this code out-of-line; we would just remove the
preempt disable and the loop, which are minimal compared to most
call stacks.

Well, look at it from my perspective: Ingo has been repeatedly beating me up for the overhead pvops adds to a native kernel, where it really is just a (direct) function call. I want to instrument each pvop site with a tracepoint so I can actually work out which calls are being called how frequently to look for new optimisation opportunities.

I would guess the tracepoint code sequence is going to increase the impact of each pvop call site by a fair bit, and that's not counting the effects the extra register pressure will have. That's a pile of code to add.

And frankly, that's fine by me, because I would expect this degree of introspection to have some performance hit. But it does make the need for per-subsystem tracing Kconfig entries fairly important, because I don't think this would be acceptable to ship in a non-debug-everything kernel build, even though other tracepoints might be.

So basically, tracepoints are already just doing a function call, with a
few more bytes for preempt disable and multiple handler support.

About the compiler deciding to put the unlikely branch out-of-line, I've
never seen any function calls generated just for the sake of saving
those few bytes, that would be crazy of the part of the compiler.
However, it can (and should) freely put the stack setup in the coldest
cache-lines possible, which are reachable by a near jump.

No, it wouldn't generate a call. But if its going to put the code out of line into cold cache-lines, then it may as well generate a call.

Anyway, the important point from my perspective is that tracepoint.h have no #include dependencies beyond linux/types.h (compiler.h, etc).

J
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/