lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 091/232] tracing: Use trace_sched_process_free() instead of exit() for pid tracing
    Date
    From: Steven Rostedt (VMware) <rostedt@goodmis.org>

    commit afcab636657421f7ebfa0783a91f90256bba0091 upstream.

    On exit, if a process is preempted after the trace_sched_process_exit()
    tracepoint but before the process is done exiting, then when it gets
    scheduled in, the function tracers will not filter it properly against the
    function tracing pid filters.

    That is because the function tracing pid filters hooks to the
    sched_process_exit() tracepoint to remove the exiting task's pid from the
    filter list. Because the filtering happens at the sched_switch tracepoint,
    when the exiting task schedules back in to finish up the exit, it will no
    longer be in the function pid filtering tables.

    This was noticeable in the notrace self tests on a preemptable kernel, as
    the tests would fail as it exits and preempted after being taken off the
    notrace filter table and on scheduling back in it would not be in the
    notrace list, and then the ending of the exit function would trace. The test
    detected this and would fail.

    Cc: stable@vger.kernel.org
    Cc: Namhyung Kim <namhyung@kernel.org>
    Fixes: 1e10486ffee0a ("ftrace: Add 'function-fork' trace option")
    Fixes: c37775d57830a ("tracing: Add infrastructure to allow set_event_pid to follow children"
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    kernel/trace/ftrace.c | 4 ++--
    kernel/trace/trace_events.c | 4 ++--
    2 files changed, 4 insertions(+), 4 deletions(-)

    --- a/kernel/trace/ftrace.c
    +++ b/kernel/trace/ftrace.c
    @@ -6969,12 +6969,12 @@ void ftrace_pid_follow_fork(struct trace
    if (enable) {
    register_trace_sched_process_fork(ftrace_pid_follow_sched_process_fork,
    tr);
    - register_trace_sched_process_exit(ftrace_pid_follow_sched_process_exit,
    + register_trace_sched_process_free(ftrace_pid_follow_sched_process_exit,
    tr);
    } else {
    unregister_trace_sched_process_fork(ftrace_pid_follow_sched_process_fork,
    tr);
    - unregister_trace_sched_process_exit(ftrace_pid_follow_sched_process_exit,
    + unregister_trace_sched_process_free(ftrace_pid_follow_sched_process_exit,
    tr);
    }
    }
    --- a/kernel/trace/trace_events.c
    +++ b/kernel/trace/trace_events.c
    @@ -538,12 +538,12 @@ void trace_event_follow_fork(struct trac
    if (enable) {
    register_trace_prio_sched_process_fork(event_filter_pid_sched_process_fork,
    tr, INT_MIN);
    - register_trace_prio_sched_process_exit(event_filter_pid_sched_process_exit,
    + register_trace_prio_sched_process_free(event_filter_pid_sched_process_exit,
    tr, INT_MAX);
    } else {
    unregister_trace_sched_process_fork(event_filter_pid_sched_process_fork,
    tr);
    - unregister_trace_sched_process_exit(event_filter_pid_sched_process_exit,
    + unregister_trace_sched_process_free(event_filter_pid_sched_process_exit,
    tr);
    }
    }

    \
     
     \ /
      Last update: 2020-08-20 15:43    [W:4.394 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site