Files
linux-stable-mirror/include/linux
Tejun Heo 4fe9852927 rhashtable: Bounce deferred worker kick through irq_work
Inserts past 75% load call schedule_work(&ht->run_work) to kick an
async resize. If a caller holds a raw spinlock (e.g. an
insecure_elasticity user), schedule_work() under that lock records

  caller_lock -> pool->lock -> pi_lock -> rq->__lock

A cycle forms if any of these locks is acquired in the reverse
direction elsewhere. sched_ext, the only current insecure_elasticity
user, hits this: it holds scx_sched_lock across rhashtable inserts of
sub-schedulers, while scx_bypass() takes rq->__lock -> scx_sched_lock.
Exercising the resize path produces:

  Chain exists of:
    &pool->lock --> &rq->__lock --> scx_sched_lock

Bounce the kick from the insert paths through irq_work so
schedule_work() runs from hard IRQ context with the caller's lock no
longer held. rht_deferred_worker()'s self-rearm on error stays on
schedule_work(&ht->run_work) - the worker runs in process context with
no caller lock held, and keeping the self-requeue on @run_work lets
cancel_work_sync() in rhashtable_free_and_destroy() drain it.

v3: Keep rht_deferred_worker()'s self-rearm on schedule_work(&run_work).
    Routing it through irq_work in v2 broke cancel_work_sync()'s
    self-requeue handling - an irq_work queued after irq_work_sync()
    returned but while cancel_work_sync() was still waiting could fire
    post-teardown.

v2: Bounce unconditionally instead of gating on insecure_elasticity,
    as suggested by Herbert.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
2026-04-20 20:10:50 -10:00
..
2026-04-09 21:40:22 +02:00
2026-04-03 16:53:50 -04:00
2026-04-07 08:22:24 -06:00
2026-04-08 18:09:56 -07:00
2026-04-04 08:10:37 -06:00
2026-04-10 11:25:34 -05:00
2026-03-31 19:15:21 +02:00
2026-04-07 17:38:07 +02:00
2026-04-05 13:53:28 -07:00
2026-04-01 10:19:41 +02:00
2026-04-03 16:53:50 -04:00
2026-04-03 16:53:50 -04:00
2026-04-05 13:53:00 -07:00
2026-03-27 07:35:05 -07:00
2026-04-05 13:53:10 -07:00
2026-03-27 18:52:43 +09:00
2026-03-27 17:14:31 -07:00
2026-03-31 07:04:00 -06:00
2026-04-13 08:39:51 -07:00
2026-03-30 16:43:24 -06:00