lkml.org 
[lkml]   [2023]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: sched/core] tracing: WARN on rcuidle
    The following commit has been merged into the sched/core branch of tip:

    Commit-ID: 408b961146be4c1a776ce285c3c289afab15298a
    Gitweb: https://git.kernel.org/tip/408b961146be4c1a776ce285c3c289afab15298a
    Author: Peter Zijlstra <peterz@infradead.org>
    AuthorDate: Thu, 12 Jan 2023 20:43:48 +01:00
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitterDate: Fri, 13 Jan 2023 11:48:16 +01:00

    tracing: WARN on rcuidle

    ARCH_WANTS_NO_INSTR (a superset of CONFIG_GENERIC_ENTRY) disallows any
    and all tracing when RCU isn't enabled.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Tested-by: Tony Lindgren <tony@atomide.com>
    Tested-by: Ulf Hansson <ulf.hansson@linaro.org>
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: Frederic Weisbecker <frederic@kernel.org>
    Link: https://lore.kernel.org/r/20230112195541.416110581@infradead.org
    ---
    include/linux/tracepoint.h | 15 +++++++++++++--
    kernel/trace/trace.c | 3 +++
    2 files changed, 16 insertions(+), 2 deletions(-)

    diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
    index 4b33b95..552f80b 100644
    --- a/include/linux/tracepoint.h
    +++ b/include/linux/tracepoint.h
    @@ -178,6 +178,17 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
    #endif /* CONFIG_HAVE_STATIC_CALL */

    /*
    + * ARCH_WANTS_NO_INSTR archs are expected to have sanitized entry and idle
    + * code that disallow any/all tracing/instrumentation when RCU isn't watching.
    + */
    +#ifdef CONFIG_ARCH_WANTS_NO_INSTR
    +#define RCUIDLE_COND(rcuidle) (rcuidle)
    +#else
    +/* srcu can't be used from NMI */
    +#define RCUIDLE_COND(rcuidle) (rcuidle && in_nmi())
    +#endif
    +
    +/*
    * it_func[0] is never NULL because there is at least one element in the array
    * when the array itself is non NULL.
    */
    @@ -188,8 +199,8 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
    if (!(cond)) \
    return; \
    \
    - /* srcu can't be used from NMI */ \
    - WARN_ON_ONCE(rcuidle && in_nmi()); \
    + if (WARN_ON_ONCE(RCUIDLE_COND(rcuidle))) \
    + return; \
    \
    /* keep srcu and sched-rcu usage consistent */ \
    preempt_disable_notrace(); \
    diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
    index a555a86..54ec159 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -3128,6 +3128,9 @@ void __trace_stack(struct trace_array *tr, unsigned int trace_ctx,
    return;
    }

    + if (WARN_ON_ONCE(IS_ENABLED(CONFIG_GENERIC_ENTRY)))
    + return;
    +
    /*
    * When an NMI triggers, RCU is enabled via ct_nmi_enter(),
    * but if the above rcu_is_watching() failed, then the NMI
    \
     
     \ /
      Last update: 2023-03-26 23:39    [W:2.461 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site