linux/kernel/rcu
Joel Fernandes a6fc88b22b srcu: Use irq_work to start GP in tiny SRCU
Tiny SRCU's srcu_gp_start_if_needed() directly calls schedule_work(),
which acquires the workqueue pool->lock.

This causes a lockdep splat when call_srcu() is called with a scheduler
lock held, due to:

  call_srcu() [holding pi_lock]
    srcu_gp_start_if_needed()
      schedule_work() -> pool->lock

  workqueue_init() / create_worker() [holding pool->lock]
    wake_up_process() -> try_to_wake_up() -> pi_lock

Also add irq_work_sync() to cleanup_srcu_struct() to prevent a
use-after-free if a queued irq_work fires after cleanup begins.

Tested with rcutorture SRCU-T and no lockdep warnings.

[ Thanks to Boqun for similar fix in patch "rcu: Use an intermediate irq_work
to start process_srcu()" ]

Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>
Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun@kernel.org>
2026-03-25 09:00:05 -07:00
..
Kconfig rcu: Add noinstr-fast rcu_read_{,un}lock_tasks_trace() APIs 2026-01-01 16:39:46 +08:00
Kconfig.debug rcu: Add a small-width RCU watching counter debug option 2025-10-28 17:32:56 +01:00
Makefile rcuperf: Change rcuperf to rcuscale 2020-08-24 18:39:24 -07:00
rcu.h srcu: Use raw spinlocks so call_srcu() can be used under preempt_disable() 2026-03-25 08:55:50 -07:00
rcu_segcblist.c rcu/nocb: Simplify (de-)offloading state machine 2024-09-09 00:03:55 +05:30
rcu_segcblist.h rcu: Remove unused declaration rcu_segcblist_offload() 2024-10-22 15:36:56 +02:00
rcuscale.c Convert remaining multi-line kmalloc_obj/flex GFP_KERNEL uses 2026-02-22 08:26:33 -08:00
rcutorture.c Convert remaining multi-line kmalloc_obj/flex GFP_KERNEL uses 2026-02-22 08:26:33 -08:00
refscale.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
srcutiny.c srcu: Use irq_work to start GP in tiny SRCU 2026-03-25 09:00:05 -07:00
srcutree.c rcu: Use an intermediate irq_work to start process_srcu() 2026-03-25 08:59:59 -07:00
sync.c rcu: Eliminate lockless accesses to rcu_sync->gp_count 2024-07-04 13:48:57 -07:00
tasks.h Convert remaining multi-line kmalloc_obj/flex GFP_KERNEL uses 2026-02-22 08:26:33 -08:00
tiny.c sched: Provide and use set_need_resched_current() 2025-11-20 22:26:09 +01:00
tree.c Merge branch 'rcu-nocb.20260123a' 2026-01-23 11:15:36 -08:00
tree.h Merge branch 'rcu-nocb.20260123a' 2026-01-23 11:15:36 -08:00
tree_exp.h rcu: Make expedited RCU CPU stall warnings detect stall-end races 2026-01-07 21:58:26 +08:00
tree_nocb.h rcu/nocb: Extract nocb_defer_wakeup_cancel() helper 2026-01-23 11:12:25 -08:00
tree_plugin.h rcu: Fix rcu_read_unlock() deadloop due to softirq 2026-01-07 21:58:37 +08:00
tree_stall.h sched: Provide and use set_need_resched_current() 2025-11-20 22:26:09 +01:00
update.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00