Re: [PATCH tracing/kprobes 4/7] tracing/kprobes: Add eventprofiling support
From: Frederic Weisbecker
Date: Sun Sep 13 2009 - 23:08:13 EST
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!
--
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/