lkml.org 
[lkml]   [2011]   [Jul]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH -tip 02/13] [CLEANUP]tracing/kprobes: merge trace probe enable/disable functions
    From
    Date
    On Mon, 2011-06-27 at 16:26 +0900, Masami Hiramatsu wrote:
    > Merge redundant enable/disable functions into enable_trace_probe()
    > and disable_trace_probe().
    >
    > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    > Cc: Steven Rostedt <rostedt@goodmis.org>
    > Cc: Frederic Weisbecker <fweisbec@gmail.com>
    > Cc: Ingo Molnar <mingo@redhat.com>
    > ---
    >
    > kernel/trace/trace_kprobe.c | 88 +++++++++++++++++--------------------------
    > 1 files changed, 34 insertions(+), 54 deletions(-)
    >
    > diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
    > index bad87e9..ce5e6aa 100644
    > --- a/kernel/trace/trace_kprobe.c
    > +++ b/kernel/trace/trace_kprobe.c
    > @@ -683,6 +683,34 @@ static struct trace_probe *find_trace_probe(const char *event,
    > return NULL;
    > }
    >
    > +/* Enable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */
    > +static int enable_trace_probe(struct trace_probe *tp, int flag)
    > +{
    > + int ret = 0;
    > +
    > + tp->flags |= flag;
    > + if (tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE)) {
    > + if (trace_probe_is_return(tp))
    > + ret = enable_kretprobe(&tp->rp);
    > + else
    > + ret = enable_kprobe(&tp->rp.kp);
    > + }

    Hmm, this seems weird. Should we have any protection here? I mean, is it
    ok to call the enable_kprobe() twice? Or should we have something like:

    {
    int old_flags = tp->flags;
    int ret = 0;

    tp->flags |= flag;

    if (!(old_flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE)) &&
    flag & (TP_FLAG_TRACE | TP_FLAG_PROFILE)) {
    [...]
    }

    return ret;
    }


    > +
    > + return ret;
    > +}
    > +
    > +/* Disable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */
    > +static void disable_trace_probe(struct trace_probe *tp, int flag)
    > +{
    > + tp->flags &= ~flag;
    > + if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) {
    > + if (trace_probe_is_return(tp))
    > + disable_kretprobe(&tp->rp);
    > + else
    > + disable_kprobe(&tp->rp.kp);
    > + }
    > +}

    Same here.

    Or do we want to reenable or re disable the probe?

    -- Steve

    > +
    > /* Unregister a trace_probe and probe_event: call with locking probe_lock */
    > static void unregister_trace_probe(struct trace_probe *tp)
    > {
    > @@ -1512,30 +1540,6 @@ partial:
    > return TRACE_TYPE_PARTIAL_LINE;
    > }
    >
    > -static int probe_event_enable(struct ftrace_event_call *call)
    > -{
    > - struct trace_probe *tp = (struct trace_probe *)call->data;
    > -
    > - tp->flags |= TP_FLAG_TRACE;
    > - if (trace_probe_is_return(tp))
    > - return enable_kretprobe(&tp->rp);
    > - else
    > - return enable_kprobe(&tp->rp.kp);
    > -}
    > -
    > -static void probe_event_disable(struct ftrace_event_call *call)
    > -{
    > - struct trace_probe *tp = (struct trace_probe *)call->data;
    > -
    > - tp->flags &= ~TP_FLAG_TRACE;
    > - if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) {
    > - if (trace_probe_is_return(tp))
    > - disable_kretprobe(&tp->rp);
    > - else
    > - disable_kprobe(&tp->rp.kp);
    > - }
    > -}
    > -
    > #undef DEFINE_FIELD
    > #define DEFINE_FIELD(type, item, name, is_signed) \
    > do { \
    > @@ -1714,49 +1718,25 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri,
    > head = this_cpu_ptr(call->perf_events);
    > perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head);
    > }
    > -
    > -static int probe_perf_enable(struct ftrace_event_call *call)
    > -{
    > - struct trace_probe *tp = (struct trace_probe *)call->data;
    > -
    > - tp->flags |= TP_FLAG_PROFILE;
    > -
    > - if (trace_probe_is_return(tp))
    > - return enable_kretprobe(&tp->rp);
    > - else
    > - return enable_kprobe(&tp->rp.kp);
    > -}
    > -
    > -static void probe_perf_disable(struct ftrace_event_call *call)
    > -{
    > - struct trace_probe *tp = (struct trace_probe *)call->data;
    > -
    > - tp->flags &= ~TP_FLAG_PROFILE;
    > -
    > - if (!(tp->flags & TP_FLAG_TRACE)) {
    > - if (trace_probe_is_return(tp))
    > - disable_kretprobe(&tp->rp);
    > - else
    > - disable_kprobe(&tp->rp.kp);
    > - }
    > -}
    > #endif /* CONFIG_PERF_EVENTS */
    >
    > static __kprobes
    > int kprobe_register(struct ftrace_event_call *event, enum trace_reg type)
    > {
    > + struct trace_probe *tp = (struct trace_probe *)event->data;
    > +
    > switch (type) {
    > case TRACE_REG_REGISTER:
    > - return probe_event_enable(event);
    > + return enable_trace_probe(tp, TP_FLAG_TRACE);
    > case TRACE_REG_UNREGISTER:
    > - probe_event_disable(event);
    > + disable_trace_probe(tp, TP_FLAG_TRACE);
    > return 0;
    >
    > #ifdef CONFIG_PERF_EVENTS
    > case TRACE_REG_PERF_REGISTER:
    > - return probe_perf_enable(event);
    > + return enable_trace_probe(tp, TP_FLAG_PROFILE);
    > case TRACE_REG_PERF_UNREGISTER:
    > - probe_perf_disable(event);
    > + disable_trace_probe(tp, TP_FLAG_PROFILE);
    > return 0;
    > #endif
    > }




    \
     
     \ /
      Last update: 2011-07-08 18:39    [W:0.036 / U:118.984 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site