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

Reply via email to