On 7/13/26 02:36, Andrey Zhadchenko wrote:
> 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;

In ideal world (if now >= elapsed) this masking is not needed.
Otherwise, I guess, it does not help either.
See how iolatency_record_time() does no post-masking.

In case I miss something and it's needed, consider using __bio_issue_time() 
helper.

> +#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 */

-- 
Best regards, Pavel Tikhomirov
Senior Software Developer, Virtuozzo.

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to