From: Patrick Farrell Date: Fri, 23 Feb 2024 16:16:42 +0000 (-0500) Subject: LU-13814 osc: Remove osc delete for transient pages X-Git-Tag: 2.15.64~237 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F79%2F52079%2F19;p=fs%2Flustre-release.git LU-13814 osc: Remove osc delete for transient pages 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 Change-Id: I96539731f972b19830b2e08bf0f1d1f1e9674241 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52079 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin Reviewed-by: Sebastien Buisson --- diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index ec71de5..f2b2bae 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -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); } diff --git a/lustre/osc/osc_page.c b/lustre/osc/osc_page.c index db009e2..04a0229 100644 --- a/lustre/osc/osc_page.c +++ b/lustre/osc/osc_page.c @@ -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); }