Zqiang
4d58c9fb45
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@gmail.com>
Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-04-13 13:07:34 +02:00
..
2023-05-11 13:42:39 -07:00
2023-01-09 12:09:52 -08:00
2020-08-24 18:39:24 -07:00
2023-01-03 17:28:34 -08:00
2023-01-03 17:28:34 -08:00
2024-01-10 17:16:56 +01:00
2023-07-14 15:01:49 -07:00
2023-08-14 15:01:08 -07:00
2023-07-14 15:01:04 -07:00
2023-03-27 11:15:59 -07:00
2023-11-28 17:19:36 +00:00
2022-11-29 14:04:33 -08:00
2024-01-10 17:16:56 +01:00
2023-01-03 17:48:40 -08:00
2024-03-26 18:19:17 -04:00
2024-04-13 13:07:34 +02:00
2023-05-11 13:42:39 -07:00
2023-11-28 17:20:02 +00:00
2024-03-26 18:19:17 -04:00
2023-11-28 17:20:02 +00:00
2023-02-02 16:40:07 -08:00