lkml.org 
[lkml]   [2023]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.1 04/49] rcu: Make RCU_LOCKDEP_WARN() avoid early lockdep checks
    Date
    From: "Paul E. McKenney" <paulmck@kernel.org>

    [ Upstream commit 0cae5ded535c3a80aed94f119bbd4ee3ae284a65 ]

    Currently, RCU_LOCKDEP_WARN() checks the condition before checking
    to see if lockdep is still enabled. This is necessary to avoid the
    false-positive splats fixed by commit 3066820034b5dd ("rcu: Reject
    RCU_LOCKDEP_WARN() false positives"). However, the current state can
    result in false-positive splats during early boot before lockdep is fully
    initialized. This commit therefore checks debug_lockdep_rcu_enabled()
    both before and after checking the condition, thus avoiding both sets
    of false-positive error reports.

    Reported-by: Steven Rostedt <rostedt@goodmis.org>
    Reported-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Reported-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Boqun Feng <boqun.feng@gmail.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/rcupdate.h | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
    index 08605ce7379d7..f40c78a127954 100644
    --- a/include/linux/rcupdate.h
    +++ b/include/linux/rcupdate.h
    @@ -348,11 +348,18 @@ static inline int rcu_read_lock_any_held(void)
    * RCU_LOCKDEP_WARN - emit lockdep splat if specified condition is met
    * @c: condition to check
    * @s: informative message
    + *
    + * This checks debug_lockdep_rcu_enabled() before checking (c) to
    + * prevent early boot splats due to lockdep not yet being initialized,
    + * and rechecks it after checking (c) to prevent false-positive splats
    + * due to races with lockdep being disabled. See commit 3066820034b5dd
    + * ("rcu: Reject RCU_LOCKDEP_WARN() false positives") for more detail.
    */
    #define RCU_LOCKDEP_WARN(c, s) \
    do { \
    static bool __section(".data.unlikely") __warned; \
    - if ((c) && debug_lockdep_rcu_enabled() && !__warned) { \
    + if (debug_lockdep_rcu_enabled() && (c) && \
    + debug_lockdep_rcu_enabled() && !__warned) { \
    __warned = true; \
    lockdep_rcu_suspicious(__FILE__, __LINE__, s); \
    } \
    --
    2.39.0
    \
     
     \ /
      Last update: 2023-03-27 00:36    [W:4.148 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site