block: add BIO_COMPLETE_IN_TASK for task-context completion#739
block: add BIO_COMPLETE_IN_TASK for task-context completion#739blktests-ci[bot] wants to merge 8 commits intolinus-master_basefrom
Conversation
|
Upstream branch: d60bc14 |
6b4d829 to
ceec5ed
Compare
|
Upstream branch: b4e0758 |
aac4ed3 to
04b8b2f
Compare
ceec5ed to
3b54e52
Compare
|
Upstream branch: 6596a02 |
04b8b2f to
8aee906
Compare
3b54e52 to
6a0b974
Compare
|
Upstream branch: 507bd4b |
8aee906 to
906cfab
Compare
6a0b974 to
59ca59b
Compare
|
Upstream branch: dd6c438 |
906cfab to
93ee5b4
Compare
94f0438 to
857ada9
Compare
|
Upstream branch: dd6c438 |
93ee5b4 to
b77541d
Compare
857ada9 to
482ce5b
Compare
|
Upstream branch: dca922e |
b77541d to
4611e24
Compare
482ce5b to
5a9f7c7
Compare
Some bio completion handlers need to run in task context but bio_endio() can be called from IRQ context (e.g. buffer_head writeback). Add a BIO_COMPLETE_IN_TASK flag that bio submitters can set to request task-context completion of their bi_end_io callback. When bio_endio() sees this flag and is running in non-task context, it queues the bio to a per-cpu lockless list and schedules a delayed work item to call bi_end_io() from task context. The delayed work uses a 1-jiffie delay to allow batches of completions to accumulate before processing. A CPU hotplug dead callback drains any remaining bios from the departing CPU's batch. This will be used to enable RWF_DONTCACHE for block devices, and could be used for other subsystems like fscrypt that need task-context bio completion. Suggested-by: Matthew Wilcox <[email protected]> Signed-off-by: Tal Zussman <[email protected]>
Set BIO_COMPLETE_IN_TASK on iomap writeback bios when a dropbehind folio is added. This ensures that bi_end_io runs in task context, where folio_end_dropbehind() can safely invalidate folios. With the bio layer now handling task-context deferral generically, IOMAP_IOEND_DONTCACHE is no longer needed, as XFS no longer needs to route DONTCACHE ioends through its completion workqueue. Remove the flag and its NOMERGE entry. Without the NOMERGE, regular I/Os that get merged with a dropbehind folio will also have their completion deferred to task context. Signed-off-by: Tal Zussman <[email protected]>
Block device buffered reads and writes already pass through filemap_read() and iomap_file_buffered_write() respectively, both of which handle IOCB_DONTCACHE. Enable RWF_DONTCACHE for block device files by setting FOP_DONTCACHE in def_blk_fops. For CONFIG_BUFFER_HEAD=y paths, add block_write_begin_iocb() which threads the kiocb through so that buffer_head-based I/O can use DONTCACHE behavior. The existing block_write_begin() is preserved as a wrapper that passes a NULL iocb. Set BIO_COMPLETE_IN_TASK in submit_bh_wbc() when the folio has dropbehind so that buffer_head writeback completions get deferred to task context. CONFIG_BUFFER_HEAD=n paths are handled by the previously added iomap BIO_COMPLETE_IN_TASK support. This support is useful for databases that operate on raw block devices, among other userspace applications. Signed-off-by: Tal Zussman <[email protected]>
Replace the bio-flag based interface with an explicit bio_complete_in_task() API. The advantage is that this can also be called from inside the ->bi_end_io callback and thus dynamically. This will be important to use it for fserror reporting. Signed-off-by: Christoph Hellwig <[email protected]>
As described in commit c99fab6, some block drivers might call into ->bi_end_io from non-preemptible context. Copy and past the logic from that commit, although having a core helper for it would be nicer. Signed-off-by: Christoph Hellwig <[email protected]>
Replace out own hand-crafted complete in task context scheme with the generic block code. Signed-off-by: Christoph Hellwig <[email protected]>
Replace out own hand-crafted complete in task context scheme with the generic block code. Signed-off-by: Christoph Hellwig <[email protected]>
Commit 3fffb58 ("erofs: add per-cpu threads for decompression as an option") explains why workqueue aren't great for low-latency completion handling. Switch to a per-cpu kthread to handle it instead. This code is based on the erofs code in the above commit, but further simplified by directly using a kthread instead of a kthread_work. Signed-off-by: Christoph Hellwig <[email protected]>
|
Upstream branch: e75a43c |
4611e24 to
b5542ab
Compare
Pull request for series with
subject: block: add BIO_COMPLETE_IN_TASK for task-context completion
version: 1
url: https://patchwork.kernel.org/project/linux-block/list/?series=1079338