Messages in this thread | | | Date | Fri, 11 Sep 2009 15:30:24 -0400 | From | Masami Hiramatsu <> | Subject | Re: [PATCH tracing/kprobes 4/7] tracing/kprobes: Add event profiling support |
| |
Frederic Weisbecker wrote: > On Thu, Sep 10, 2009 at 07:53:30PM -0400, Masami Hiramatsu wrote: >> +#ifdef CONFIG_EVENT_PROFILE >> + >> +/* Kprobe profile handler */ >> +static __kprobes int kprobe_profile_func(struct kprobe *kp, >> + struct pt_regs *regs) >> +{ >> + struct trace_probe *tp = container_of(kp, struct trace_probe, rp.kp); >> + struct ftrace_event_call *call =&tp->call; >> + struct kprobe_trace_entry *entry; >> + int size, i, pc; >> + unsigned long irq_flags; >> + >> + local_save_flags(irq_flags); >> + pc = preempt_count(); >> + >> + size = SIZEOF_KPROBE_TRACE_ENTRY(tp->nr_args); > > > > Note that the end-result must be u64 aligned for perf ring buffer. > And this is a bit tricky. > What is inserted in the perf ring buffer is: > > raw_trace + (u32)raw_trace_size > > So we must ensure that sizeof(raw_trace) + sizeof(u32) > is well u64 aligned. > > We don't insert the trace_size ourself though, this is done > from kernel/perf_counter.c > > But we need to handle the size of the size (sorry) in the final > alignment. > To sum-up: sizeof(raw_trace) doesn't need (shouldn't) to be u64 > aligned but sizeof(raw_trace) + sizeof(u32) must be. > > Given this aligned size, we then substract it by sizeof(u32) > to have the needed size of the raw entry. > > This result gives you the size of char raw_data[], which > is also the same size passed in perf_tpcounter_event(). > > See?
Ah, I see. So the size to write to perf_tpcounter_event must be '(a multiple number of sizeof(u64)) - sizeof(u32)', right?
(Hmm, why would not perf_counter align data by itself? :)
> > That's why we have this in trace/ftrace.h: > > __data_size = "the real entry data size" > __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32), sizeof(u64)); > __entry_size -= sizeof(u32); > > do { > char raw_data[__entry_size]; > ... > perf_tpcounter_event(event_call->id, __addr, __count, entry, > __entry_size); > ... > } while (0);
Ok, I'll do that.
Thank you,
-- Masami Hiramatsu
Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division
e-mail: mhiramat@redhat.com
| |