Not much luck with the 4th patch, I guess it's too big. I've gzip attached it now, with the description inlined. --- Nick writes: This is a patch to perform block device plugging explicitly in the submitting process context rather than implicitly by the block device. There are several advantages to plugging in process context over plugging by the block device: - Implicit plugging is only active when the queue empties, so any advantages are lost if there is parallel IO occuring. Not so with explicit plugging. - Implicit plugging relies on a timer and watermarks and a kind-of-explicit directive in lock_page which directs plugging. These are heuristics and can cost performance due to holding a block device idle longer than it should be. Explicit plugging avoids most of these issues by only holding the device idle when it is known more requests will be submitted. - This lock_page directive uses a roundabout way to attempt to minimise intrusiveness of plugging on the VM. In doing so, it gets needlessly complex: the VM really is in a good position to direct the block layer as to the nature of its requests, so there is no need to try to hide the fact. - Explicit plugging keeps a process-private queue of requests being held. This offers some advantages over immediately sending requests to the block device: firstly, merging can be attempted on requests in this list (currently only attempted on the head of the list) without taking any locks; secondly, when unplugging occurs, the requests can be delivered to the block device queue in a batch, thus the lock aquisitions can be batched up. On a parallel tiobench benchmark, of the 800 000 calls to __make_request performed, this patch avoids 490 000 (62%) of queue_lock aquisitions by early merging on the private plugged list. Signed-off-by: Nick Piggin <[email protected]> Changes so far by me: - Don't invoke ->request_fn() in blk_queue_invalidate_tags - Fixup all filesystems for block_sync_page() - Add blk_delay_queue() to handle the old plugging-on-shortage usage. - Unconditionally run replug_current_nested() in ioschedule() - Fixup queue start/stop - Fixup all the remaining drivers - Change the namespace (prefix the plug functions with blk_) - Fixup ext4 - Dead code removal - Fixup blktrace plug/unplug notifications - __make_request() cleanups - bio_sync() fixups - Kill queue empty checking - Make barriers work again, using QRCU - Make blk_sync_queue() work again, reuse barrier SRCU handling This patch needs more work and some dedicated testing. Signed-off-by: Jens Axboe <[email protected]> -- Jens Axboe
Attachment:
0004-block-explicit-plugging.txt.gz
Description: GNU Zip compressed data
- References:
- [BLOCK] 0/4 explicit io plugging
- From: Jens Axboe <[email protected]>
- [BLOCK] 0/4 explicit io plugging
- Prev by Date: Re: [PATCH] 3/4 qrcu: add documentation
- Next by Date: Re: [PATCH] intel-rng workarounds
- Previous by thread: Re: [PATCH] 3/4 qrcu: add documentation
- Next by thread: Re: [PATCH] 4/4 block: explicit plugging
- Index(es):