Whamcloud - gitweb
LU-13814 osc: Remove osc delete for transient pages 79/52079/19
authorPatrick Farrell <pfarrell@whamcloud.com>
Fri, 23 Feb 2024 16:16:42 +0000 (11:16 -0500)
committerOleg Drokin <green@whamcloud.com>
Tue, 21 May 2024 18:16:59 +0000 (18:16 +0000)
Transient pages do not need an extra reference for being
part of a transfer, because they are referenced throughout
by cl_io.  This requires a tweak to the page completion
behavior.

This allows us to remove osc_page_delete for transient
pages.

Signed-off-by: Patrick Farrell <patrick.farrell@oracle.com>
Change-Id: I96539731f972b19830b2e08bf0f1d1f1e9674241
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52079
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
lustre/osc/osc_cache.c
lustre/osc/osc_page.c

index ec71de5..f2b2bae 100644 (file)
@@ -1302,11 +1302,12 @@ static int osc_completion(const struct lu_env *env, struct osc_object *osc,
        struct cl_page    *page = oap2cl_page(oap);
        enum cl_req_type   crt;
        int srvlock;
+       int cptype = page->cp_type;
 
        ENTRY;
 
        cmd &= ~OBD_BRW_NOQUOTA;
-       if (page->cp_type != CPT_TRANSIENT) {
+       if (cptype != CPT_TRANSIENT) {
                LASSERTF(equi(page->cp_state == CPS_PAGEIN,  cmd == OBD_BRW_READ),
                         "cp_state:%u, cmd:%d\n", page->cp_state, cmd);
                LASSERTF(equi(page->cp_state == CPS_PAGEOUT, cmd == OBD_BRW_WRITE),
@@ -1339,8 +1340,12 @@ static int osc_completion(const struct lu_env *env, struct osc_object *osc,
         */
        lu_ref_del(&page->cp_reference, "transfer", page);
 
+       /* for transient pages, the last reference is destroyed by the
+        * cl_page_completion process, so do not referencce the page after this
+        */
        cl_page_completion(env, page, crt, rc);
-       cl_page_put(env, page);
+       if (cptype != CPT_TRANSIENT)
+               cl_page_put(env, page);
 
        RETURN(0);
 }
index db009e2..04a0229 100644 (file)
@@ -164,37 +164,35 @@ static void osc_page_delete(const struct lu_env *env,
 {
        struct osc_page   *opg = cl2osc_page(slice);
        struct osc_object *obj = osc_page_object(opg);
+       void *value = NULL;
        int rc;
 
        ENTRY;
        CDEBUG(D_TRACE, "%p\n", opg);
-       osc_page_transfer_put(env, opg);
 
-       if (slice->cpl_page->cp_type == CPT_CACHEABLE) {
-               void *value = NULL;
+       osc_page_transfer_put(env, opg);
 
-               rc = osc_teardown_async_page(env, obj, opg);
-               if (rc) {
-                       CL_PAGE_DEBUG(D_ERROR, env, slice->cpl_page,
-                                     "Trying to teardown failed: %d\n", rc);
-                       LASSERT(0);
-               }
+       rc = osc_teardown_async_page(env, obj, opg);
+       if (rc) {
+               CL_PAGE_DEBUG(D_ERROR, env, slice->cpl_page,
+                             "Trying to teardown failed: %d\n", rc);
+               LASSERT(0);
+       }
 
-               osc_lru_del(osc_cli(obj), opg);
+       osc_lru_del(osc_cli(obj), opg);
 
-               spin_lock(&obj->oo_tree_lock);
-               if (opg->ops_intree) {
-                       value = radix_tree_delete(&obj->oo_tree,
-                                                 osc_index(opg));
-                       if (value != NULL) {
-                               --obj->oo_npages;
-                               opg->ops_intree = 0;
-                       }
+       spin_lock(&obj->oo_tree_lock);
+       if (opg->ops_intree) {
+               value = radix_tree_delete(&obj->oo_tree,
+                                         osc_index(opg));
+               if (value != NULL) {
+                       --obj->oo_npages;
+                       opg->ops_intree = 0;
                }
-               spin_unlock(&obj->oo_tree_lock);
-
-               LASSERT(ergo(value != NULL, value == opg));
        }
+       spin_unlock(&obj->oo_tree_lock);
+
+       LASSERT(ergo(value != NULL, value == opg));
 
        EXIT;
 }
@@ -236,7 +234,6 @@ static void osc_page_touch(const struct lu_env *env,
 
 static const struct cl_page_operations osc_transient_page_ops = {
        .cpo_print         = osc_page_print,
-       .cpo_delete        = osc_page_delete,
        .cpo_clip           = osc_page_clip,
 };
 
@@ -304,6 +301,7 @@ void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
 {
        struct osc_io *oio = osc_env_io(env);
        struct osc_async_page *oap = &opg->ops_oap;
+       struct cl_page *page = opg->ops_cl.cpl_page;
 
        LASSERT(oap->oap_async_flags & ASYNC_READY);
        LASSERT(oap->oap_async_flags & ASYNC_COUNT_STABLE);
@@ -316,7 +314,8 @@ void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
        if (oio->oi_cap_sys_resource)
                oap->oap_brw_flags |= OBD_BRW_SYS_RESOURCE;
 
-       osc_page_transfer_get(opg, "transfer\0imm");
+       if (page->cp_type != CPT_TRANSIENT)
+               osc_page_transfer_get(opg, "transfer\0imm");
        osc_page_transfer_add(env, opg, crt);
 }