From 1d8d894d04605165df67a57b73bc4aef362fb382 Mon Sep 17 00:00:00 2001 From: Alexey Lyashkov Date: Tue, 20 Jun 2023 17:01:03 +0300 Subject: [PATCH] LU-16847 ldiskfs: refactor code brw_stats code. counting a number disk or logical extents don't needs a loop. All information exist around of ldiskfs_map_blocks. HPe-bug-id: LUS-11645 Signed-off-by: Alexey Lyashkov Change-Id: I77f3707b88e9bdf6ea06acc950af2a41f056f5d0 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51391 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andrew Perepechko Reviewed-by: Alexander Zarochentsev Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/osd-ldiskfs/osd_internal.h | 4 +++- lustre/osd-ldiskfs/osd_io.c | 10 +++++++++- lustre/osd-ldiskfs/osd_lproc.c | 29 ++++------------------------- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index cba4d76..dc80457 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -591,9 +591,11 @@ struct osd_it_quota { struct osd_iobuf { wait_queue_head_t dr_wait; - atomic_t dr_numreqs; /* number of reqs being processed */ + atomic_t dr_numreqs; /* number of reqs being processed */ int dr_max_pages; int dr_npages; + unsigned int dr_pextents; /* number block extents */ + unsigned int dr_lextents; /* number a logical extents */ int dr_error; int dr_frags; unsigned int dr_init_at:16, /* the line iobuf was initialized */ diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index e238be4..d38affa 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -125,6 +125,9 @@ static int __osd_init_iobuf(struct osd_device *d, struct osd_iobuf *iobuf, init_waitqueue_head(&iobuf->dr_wait); atomic_set(&iobuf->dr_numreqs, 0); iobuf->dr_npages = 0; + iobuf->dr_lextents = 0; + iobuf->dr_pextents = 0; + iobuf->dr_error = 0; iobuf->dr_dev = d; iobuf->dr_frags = 0; @@ -412,7 +415,6 @@ static int osd_do_bio(struct osd_device *osd, struct inode *inode, ENTRY; LASSERT(iobuf->dr_npages == npages); - osd_brw_stats_update(osd, iobuf); iobuf->dr_start_time = ktime_get(); integrity_enabled = bdev_integrity_enabled(bdev, iobuf->dr_rw); @@ -666,10 +668,13 @@ static struct page *osd_get_page(const struct lu_env *env, struct dt_object *dt, static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt, struct niobuf_local *lnb, int npages) { + struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt)); struct osd_thread_info *oti = osd_oti_get(env); + struct osd_iobuf *iobuf = &oti->oti_iobuf; struct pagevec pvec; int i; + osd_brw_stats_update(osd, iobuf); ll_pagevec_init(&pvec, 0); for (i = 0; i < npages; i++) { @@ -966,6 +971,7 @@ static int osd_ldiskfs_map_inode_pages(struct inode *inode, if (fp == NULL) { /* start new extent */ fp = *page++; clen = 1; + iobuf->dr_lextents++; if (++i != pages) continue; } else if (fp->index + clen == (*page)->index) { @@ -1041,6 +1047,8 @@ cont_map: struct brw_stats *h = &osd->od_brw_stats; int idx, c = 0; + iobuf->dr_pextents++; + idx = map.m_flags & LDISKFS_MAP_NEW ? BRW_ALLOC_TIME : BRW_MAP_TIME; lprocfs_oh_tally_log2_pcpu(&h->bs_hist[idx], diff --git a/lustre/osd-ldiskfs/osd_lproc.c b/lustre/osd-ldiskfs/osd_lproc.c index 135e316..a547352 100644 --- a/lustre/osd-ldiskfs/osd_lproc.c +++ b/lustre/osd-ldiskfs/osd_lproc.c @@ -42,39 +42,18 @@ void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf) { struct brw_stats *bs = &osd->od_brw_stats; - sector_t *last_block = NULL; - struct page **pages = iobuf->dr_pages; - struct page *last_page = NULL; - unsigned long discont_pages = 0; - unsigned long discont_blocks = 0; - sector_t *blocks = iobuf->dr_blocks; - int i, nr_pages = iobuf->dr_npages; - int blocks_per_page; - int rw = iobuf->dr_rw; + int nr_pages = iobuf->dr_npages; + int rw = iobuf->dr_rw; if (unlikely(nr_pages == 0)) return; - blocks_per_page = PAGE_SIZE >> osd_sb(osd)->s_blocksize_bits; - lprocfs_oh_tally_log2_pcpu(&bs->bs_hist[BRW_R_PAGES + rw], nr_pages); - while (nr_pages-- > 0) { - if (last_page && (*pages)->index != (last_page->index + 1)) - discont_pages++; - last_page = *pages; - pages++; - for (i = 0; i < blocks_per_page; i++) { - if (last_block && *blocks != (*last_block + 1)) - discont_blocks++; - last_block = blocks++; - } - } - lprocfs_oh_tally_pcpu(&bs->bs_hist[BRW_R_DISCONT_PAGES+rw], - discont_pages); + iobuf->dr_lextents); lprocfs_oh_tally_pcpu(&bs->bs_hist[BRW_R_DISCONT_BLOCKS+rw], - discont_blocks); + iobuf->dr_pextents); } static int osd_stats_init(struct osd_device *osd) -- 1.8.3.1