From 2998d6335b273f8a169d60fc72c2d226ac9a8d45 Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Sun, 17 Sep 2023 14:08:11 -0400 Subject: [PATCH] LU-13814 clio: Remove owner for transient pages Removing cl_page ownership is another step in removing cl_page for transient/DIO pages. This disables all of the ownership related functionality for transient pages. Test-Parameters: forjanitoronly Signed-off-by: Patrick Farrell Change-Id: I7f1776284d7cd14bdab89290adcc27e3c73416ec --- lustre/llite/rw26.c | 5 --- lustre/obdclass/cl_io.c | 6 ++- lustre/obdclass/cl_page.c | 93 +++++++++++++++++++++++------------------------ lustre/osc/osc_page.c | 1 + 4 files changed, 50 insertions(+), 55 deletions(-) diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index 580d003..61681c0 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -389,11 +389,6 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, GOTO(out, rc = PTR_ERR(page)); LASSERT(page->cp_type == CPT_TRANSIENT); - rc = cl_page_own(env, io, page); - if (rc) { - cl_page_put(env, page); - break; - } page->cp_sync_io = anchor; if (inode && IS_ENCRYPTED(inode)) { diff --git a/lustre/obdclass/cl_io.c b/lustre/obdclass/cl_io.c index c6ad558..fac274f 100644 --- a/lustre/obdclass/cl_io.c +++ b/lustre/obdclass/cl_io.c @@ -842,7 +842,8 @@ void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page, ENTRY; /* it would be better to check that page is owned by "current" io, but * it is not passed here. */ - LASSERT(page->cp_owner != NULL); + if (page->cp_type != CPT_TRANSIENT) + LASSERT(page->cp_owner != NULL); LASSERT(list_empty(&page->cp_batch)); list_add_tail(&page->cp_batch, &plist->pl_pages); @@ -955,7 +956,8 @@ void cl_page_list_disown(const struct lu_env *env, struct cl_page_list *plist) /* * XXX __cl_page_disown() will fail if page is not locked. */ - __cl_page_disown(env, page); + if (page->cp_type == CPT_CACHEABLE) + __cl_page_disown(env, page); lu_ref_del_at(&page->cp_reference, &page->cp_queue_ref, "queue", plist); cl_page_put(env, page); diff --git a/lustre/obdclass/cl_page.c b/lustre/obdclass/cl_page.c index 2abeeb2..87efdf6 100644 --- a/lustre/obdclass/cl_page.c +++ b/lustre/obdclass/cl_page.c @@ -167,11 +167,10 @@ static void cl_page_free(const struct lu_env *env, struct cl_page *cp, ENTRY; PASSERT(env, cp, list_empty(&cp->cp_batch)); - PASSERT(env, cp, cp->cp_owner == NULL); - if (cp->cp_type != CPT_TRANSIENT) - PASSERT(env, cp, cp->cp_state == CPS_FREEING); if (cp->cp_type == CPT_CACHEABLE) { + PASSERT(env, cp, cp->cp_owner == NULL); + PASSERT(env, cp, cp->cp_state == CPS_FREEING); /* vmpage->private was already cleared when page was * moved into CPS_FREEING state. */ vmpage = cp->cp_vmpage; @@ -477,11 +476,12 @@ void cl_pagevec_put(const struct lu_env *env, struct cl_page *page, refcount_read(&page->cp_ref)); if (refcount_dec_and_test(&page->cp_ref)) { - if (page->cp_type != CPT_TRANSIENT) + if (page->cp_type != CPT_TRANSIENT) { LASSERT(page->cp_state == CPS_FREEING); + PASSERT(env, page, page->cp_owner == NULL); + } LASSERT(refcount_read(&page->cp_ref) == 0); - PASSERT(env, page, page->cp_owner == NULL); PASSERT(env, page, list_empty(&page->cp_batch)); /* * Page is no longer reachable by other threads. Tear @@ -559,9 +559,8 @@ void __cl_page_disown(const struct lu_env *env, struct cl_page *cp) enum cl_page_state state; ENTRY; - cl_page_owner_clear(cp); - if (cp->cp_type == CPT_CACHEABLE) { + cl_page_owner_clear(cp); state = cp->cp_state; PINVRNT(env, cp, state == CPS_OWNED || state == CPS_FREEING); PINVRNT(env, cp, cl_page_invariant(cp) || state == CPS_FREEING); @@ -619,6 +618,8 @@ static int __cl_page_own(const struct lu_env *env, struct cl_io *io, ENTRY; PINVRNT(env, cl_page, !cl_page_is_owned(cl_page, io)); + LASSERT(cl_page->cp_type != CPT_TRANSIENT); + if (cl_page->cp_type != CPT_TRANSIENT && cl_page->cp_state == CPS_FREEING) { result = -ENOENT; @@ -627,9 +628,7 @@ static int __cl_page_own(const struct lu_env *env, struct cl_io *io, LASSERT(vmpage != NULL); - if (cl_page->cp_type == CPT_TRANSIENT) { - /* OK */ - } else if (nonblock) { + if (nonblock) { if (!trylock_page(vmpage)) { result = -EAGAIN; goto out; @@ -649,16 +648,14 @@ static int __cl_page_own(const struct lu_env *env, struct cl_io *io, cl_page->cp_owner = cl_io_top(io); cl_page_owner_set(cl_page); - if (cl_page->cp_type != CPT_TRANSIENT) { - if (cl_page->cp_state == CPS_FREEING) { - __cl_page_disown(env, cl_page); - result = -ENOENT; - goto out; - } - - cl_page_state_set(env, cl_page, CPS_OWNED); + if (cl_page->cp_state == CPS_FREEING) { + __cl_page_disown(env, cl_page); + result = -ENOENT; + goto out; } + cl_page_state_set(env, cl_page, CPS_OWNED); + result = 0; out: PINVRNT(env, cl_page, ergo(result == 0, @@ -706,18 +703,17 @@ void cl_page_assume(const struct lu_env *env, ENTRY; PINVRNT(env, cp, cl_object_same(cp->cp_obj, io->ci_obj)); - if (cp->cp_type == CPT_CACHEABLE) { - vmpage = cp->cp_vmpage; - LASSERT(vmpage != NULL); - LASSERT(PageLocked(vmpage)); - wait_on_page_writeback(vmpage); - } - + LASSERT(cp->cp_type != CPT_TRANSIENT); PASSERT(env, cp, cp->cp_owner == NULL); + + vmpage = cp->cp_vmpage; + LASSERT(vmpage != NULL); + LASSERT(PageLocked(vmpage)); + wait_on_page_writeback(vmpage); cp->cp_owner = cl_io_top(io); cl_page_owner_set(cp); - if (cp->cp_type != CPT_TRANSIENT) - cl_page_state_set(env, cp, CPS_OWNED); + cl_page_state_set(env, cp, CPS_OWNED); + EXIT; } EXPORT_SYMBOL(cl_page_assume); @@ -737,18 +733,16 @@ void cl_page_unassume(const struct lu_env *env, struct page *vmpage; ENTRY; + + LASSERT(cp->cp_type != CPT_TRANSIENT); + PINVRNT(env, cp, cl_page_is_owned(cp, io)); PINVRNT(env, cp, cl_page_invariant(cp)); - cl_page_owner_clear(cp); - if (cp->cp_type != CPT_TRANSIENT) - cl_page_state_set(env, cp, CPS_CACHED); - - if (cp->cp_type == CPT_CACHEABLE) { - vmpage = cp->cp_vmpage; - LASSERT(vmpage != NULL); - LASSERT(PageLocked(vmpage)); - } + cl_page_state_set(env, cp, CPS_CACHED); + vmpage = cp->cp_vmpage; + LASSERT(vmpage != NULL); + LASSERT(PageLocked(vmpage)); EXIT; } @@ -793,15 +787,14 @@ void cl_page_discard(const struct lu_env *env, const struct cl_page_slice *slice; int i; - PINVRNT(env, cp, cl_page_is_owned(cp, io)); - PINVRNT(env, cp, cl_page_invariant(cp)); - cl_page_slice_for_each(cp, slice, i) { if (slice->cpl_ops->cpo_discard != NULL) (*slice->cpl_ops->cpo_discard)(env, slice, io); } if (cp->cp_type == CPT_CACHEABLE) { + PINVRNT(env, cp, cl_page_is_owned(cp, io)); + PINVRNT(env, cp, cl_page_invariant(cp)); vmpage = cp->cp_vmpage; LASSERT(vmpage != NULL); LASSERT(PageLocked(vmpage)); @@ -823,15 +816,16 @@ static void __cl_page_delete(const struct lu_env *env, struct cl_page *cp) int i; ENTRY; - if (cp->cp_type != CPT_TRANSIENT) - PASSERT(env, cp, cp->cp_state != CPS_FREEING); /* * Severe all ways to obtain new pointers to @pg. + * Transient pages already can't be found because they're not in cache. */ - cl_page_owner_clear(cp); - if (cp->cp_type != CPT_TRANSIENT) + if (cp->cp_type != CPT_TRANSIENT) { + PASSERT(env, cp, cp->cp_state != CPS_FREEING); + cl_page_owner_clear(cp); __cl_page_state_set(env, cp, CPS_FREEING); + } cl_page_slice_for_each_reverse(cp, slice, i) { if (slice->cpl_ops->cpo_delete != NULL) @@ -904,9 +898,10 @@ static void cl_page_io_start(const struct lu_env *env, * Page is queued for IO, change its state. */ ENTRY; - cl_page_owner_clear(pg); - if (pg->cp_type != CPT_TRANSIENT) + if (pg->cp_type != CPT_TRANSIENT) { + cl_page_owner_clear(pg); cl_page_state_set(env, pg, cl_req_type_state(crt)); + } EXIT; } @@ -920,13 +915,13 @@ int cl_page_prep(const struct lu_env *env, struct cl_io *io, struct page *vmpage = cp->cp_vmpage; int rc; + if (cp->cp_type == CPT_TRANSIENT) + GOTO(start, rc = 0); PASSERT(env, cp, crt < CRT_NR); PINVRNT(env, cp, cl_page_is_owned(cp, io)); PINVRNT(env, cp, cl_page_invariant(cp)); - if (cp->cp_type == CPT_TRANSIENT) { - /* Nothing to do. */ - } else if (crt == CRT_READ) { + if (crt == CRT_READ) { if (PageUptodate(vmpage)) GOTO(out, rc = -EALREADY); } else { @@ -939,6 +934,7 @@ int cl_page_prep(const struct lu_env *env, struct cl_io *io, if (cp->cp_sync_io == NULL) set_page_writeback(vmpage); } +start: cl_page_io_start(env, cp, crt); rc = 0; @@ -1073,6 +1069,7 @@ int cl_page_flush(const struct lu_env *env, struct cl_io *io, int i; ENTRY; + LASSERT(cl_page->cp_type != CPT_TRANSIENT); PINVRNT(env, cl_page, cl_page_is_owned(cl_page, io)); PINVRNT(env, cl_page, cl_page_invariant(cl_page)); diff --git a/lustre/osc/osc_page.c b/lustre/osc/osc_page.c index c45b6bd..3e8411d 100644 --- a/lustre/osc/osc_page.c +++ b/lustre/osc/osc_page.c @@ -505,6 +505,7 @@ static void discard_pagevec(const struct lu_env *env, struct cl_io *io, for (i = 0; i < max_index; i++) { struct cl_page *page = pvec[i]; + LASSERT(page->cp_type != CPT_TRANSIENT); LASSERT(cl_page_is_owned(page, io)); cl_page_delete(env, page); cl_page_discard(env, io, page); -- 1.8.3.1