Whamcloud - gitweb
LU-13309 osd-ldiskfs: remove per-page object_get/put in brw 58/37758/3
authorAndrew Perepechko <c17827@cray.com>
Fri, 28 Feb 2020 13:18:40 +0000 (16:18 +0300)
committerOleg Drokin <green@whamcloud.com>
Thu, 5 Mar 2020 22:37:26 +0000 (22:37 +0000)
According to profiling data, object_get/put calls consume a lot
of CPU ticks:

99.99%  [kernel.vmlinux]
           |
           |--28.82%--_atomic_dec_and_lock
           |          |
           |           --28.82%--lu_object_put
           |                     |
           |                      --28.73%--osd_bufs_put
           |                                ofd_commitrw
           |                                tgt_brw_read
           |                                tgt_request_handle
           |                                ptlrpc_server_handle_request
           |                                ptlrpc_main
           |                                kthread
           |                                ret_from_fork
           |
           |--26.51%--osd_bufs_get
           |          |
           |           --26.51%--ofd_preprw
           |                     tgt_brw_read
           |                     tgt_request_handle
           |                     ptlrpc_server_handle_request
           |                     ptlrpc_main
           |                     kthread
           |                     ret_from_fork
           |
           |--18.09%--lu_object_put
           |          |
           |           --18.01%--osd_bufs_put
           |                     ofd_commitrw
           |                     tgt_brw_read
           |                     tgt_request_handle
           |                     ptlrpc_server_handle_request
           |                     ptlrpc_main
           |                     kthread
           |                     ret_from_fork

ofd_preprw_read() and ofd_preprw_write() pin the corresponding
ofd object, later ofd_commitrw_read() and ofd_commitrw_write()
unpin it. When the ofd object is pinned, its underlying
osd object cannot go away, so object_get/object_put
in osd_bufs_get()/osd_bufs_put() are basically no-op.

Change-Id: Ic48f793de5ef3e62505f44879c91050922160000
Signed-off-by: Andrew Perepechko <c17827@cray.com>
Cray-bug-id: LUS-4388
Reviewed-on: https://review.whamcloud.com/37758
Reviewed-by: Alexander Boyko <c17825@cray.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-ldiskfs/osd_io.c

index 3f83d18..3f0bc7b 100644 (file)
@@ -770,7 +770,6 @@ static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt,
                        if (pagevec_add(&pvec, page) == 0)
                                pagevec_release(&pvec);
                }
-               dt_object_put(env, dt);
 
                lnb[i].lnb_page = NULL;
        }
@@ -883,8 +882,6 @@ bypass_checks:
                lnb->lnb_locked = 1;
                wait_on_page_writeback(lnb->lnb_page);
                BUG_ON(PageWriteback(lnb->lnb_page));
-
-               lu_object_get(&dt->do_lu);
        }
 
 #if 0