If blkcgroup is present, each bio is stamped at the issue time. Expose this via bio_issue_elapsed_ns() so we can accurately calculate total time spent in the block layer.
https://virtuozzo.atlassian.net/browse/VSTOR-103846 Signed-off-by: Andrey Zhadchenko <[email protected]> --- block/bio.c | 23 +++++++++++++++++++++++ include/linux/bio.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/block/bio.c b/block/bio.c index 3c0a558c90f52..c26babfc5e1ce 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1827,6 +1827,29 @@ int bioset_init(struct bio_set *bs, } EXPORT_SYMBOL(bioset_init); +/* + * bio_issue_elapsed_ns - calculate elapsed time since issue + * @bio: bio + * + * Return the elapsed nanoseconds since bio issue until now, + * handling the 51-bit wraparound. + */ +u64 bio_issue_elapsed_ns(struct bio *bio) +{ +#ifdef CONFIG_BLK_CGROUP + u64 now, elapsed; + + /* Mask both operands to 51 bits before the modular subtraction. */ + now = __bio_issue_time(blk_time_get_ns()); + elapsed = now - bio_issue_time(&bio->bi_issue); + + return elapsed & BIO_ISSUE_TIME_MASK; +#else + return 0; +#endif +} +EXPORT_SYMBOL_GPL(bio_issue_elapsed_ns); + static int __init init_bio(void) { int i; diff --git a/include/linux/bio.h b/include/linux/bio.h index 46ffac5caab78..00c116207a25a 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -714,4 +714,6 @@ struct bio *bio_chain_and_submit(struct bio *prev, struct bio *new); struct bio *blk_alloc_discard_bio(struct block_device *bdev, sector_t *sector, sector_t *nr_sects, gfp_t gfp_mask); +u64 bio_issue_elapsed_ns(struct bio *bio); + #endif /* __LINUX_BIO_H */ -- 2.43.5 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
