lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 308/917] ftrace: do CPU checking after preemption disabled
    Date
    From: 王贇 <yun.wang@linux.alibaba.com>

    [ Upstream commit d33cc657372366a8959f099c619a208b4c5dc664 ]

    With CONFIG_DEBUG_PREEMPT we observed reports like:

    BUG: using smp_processor_id() in preemptible
    caller is perf_ftrace_function_call+0x6f/0x2e0
    CPU: 1 PID: 680 Comm: a.out Not tainted
    Call Trace:
    <TASK>
    dump_stack_lvl+0x8d/0xcf
    check_preemption_disabled+0x104/0x110
    ? optimize_nops.isra.7+0x230/0x230
    ? text_poke_bp_batch+0x9f/0x310
    perf_ftrace_function_call+0x6f/0x2e0
    ...
    __text_poke+0x5/0x620
    text_poke_bp_batch+0x9f/0x310

    This telling us the CPU could be changed after task is preempted, and
    the checking on CPU before preemption will be invalid.

    Since now ftrace_test_recursion_trylock() will help to disable the
    preemption, this patch just do the checking after trylock() to address
    the issue.

    Link: https://lkml.kernel.org/r/54880691-5fe2-33e7-d12f-1fa6136f5183@linux.alibaba.com

    CC: Steven Rostedt <rostedt@goodmis.org>
    Cc: Guo Ren <guoren@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
    Cc: Helge Deller <deller@gmx.de>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Albert Ou <aou@eecs.berkeley.edu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Jiri Kosina <jikos@kernel.org>
    Cc: Miroslav Benes <mbenes@suse.cz>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Joe Lawrence <joe.lawrence@redhat.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Jisheng Zhang <jszhang@kernel.org>
    Reported-by: Abaci <abaci@linux.alibaba.com>
    Signed-off-by: Michael Wang <yun.wang@linux.alibaba.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/trace/trace_event_perf.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
    index 6aed10e2f7ce0..fba8cb77a73af 100644
    --- a/kernel/trace/trace_event_perf.c
    +++ b/kernel/trace/trace_event_perf.c
    @@ -441,13 +441,13 @@ perf_ftrace_function_call(unsigned long ip, unsigned long parent_ip,
    if (!rcu_is_watching())
    return;

    - if ((unsigned long)ops->private != smp_processor_id())
    - return;
    -
    bit = ftrace_test_recursion_trylock(ip, parent_ip);
    if (bit < 0)
    return;

    + if ((unsigned long)ops->private != smp_processor_id())
    + goto out;
    +
    event = container_of(ops, struct perf_event, ftrace_ops);

    /*
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 01:55    [W:4.021 / U:0.940 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site