lkml.org 
[lkml]   [2009]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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



    \
     
     \ /
      Last update: 2009-09-11 21:29    [W:0.026 / U:2.508 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site