Patch "rcu/nocb: Fix WARN_ON_ONCE() in the rcu_nocb_bypass_lock()" has been added to the 6.8-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/nocb: Fix WARN_ON_ONCE() in the rcu_nocb_bypass_lock()

to the 6.8-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-nocb-fix-warn_on_once-in-the-rcu_nocb_bypass_loc.patch
and it can be found in the queue-6.8 subdirectory.

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



commit 9aa0bc914bab8715b7b1dc81a5ec49f81c9cb736
Author: Zqiang <qiang.zhang1211@xxxxxxxxx>
Date:   Wed Jan 10 16:11:28 2024 +0800

    rcu/nocb: Fix WARN_ON_ONCE() in the rcu_nocb_bypass_lock()
    
    [ Upstream commit dda98810b552fc6bf650f4270edeebdc2f28bd3f ]
    
    For the kernels built with CONFIG_RCU_NOCB_CPU_DEFAULT_ALL=y and
    CONFIG_RCU_LAZY=y, the following scenarios will trigger WARN_ON_ONCE()
    in the rcu_nocb_bypass_lock() and rcu_nocb_wait_contended() functions:
    
            CPU2                                               CPU11
    kthread
    rcu_nocb_cb_kthread                                       ksys_write
    rcu_do_batch                                              vfs_write
    rcu_torture_timer_cb                                      proc_sys_write
    __kmem_cache_free                                         proc_sys_call_handler
    kmemleak_free                                             drop_caches_sysctl_handler
    delete_object_full                                        drop_slab
    __delete_object                                           shrink_slab
    put_object                                                lazy_rcu_shrink_scan
    call_rcu                                                  rcu_nocb_flush_bypass
    __call_rcu_commn                                            rcu_nocb_bypass_lock
                                                                raw_spin_trylock(&rdp->nocb_bypass_lock) fail
                                                                atomic_inc(&rdp->nocb_lock_contended);
    rcu_nocb_wait_contended                                     WARN_ON_ONCE(smp_processor_id() != rdp->cpu);
     WARN_ON_ONCE(atomic_read(&rdp->nocb_lock_contended))                                          |
                                |_ _ _ _ _ _ _ _ _ _same rdp and rdp->cpu != 11_ _ _ _ _ _ _ _ _ __|
    
    Reproduce this bug with "echo 3 > /proc/sys/vm/drop_caches".
    
    This commit therefore uses rcu_nocb_try_flush_bypass() instead of
    rcu_nocb_flush_bypass() in lazy_rcu_shrink_scan().  If the nocb_bypass
    queue is being flushed, then rcu_nocb_try_flush_bypass will return
    directly.
    
    Signed-off-by: Zqiang <qiang.zhang1211@xxxxxxxxx>
    Reviewed-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx>
    Reviewed-by: Frederic Weisbecker <frederic@xxxxxxxxxx>
    Reviewed-by: Paul E. McKenney <paulmck@xxxxxxxxxx>
    Signed-off-by: Boqun Feng <boqun.feng@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h
index 4efbf7333d4e1..d430b4656f59e 100644
--- a/kernel/rcu/tree_nocb.h
+++ b/kernel/rcu/tree_nocb.h
@@ -1383,7 +1383,7 @@ lazy_rcu_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
 			rcu_nocb_unlock_irqrestore(rdp, flags);
 			continue;
 		}
-		WARN_ON_ONCE(!rcu_nocb_flush_bypass(rdp, NULL, jiffies, false));
+		rcu_nocb_try_flush_bypass(rdp, jiffies);
 		rcu_nocb_unlock_irqrestore(rdp, flags);
 		wake_nocb_gp(rdp, false);
 		sc->nr_to_scan -= _count;




[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