Hello, The only generic interface to execute asynchronously in the BH context is tasklet; however, it's marked deprecated and has some design flaws such as the execution code accessing the tasklet item after the execution is complete which can lead to subtle use-after-free in certain usage scenarios and less-developed flush and cancel mechanisms. Mikulas Patocka recently reported that dm-crypt and dm-crypt are affected by the access-after-completion issue and suggested adding TASKLET_STATE_ONESHOT flag which selectively removes post-completion access while significantly limiting how the tasklet can be used in the following thread: http://lkml.kernel.org/r/82b964f0-c2c8-a2c6-5b1f-f3145dc2c8e5@xxxxxxxxxx Linus didn't like the approach and suggested extending workqueue to support execution from atomic context: http://lkml.kernel.org/r/CAHk-=wjDW53w4-YcSmgKC5RruiRLHmJ1sXeYdp_ZgVoBw=5byA@xxxxxxxxxxxxxx As suggested, this patchset implements BH workqueues which are like regular workqueues but executes work items in the BH (softirq) context and converts several tasklet users. - The name bh is used instead of the suggested atomic as it's more in line with widely used execution context interface - local_bh_enable/disable() and friends. - The system default BH workqueues - system_bh_wq and system_bh_highpri_wq - are provided. As queue-wide flushing doesn't exist in tasklet, all existing tasklet users should be able to use the system BH workqueues without creating their own. - BH workqueues currently use tasklet to run the work items to avoid priority inversions involving tasklet_hi and WQ_BH | WQ_HIGHPRI. Once all tasklet users are converted, tasklet code can be removed and BH workqueues can take over its softirqs. This patchset is on top of wq/for-6.9 (aae17ebb53c ("workqueue: Avoid using isolated cpus' timers on queue_delayed_work")) and contains the following eight patches. 0001-workqueue-Update-lock-debugging-code.patch 0002-workqueue-Factor-out-init_cpu_worker_pool.patch 0003-workqueue-Implement-BH-workqueues-to-eventually-repl.patch 0004-backtracetest-Convert-from-tasklet-to-BH-workqueue.patch 0005-usb-core-hcd-Convert-from-tasklet-to-BH-workqueue.patch 0006-net-tcp-tsq-Convert-from-tasklet-to-BH-workqueue.patch 0007-dm-crypt-Convert-from-tasklet-to-BH-workqueue.patch 0008-dm-verity-Convert-from-tasklet-to-BH-workqueue.patch 0001-0003 prepare and implement BH workqueues. 0004-0008 convert some tasklet users to BH workqueue. The conversions are relatively straightforward but are in descending order of confidence. The patchset is also available in the following git branch. git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git wq-bh-v1 diffstat follows. Thanks. Documentation/core-api/workqueue.rst | 29 ++++- drivers/md/dm-crypt.c | 36 ------- drivers/md/dm-verity-target.c | 8 - drivers/md/dm-verity.h | 2 drivers/usb/core/hcd.c | 23 ++-- include/linux/usb/hcd.h | 2 include/linux/workqueue.h | 9 + include/net/tcp.h | 2 kernel/backtracetest.c | 18 +-- kernel/workqueue.c | 312 ++++++++++++++++++++++++++++++++++++++++++++++++-------------- kernel/workqueue_internal.h | 3 net/ipv4/tcp.c | 2 net/ipv4/tcp_output.c | 36 +++---- tools/workqueue/wq_dump.py | 11 +- 14 files changed, 335 insertions(+), 158 deletions(-) -- tejun