Patch "rcu: Fix __this_cpu_read() lockdep warning in rcu_force_quiescent_state()" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    rcu: Fix __this_cpu_read() lockdep warning in rcu_force_quiescent_state()

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     rcu-fix-__this_cpu_read-lockdep-warning-in-rcu_force.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f5653abd38062b07a8a55c522489f80ce3e89c07
Author: Zqiang <qiang1.zhang@xxxxxxxxx>
Date:   Thu Oct 13 12:41:48 2022 +0800

    rcu: Fix __this_cpu_read() lockdep warning in rcu_force_quiescent_state()
    
    [ Upstream commit ceb1c8c9b8aa9199da46a0f29d2d5f08d9b44c15 ]
    
    Running rcutorture with non-zero fqs_duration module parameter in a
    kernel built with CONFIG_PREEMPTION=y results in the following splat:
    
    BUG: using __this_cpu_read() in preemptible [00000000]
    code: rcu_torture_fqs/398
    caller is __this_cpu_preempt_check+0x13/0x20
    CPU: 3 PID: 398 Comm: rcu_torture_fqs Not tainted 6.0.0-rc1-yoctodev-standard+
    Call Trace:
    <TASK>
    dump_stack_lvl+0x5b/0x86
    dump_stack+0x10/0x16
    check_preemption_disabled+0xe5/0xf0
    __this_cpu_preempt_check+0x13/0x20
    rcu_force_quiescent_state.part.0+0x1c/0x170
    rcu_force_quiescent_state+0x1e/0x30
    rcu_torture_fqs+0xca/0x160
    ? rcu_torture_boost+0x430/0x430
    kthread+0x192/0x1d0
    ? kthread_complete_and_exit+0x30/0x30
    ret_from_fork+0x22/0x30
    </TASK>
    
    The problem is that rcu_force_quiescent_state() uses __this_cpu_read()
    in preemptible code instead of the proper raw_cpu_read().  This commit
    therefore changes __this_cpu_read() to raw_cpu_read().
    
    Signed-off-by: Zqiang <qiang1.zhang@xxxxxxxxx>
    Reviewed-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 5b52727dcc1c..aedd43e1f21c 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2415,7 +2415,7 @@ void rcu_force_quiescent_state(void)
 	struct rcu_node *rnp_old = NULL;
 
 	/* Funnel through hierarchy to reduce memory contention. */
-	rnp = __this_cpu_read(rcu_data.mynode);
+	rnp = raw_cpu_read(rcu_data.mynode);
 	for (; rnp != NULL; rnp = rnp->parent) {
 		ret = (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) ||
 		       !raw_spin_trylock(&rnp->fqslock);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux