lkml.org 
[lkml]   [2022]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC v2 rcu 4/8] srcu: Check for consistent global per-srcu_struct NMI safety
    Date
    This commit adds runtime checks to verify that a given srcu_struct uses
    consistent NMI-safe (or not) read-side primitives globally, but based
    on the per-CPU data. These global checks are made by the grace-period
    code that must scan the srcu_data structures anyway, and are done only
    in kernels built with CONFIG_PROVE_RCU=y.

    Link: https://lore.kernel.org/all/20220910221947.171557773@linutronix.de/

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: John Ogness <john.ogness@linutronix.de>
    Cc: Petr Mladek <pmladek@suse.com>
    ---
    kernel/rcu/srcutree.c | 5 +++++
    1 file changed, 5 insertions(+)

    diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
    index 09a11f2c2042..5772b8659c89 100644
    --- a/kernel/rcu/srcutree.c
    +++ b/kernel/rcu/srcutree.c
    @@ -429,13 +429,18 @@ static unsigned long srcu_readers_lock_idx(struct srcu_struct *ssp, int idx)
    static unsigned long srcu_readers_unlock_idx(struct srcu_struct *ssp, int idx)
    {
    int cpu;
    + unsigned long mask = 0;
    unsigned long sum = 0;

    for_each_possible_cpu(cpu) {
    struct srcu_data *cpuc = per_cpu_ptr(ssp->sda, cpu);

    sum += atomic_long_read(&cpuc->srcu_unlock_count[idx]);
    + if (IS_ENABLED(CONFIG_PROVE_RCU))
    + mask = mask | READ_ONCE(cpuc->srcu_nmi_safety);
    }
    + WARN_ONCE(IS_ENABLED(CONFIG_PROVE_RCU) && (mask & (mask >> 1)),
    + "Mixed NMI-safe readers for srcu_struct at %ps.\n", ssp);
    return sum;
    }

    --
    2.31.1.189.g2e36527f23
    \
     
     \ /
      Last update: 2022-09-29 20:08    [W:4.212 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site