[BLOCK] Update read/write block io statistics at completion time
authorJens Axboe <axboe@suse.de>
Tue, 1 Nov 2005 07:35:42 +0000 (08:35 +0100)
committerJens Axboe <axboe@suse.de>
Tue, 1 Nov 2005 07:35:42 +0000 (08:35 +0100)
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>
drivers/block/ll_rw_blk.c

index 0af7351..1b27288 100644 (file)
@@ -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++;
        }
@@ -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;