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

Also introduce start_time in r10bio accordingly.

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

index 13f5e6b2a73d6a6aa27c69ad72cdf324c0027dc4..16977e8e075d3037dba5a2dd1c256220902838d5 100644 (file)
@@ -297,6 +297,8 @@ static void raid_end_bio_io(struct r10bio *r10_bio)
        if (!test_bit(R10BIO_Uptodate, &r10_bio->state))
                bio->bi_status = BLK_STS_IOERR;
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               bio_end_io_acct(bio, r10_bio->start_time);
        bio_endio(bio);
        /*
         * Wake up any possible resync thread that waits for the device
@@ -1184,6 +1186,8 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
        }
        slot = r10_bio->read_slot;
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               r10_bio->start_time = bio_start_io_acct(bio);
        read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set);
 
        r10_bio->devs[slot].bio = read_bio;
@@ -1483,6 +1487,8 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
                r10_bio->master_bio = bio;
        }
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               r10_bio->start_time = bio_start_io_acct(bio);
        atomic_set(&r10_bio->remaining, 1);
        md_bitmap_startwrite(mddev->bitmap, r10_bio->sector, r10_bio->sectors, 0);
 
index 1461fd55311be9e6e69b0e06da90f852606dd769..c34bb196790e5eb83b6ea5272b6f5721ba690259 100644 (file)
@@ -124,6 +124,7 @@ struct r10bio {
        sector_t                sector; /* virtual sector number */
        int                     sectors;
        unsigned long           state;
+       unsigned long           start_time;
        struct mddev            *mddev;
        /*
         * original bio going to /dev/mdx