Skip to content

Commit

Permalink
[BLOCK] Update read/write block io statistics at completion time
Browse files Browse the repository at this point in the history
Right now we do it at queueing time, which works alright for reads
(since they are usually sync), but not for async writes since we can
queue io a lot faster than we can complete it. This makes the vmstat
output look extremely bursty.

Signed-off-by: Jens Axboe <axboe@suse.de>
  • Loading branch information
Jens Axboe committed Nov 1, 2005
1 parent d83c671 commit d72d904
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions drivers/block/ll_rw_blk.c
Original file line number Diff line number Diff line change
Expand Up @@ -2387,16 +2387,12 @@ static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io)
if (!blk_fs_request(rq) || !rq->rq_disk)
return;

if (rw == READ) {
__disk_stat_add(rq->rq_disk, read_sectors, nr_sectors);
if (!new_io)
if (!new_io) {
if (rw == READ)
__disk_stat_inc(rq->rq_disk, read_merges);
} else if (rw == WRITE) {
__disk_stat_add(rq->rq_disk, write_sectors, nr_sectors);
if (!new_io)
else
__disk_stat_inc(rq->rq_disk, write_merges);
}
if (new_io) {
} else {
disk_round_stats(rq->rq_disk);
rq->rq_disk->in_flight++;
}
Expand Down Expand Up @@ -3048,6 +3044,13 @@ static int __end_that_request_first(struct request *req, int uptodate,
(unsigned long long)req->sector);
}

if (blk_fs_request(req) && req->rq_disk) {
if (rq_data_dir(req) == READ)
__disk_stat_add(req->rq_disk, read_sectors, nr_bytes >> 9);
else
__disk_stat_add(req->rq_disk, write_sectors, nr_bytes >> 9);
}

total_bytes = bio_nbytes = 0;
while ((bio = req->bio) != NULL) {
int nbytes;
Expand Down

0 comments on commit d72d904

Please sign in to comment.