lkml.org 
[lkml]   [2022]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.15 41/41] block: add bio_start_io_acct_time() to control start_time
    Date
    From: Mike Snitzer <snitzer@redhat.com>

    [ Upstream commit e45c47d1f94e0cc7b6b079fdb4bcce2995e2adc4 ]

    bio_start_io_acct_time() interface is like bio_start_io_acct() that
    allows start_time to be passed in. This gives drivers the ability to
    defer starting accounting until after IO is issued (but possibily not
    entirely due to bio splitting).

    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Link: https://lore.kernel.org/r/20220128155841.39644-2-snitzer@redhat.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/blk-core.c | 25 +++++++++++++++++++------
    include/linux/blkdev.h | 1 +
    2 files changed, 20 insertions(+), 6 deletions(-)

    diff --git a/block/blk-core.c b/block/blk-core.c
    index c2d912d0c976c..d42a0f3ff7361 100644
    --- a/block/blk-core.c
    +++ b/block/blk-core.c
    @@ -1293,20 +1293,32 @@ void blk_account_io_start(struct request *rq)
    }

    static unsigned long __part_start_io_acct(struct block_device *part,
    - unsigned int sectors, unsigned int op)
    + unsigned int sectors, unsigned int op,
    + unsigned long start_time)
    {
    const int sgrp = op_stat_group(op);
    - unsigned long now = READ_ONCE(jiffies);

    part_stat_lock();
    - update_io_ticks(part, now, false);
    + update_io_ticks(part, start_time, false);
    part_stat_inc(part, ios[sgrp]);
    part_stat_add(part, sectors[sgrp], sectors);
    part_stat_local_inc(part, in_flight[op_is_write(op)]);
    part_stat_unlock();

    - return now;
    + return start_time;
    +}
    +
    +/**
    + * bio_start_io_acct_time - start I/O accounting for bio based drivers
    + * @bio: bio to start account for
    + * @start_time: start time that should be passed back to bio_end_io_acct().
    + */
    +void bio_start_io_acct_time(struct bio *bio, unsigned long start_time)
    +{
    + __part_start_io_acct(bio->bi_bdev, bio_sectors(bio),
    + bio_op(bio), start_time);
    }
    +EXPORT_SYMBOL_GPL(bio_start_io_acct_time);

    /**
    * bio_start_io_acct - start I/O accounting for bio based drivers
    @@ -1316,14 +1328,15 @@ static unsigned long __part_start_io_acct(struct block_device *part,
    */
    unsigned long bio_start_io_acct(struct bio *bio)
    {
    - return __part_start_io_acct(bio->bi_bdev, bio_sectors(bio), bio_op(bio));
    + return __part_start_io_acct(bio->bi_bdev, bio_sectors(bio),
    + bio_op(bio), jiffies);
    }
    EXPORT_SYMBOL_GPL(bio_start_io_acct);

    unsigned long disk_start_io_acct(struct gendisk *disk, unsigned int sectors,
    unsigned int op)
    {
    - return __part_start_io_acct(disk->part0, sectors, op);
    + return __part_start_io_acct(disk->part0, sectors, op, jiffies);
    }
    EXPORT_SYMBOL(disk_start_io_acct);

    diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
    index 0a9fdcbbab83d..be8e7a55d803c 100644
    --- a/include/linux/blkdev.h
    +++ b/include/linux/blkdev.h
    @@ -1947,6 +1947,7 @@ unsigned long disk_start_io_acct(struct gendisk *disk, unsigned int sectors,
    void disk_end_io_acct(struct gendisk *disk, unsigned int op,
    unsigned long start_time);

    +void bio_start_io_acct_time(struct bio *bio, unsigned long start_time);
    unsigned long bio_start_io_acct(struct bio *bio);
    void bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time,
    struct block_device *orig_bdev);
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-02-03 22:10    [W:2.289 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site