]> Pileus Git - ~andy/linux/commitdiff
block: Reserve only one queue tag for sync IO if only 3 tags are available
authorJan Kara <jack@suse.cz>
Fri, 28 Jun 2013 19:32:27 +0000 (21:32 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 28 Jun 2013 19:32:27 +0000 (21:32 +0200)
In case a device has three tags available we still reserve two of them
for sync IO. That leaves only a single tag for async IO such as
writeback from flusher thread which results in poor performance.

Allow async IO to consume two tags in case queue has three tag availabe
to get a decent async write performance.

This patch improves streaming write performance on a machine with such disk
from ~21 MB/s to ~52 MB/s. Also postmark throughput in presence of
streaming writer improves from 8 to 12 transactions per second so sync
IO doesn't seem to be harmed in presence of heavy async writer.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-tag.c

index cc345e1d8d4ea0088832833ef985d6b1e764fa44..3f33d86722688a4f50ac0064488540d1960447fb 100644 (file)
@@ -348,9 +348,16 @@ int blk_queue_start_tag(struct request_queue *q, struct request *rq)
         */
        max_depth = bqt->max_depth;
        if (!rq_is_sync(rq) && max_depth > 1) {
-               max_depth -= 2;
-               if (!max_depth)
+               switch (max_depth) {
+               case 2:
                        max_depth = 1;
+                       break;
+               case 3:
+                       max_depth = 2;
+                       break;
+               default:
+                       max_depth -= 2;
+               }
                if (q->in_flight[BLK_RW_ASYNC] > max_depth)
                        return 1;
        }