summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorShaohua Li <shli@fb.com>2016-11-03 17:03:53 -0700
committerJens Axboe <axboe@fb.com>2016-11-03 22:00:36 -0600
commit50d24c34403c62ad29e8b6db559d491bae20b4b7 (patch)
tree2bf5ebd0a22fde611dd64fd04ceeba576a2c3acb /block
parent46f3cc176210b2db5db89d9c0e62796cad7e3cdc (diff)
downloadlinux-stable-50d24c34403c62ad29e8b6db559d491bae20b4b7.tar.gz
linux-stable-50d24c34403c62ad29e8b6db559d491bae20b4b7.tar.bz2
linux-stable-50d24c34403c62ad29e8b6db559d491bae20b4b7.zip
block: immediately dispatch big size request
Currently block plug holds up to 16 non-mergeable requests. This makes sense if the request size is small, eg, reduce lock contention. But if request size is big enough, we don't need to worry about lock contention. Holding such request makes no sense and it lows the disk utilization. In practice, this improves 10% throughput for my raid5 sequential write workload. The size (128k) is arbitrary right now, but it makes sure lock contention is small. This probably could be more intelligent, eg, check average request size holded. Since this is mainly for sequential IO, probably not worthy. V2: check the last request instead of the first request, so as long as there is one big size request we flush the plug. Signed-off-by: Shaohua Li <shli@fb.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r--block/blk-core.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 0bfaa54d3e9f..2deca48a4a05 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1746,7 +1746,9 @@ get_rq:
if (!request_count)
trace_block_plug(q);
else {
- if (request_count >= BLK_MAX_REQUEST_COUNT) {
+ struct request *last = list_entry_rq(plug->list.prev);
+ if (request_count >= BLK_MAX_REQUEST_COUNT ||
+ blk_rq_bytes(last) >= BLK_PLUG_FLUSH_SIZE) {
blk_flush_plug_list(plug, false);
trace_block_plug(q);
}