summaryrefslogtreecommitdiff
path: root/block/blk-exec.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov@parallels.com>2013-02-14 18:19:59 +0400
committerJens Axboe <axboe@kernel.dk>2013-02-15 16:45:07 +0100
commit5577022f4ed8973762450ebe7fe7ebfd953817db (patch)
treec6c965101e32bf2b36155da0fc0ad94c696d4606 /block/blk-exec.c
parent686855f5d833178e518d79e7912cdb3268a9fa69 (diff)
downloadlwn-5577022f4ed8973762450ebe7fe7ebfd953817db.tar.gz
lwn-5577022f4ed8973762450ebe7fe7ebfd953817db.zip
block: account iowait time when waiting for completion of IO request
Using wait_for_completion() for waiting for a IO request to be executed results in wrong iowait time accounting. For example, a system having the only task doing write() and fdatasync() on a block device can be reported being idle instead of iowaiting as it should because blkdev_issue_flush() calls wait_for_completion() which in turn calls schedule() that does not increment the iowait proc counter and thus does not turn on iowait time accounting. The patch makes block layer use wait_for_completion_io() instead of wait_for_completion() where appropriate to account iowait time correctly. Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-exec.c')
-rw-r--r--block/blk-exec.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/block/blk-exec.c b/block/blk-exec.c
index 74638ec234c8..f634de772b0c 100644
--- a/block/blk-exec.c
+++ b/block/blk-exec.c
@@ -120,9 +120,9 @@ int blk_execute_rq(struct request_queue *q, struct gendisk *bd_disk,
/* Prevent hang_check timer from firing at us during very long I/O */
hang_check = sysctl_hung_task_timeout_secs;
if (hang_check)
- while (!wait_for_completion_timeout(&wait, hang_check * (HZ/2)));
+ while (!wait_for_completion_io_timeout(&wait, hang_check * (HZ/2)));
else
- wait_for_completion(&wait);
+ wait_for_completion_io(&wait);
if (rq->errors)
err = -EIO;