> >
> > If I misunderstand something, please let me know.
> >
>
> Quite.
>
> These functions are being invoked from the IDT, which is an indirect pointer
> structure. When not being traced, there is absolutely no
> reason why it should go through a thunk with tracepoints.
I agree that the cost can be absolutely zero by switching each interrupt
hander when turning on/off the tracepoint.
But I would like to talk about a time penalty of a tracepoint more.
When not being traced, the tracepoint is just nop.
And it is described in the documentation below.
So, the tracepoint seems to be designed to add to performance critical paths.
Documentation/trace/tracepoints.txt
<snip>
* Purpose of tracepoints
A tracepoint placed in code provides a hook to call a function (probe) that you
can provide at runtime. A tracepoint can be "on" (a probe is connected to it)
or "off" (no probe is attached). When a tracepoint is "off" it has no effect,
except for adding a tiny time penalty (checking a condition for a branch) and
space penalty (adding a few bytes for the function call at the end of the
instrumented function and adds a data structure in a separate section). When a
tracepoint is "on", the function you provide is called each time the tracepoint
is executed, in the execution context of the caller. When the function provided
ends its execution, it returns to the caller (continuing from the tracepoint
site).
You can put tracepoints at important locations in the code. They are
lightweight hooks that can pass an arbitrary number of parameters, which
prototypes are described in a tracepoint declaration placed in a header file.
<snip>
Also, as I submitted an actual latency measurement, the time penalty is almost
zero.
<snip>
(1-1) local_timer_entry
- 3.6-rc6 original
<...>-2788 2dNh. 894834337us : exit_idle <-smp_apic_timer_interrupt
<...>-2788 2dNh. 894834337us : hrtimer_interrupt
<-smp_apic_timer_interrupt
- 3.6-rc6 + this patch + trace off
<...>-1981 0d.h. 210538us : exit_idle <-smp_apic_timer_interrupt
<...>-1981 0d.h. 210538us : hrtimer_interrupt
<-smp_apic_timer_interrupt
<snip>
When switching each interrupt handler, all cpus have to be interrupt-disable
with smp_call_funciton() or something like that.
IMO, rather than doing such a complex thing, just adding a tracepoint is
reasonable.
What do you think?
Seiji