> 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 > Thank you for doing this work. Tested the series, things look good. I am going to run LTP and Unixbench on the kernel. Tested-by: Allen Pais <allen.lkml@xxxxxxxxx> Thanks. > 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 -- - Allen