• Sebastian Andrzej Siewior's avatar
    srcu: Avoid local_irq_save() before acquiring spinlock_t · bde50d8f
    Sebastian Andrzej Siewior authored
    SRCU disables interrupts to get a stable per-CPU pointer and then
    acquires the spinlock which is in the per-CPU data structure. The
    release uses spin_unlock_irqrestore(). While this is correct on a non-RT
    kernel, this conflicts with the RT semantics because the spinlock is
    converted to a 'sleeping' spinlock. Sleeping locks can obviously not be
    acquired with interrupts disabled.
    
    Acquire the per-CPU pointer `ssp->sda' without disabling preemption and
    then acquire the spinlock_t of the per-CPU data structure. The lock will
    ensure that the data is consistent.
    
    The added call to check_init_srcu_struct() is now needed because a
    statically defined srcu_struct may remain uninitialized until this
    point and the newly introduced locking operation requires an initialized
    spinlock_t.
    
    This change was tested for four hours with 8*SRCU-N and 8*SRCU-P without
    causing any warnings.
    
    Cc: Lai Jiangshan <jiangshanlai@gmail.com>
    Cc: "Paul E. McKenney" <paulmck@kernel.org>
    Cc: Josh Triplett <josh@joshtriplett.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: rcu@vger.kernel.org
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    bde50d8f
srcutree.c 44.7 KB