lkml.org 
[lkml]   [2014]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC][PATCH 1/3] ftrace/x86: Add dynamic allocated trampoline for ftrace_ops
    On Fri, 04 Jul 2014 22:32:44 +0900
    Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> wrote:

    > (2014/07/04 5:07), Steven Rostedt wrote:
    > > +
    > > +void arch_ftrace_update_trampoline(struct ftrace_ops *ops)
    > > +{
    > > + unsigned char *new;
    > > + unsigned long start_offset;
    > > + unsigned long call_offset;
    > > + unsigned long offset;
    > > + unsigned long ip;
    > > + int ret;
    > > +
    > > + if (ops->trampoline) {
    > > + /*
    > > + * The ftrace_ops caller may set up its own trampoline.
    > > + * In such a case, this code must not modify it.
    > > + */
    > > + if (!(ops->flags & FTRACE_OPS_FL_ALLOC_TRAMP))
    > > + return;
    >
    > Just a question, what happen if the ftrace_ops caller sets up a trampoline which is
    > not compatible to the ftrace's trampoline, and the ftrace_ops conflicts on a IP with other
    > ftrace_ops? I guess in that case ftrace will use the loop callback on the IP, but since
    > the trampoline is not compatible, the result will not be same, is that right? :)

    If the caller sets up a trampoline, it must not set the ALLOC_TRAMP
    flag. If you look at the comment about that flag it states this:

    + * ALLOC_TRAMP - A dynamic trampoline was allocated by the core code.
    + * The arch specific code sets this flag when it allocated a
    + * trampoline. This lets the arch know that it can update the
    + * trampoline in case the callback function changes.
    + * The ftrace_ops trampoline can be set by the ftrace users, and
    + * in such cases the arch must not modify it. Only the arch ftrace
    + * core code should set this flag.


    That last line is important. Only the arch ftrace code (the one that
    may modify it with arch_ftrace_update_trampoline should set the
    ALLOC_TRAMP flag. That's how it knows if it can modify it or not.

    The function_graph tracer sets up its own trampoline. Although it needs
    to go through some hoops there because it shares the ftrace_ops with
    the function tracer. Thus, it has to store the trampoline and this flag
    before registering ftrace ops, and then it has to restore it when it
    unregisters.

    -- Steve



    \
     
     \ /
      Last update: 2014-07-04 16:41    [W:5.718 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site