md/raid1: enable io accounting
authorGuoqing Jiang <jgq516@gmail.com>
Tue, 25 May 2021 09:46:21 +0000 (17:46 +0800)
committerSong Liu <song@kernel.org>
Tue, 15 Jun 2021 05:32:07 +0000 (22:32 -0700)
For raid1, we record the start time between split bio and clone bio,
and finish the accounting in the final endio.

Also introduce start_time in r1bio accordingly.

Signed-off-by: Guoqing Jiang <jiangguoqing@kylinos.cn>
Signed-off-by: Song Liu <song@kernel.org>
drivers/md/raid1.c
drivers/md/raid1.h

index 696da6b..51f2547 100644 (file)
@@ -300,6 +300,8 @@ static void call_bio_endio(struct r1bio *r1_bio)
        if (!test_bit(R1BIO_Uptodate, &r1_bio->state))
                bio->bi_status = BLK_STS_IOERR;
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               bio_end_io_acct(bio, r1_bio->start_time);
        bio_endio(bio);
 }
 
@@ -1292,6 +1294,9 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
 
        r1_bio->read_disk = rdisk;
 
+       if (!r1bio_existed && blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               r1_bio->start_time = bio_start_io_acct(bio);
+
        read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set);
 
        r1_bio->bios[rdisk] = read_bio;
@@ -1461,6 +1466,8 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
                r1_bio->sectors = max_sectors;
        }
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               r1_bio->start_time = bio_start_io_acct(bio);
        atomic_set(&r1_bio->remaining, 1);
        atomic_set(&r1_bio->behind_remaining, 0);
 
index b7eb09e..ccf10e5 100644 (file)
@@ -158,6 +158,7 @@ struct r1bio {
        sector_t                sector;
        int                     sectors;
        unsigned long           state;
+       unsigned long           start_time;
        struct mddev            *mddev;
        /*
         * original bio going to /dev/mdx