浏览代码

block: leave the request timeout timer running even on an empty list

For sync IO, we'll often do them serialized. This means we'll be touching
the queue timer for every IO, as opposed to only occasionally like we
do for queued IO. Instead of deleting the timer when the last request
is removed, just let continue running. If a new request comes up soon
we then don't have to readd the timer again. If no new requests arrive,
the timer will expire without side effect later.

This improves high iops sync IO by ~1%.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Jens Axboe 17 年之前
父节点
当前提交
70ed28b92a
共有 2 个文件被更改,包括 1 次插入4 次删除
  1. 1 0
      block/blk-core.c
  2. 0 4
      block/blk-timeout.c

+ 1 - 0
block/blk-core.c

@@ -404,6 +404,7 @@ EXPORT_SYMBOL(blk_stop_queue);
 void blk_sync_queue(struct request_queue *q)
 void blk_sync_queue(struct request_queue *q)
 {
 {
 	del_timer_sync(&q->unplug_timer);
 	del_timer_sync(&q->unplug_timer);
+	del_timer_sync(&q->timeout);
 	kblockd_flush_work(&q->unplug_work);
 	kblockd_flush_work(&q->unplug_work);
 }
 }
 EXPORT_SYMBOL(blk_sync_queue);
 EXPORT_SYMBOL(blk_sync_queue);

+ 0 - 4
block/blk-timeout.c

@@ -73,11 +73,7 @@ ssize_t part_timeout_store(struct device *dev, struct device_attribute *attr,
  */
  */
 void blk_delete_timer(struct request *req)
 void blk_delete_timer(struct request *req)
 {
 {
-	struct request_queue *q = req->q;
-
 	list_del_init(&req->timeout_list);
 	list_del_init(&req->timeout_list);
-	if (list_empty(&q->timeout_list))
-		del_timer(&q->timeout);
 }
 }
 
 
 static void blk_rq_timed_out(struct request *req)
 static void blk_rq_timed_out(struct request *req)