Messages in this thread | | | Date | Mon, 14 Sep 2009 05:08:02 +0200 | From | Frederic Weisbecker <> | Subject | Re: [PATCH tracing/kprobes 4/7] tracing/kprobes: Add event profiling support |
| |
On Fri, Sep 11, 2009 at 03:30:24PM -0400, Masami Hiramatsu wrote: >> 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?
Exactly. To simplify I guess the raw events just needs to be u32 aligned :)
> (Hmm, why would not perf_counter align data by itself? :)
Because that would require it to copy the data into a seperate u64 aligned buffer.
>> >> 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.
Thanks!
| |