Whamcloud - gitweb
LU-16847 ldiskfs: refactor code brw_stats code. 91/51391/9
authorAlexey Lyashkov <alexey.lyashkov@hpe.com>
Tue, 20 Jun 2023 14:01:03 +0000 (17:01 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 13 Sep 2023 04:00:44 +0000 (04:00 +0000)
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 <alexey.lyashkov@hpe.com>
Change-Id: I77f3707b88e9bdf6ea06acc950af2a41f056f5d0
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51391
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-ldiskfs/osd_internal.h
lustre/osd-ldiskfs/osd_io.c
lustre/osd-ldiskfs/osd_lproc.c

index cba4d76..dc80457 100644 (file)
@@ -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 */
index e238be4..d38affa 100644 (file)
@@ -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],
index 135e316..a547352 100644 (file)
 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)