From 2fb30305fbeeecf316a2f64c7254dd84e912f13c Mon Sep 17 00:00:00 2001 From: James Nunez Date: Wed, 1 Sep 2021 15:14:03 +0000 Subject: [PATCH] EX-3686 revert: "LU-13799 llite: Adjust dio refcounting" This reverts commit 8a31964534358dd1a5db6cf86b9c6014d3c98d48 ("LU-13799 llite: Adjust dio refcounting") This patch is causing several tests to crash with messages similar to the following: BUG: Bad page state in process ptlrpcd_01_01 BUG: Bad page map in process iozone page:ffffdafec7f35640 count:0 mapcount:-1 mapping: (null) index:0x7f5 page flags: 0x6fffff00080018(uptodate|dirty|swapbacked) page dumped because: bad pte addr:7f5524800000 vm_flags:8100073 anon_vma:ffff9e8465843fa0 mapping: (null) index:7f5524800 WARNING: CPU: 1 PID: 9325 at lib/list_debug.c:62 list_del corruption Test-Parameters: trivial testlist=sanity Test-Parameters: testlist=sanity-lfsck Test-Parameters: testlist=sanity-dom Test-Parameters: testlist=sanity-flr Test-Parameters: testlist=replay-single Change-Id: I97b77b671ff0dea4cd13428f700b7643d9e94f09 Signed-off-by: James Nunez Reviewed-on: https://review.whamcloud.com/44806 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/include/cl_object.h | 52 +++++++++++++++++++++----------------------- lustre/llite/llite_lib.c | 2 +- lustre/llite/rw.c | 4 ++-- lustre/llite/rw26.c | 9 ++++---- lustre/llite/vvp_io.c | 4 ++-- lustre/llite/vvp_page.c | 10 ++++----- lustre/obdclass/cl_io.c | 20 ++++++++--------- lustre/obdecho/echo_client.c | 4 ++-- 8 files changed, 51 insertions(+), 54 deletions(-) diff --git a/lustre/include/cl_object.h b/lustre/include/cl_object.h index 00f4553..10a70b0 100644 --- a/lustre/include/cl_object.h +++ b/lustre/include/cl_object.h @@ -2528,35 +2528,33 @@ static inline struct cl_page *cl_page_list_first(struct cl_page_list *plist) #define cl_page_list_for_each_safe(page, temp, list) \ list_for_each_entry_safe((page), (temp), &(list)->pl_pages, cp_batch) -void cl_page_list_init(struct cl_page_list *plist); -void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page, - bool get_ref); -void cl_page_list_move(struct cl_page_list *dst, struct cl_page_list *src, - struct cl_page *page); +void cl_page_list_init (struct cl_page_list *plist); +void cl_page_list_add (struct cl_page_list *plist, struct cl_page *page); +void cl_page_list_move (struct cl_page_list *dst, struct cl_page_list *src, + struct cl_page *page); void cl_page_list_move_head(struct cl_page_list *dst, struct cl_page_list *src, - struct cl_page *page); -void cl_page_list_splice(struct cl_page_list *list, - struct cl_page_list *head); -void cl_page_list_del(const struct lu_env *env, - struct cl_page_list *plist, struct cl_page *page); -void cl_page_list_disown(const struct lu_env *env, - struct cl_io *io, struct cl_page_list *plist); -void cl_page_list_assume(const struct lu_env *env, - struct cl_io *io, struct cl_page_list *plist); + struct cl_page *page); +void cl_page_list_splice (struct cl_page_list *list, + struct cl_page_list *head); +void cl_page_list_del (const struct lu_env *env, + struct cl_page_list *plist, struct cl_page *page); +void cl_page_list_disown (const struct lu_env *env, + struct cl_io *io, struct cl_page_list *plist); +void cl_page_list_assume (const struct lu_env *env, + struct cl_io *io, struct cl_page_list *plist); void cl_page_list_discard(const struct lu_env *env, - struct cl_io *io, struct cl_page_list *plist); -void cl_page_list_fini(const struct lu_env *env, struct cl_page_list *plist); - -void cl_2queue_init(struct cl_2queue *queue); -void cl_2queue_add(struct cl_2queue *queue, struct cl_page *page, - bool get_ref); -void cl_2queue_disown(const struct lu_env *env, struct cl_io *io, - struct cl_2queue *queue); -void cl_2queue_assume(const struct lu_env *env, struct cl_io *io, - struct cl_2queue *queue); -void cl_2queue_discard(const struct lu_env *env, struct cl_io *io, - struct cl_2queue *queue); -void cl_2queue_fini(const struct lu_env *env, struct cl_2queue *queue); + struct cl_io *io, struct cl_page_list *plist); +void cl_page_list_fini (const struct lu_env *env, struct cl_page_list *plist); + +void cl_2queue_init (struct cl_2queue *queue); +void cl_2queue_add (struct cl_2queue *queue, struct cl_page *page); +void cl_2queue_disown (const struct lu_env *env, + struct cl_io *io, struct cl_2queue *queue); +void cl_2queue_assume (const struct lu_env *env, + struct cl_io *io, struct cl_2queue *queue); +void cl_2queue_discard (const struct lu_env *env, + struct cl_io *io, struct cl_2queue *queue); +void cl_2queue_fini (const struct lu_env *env, struct cl_2queue *queue); void cl_2queue_init_page(struct cl_2queue *queue, struct cl_page *page); /** @} cl_page_list */ diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 8794e7b..2a83264 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1877,7 +1877,7 @@ int ll_io_zero_page(struct inode *inode, pgoff_t index, pgoff_t offset, anchor = &vvp_env_info(env)->vti_anchor; cl_sync_io_init(anchor, 1); clpage->cp_sync_io = anchor; - cl_2queue_add(queue, clpage, true); + cl_2queue_add(queue, clpage); rc = cl_io_submit_rw(env, io, CRT_WRITE, queue); if (rc) GOTO(queuefini1, rc); diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 18981bb..958d848 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -248,7 +248,7 @@ static int ll_read_ahead_page(const struct lu_env *env, struct cl_io *io, vpg->vpg_defer_uptodate = 1; vpg->vpg_ra_used = 0; } - cl_page_list_add(queue, page, true); + cl_page_list_add(queue, page); } else { /* skip completed pages */ cl_page_unassume(env, io, page); @@ -1658,7 +1658,7 @@ int ll_io_read_page(const struct lu_env *env, struct cl_io *io, cl_sync_io_init(anchor, 1); page->cp_sync_io = anchor; - cl_2queue_add(queue, page, true); + cl_2queue_add(queue, page); } io_start_index = cl_index(io->ci_obj, io->u.ci_rw.crw_pos); diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index 5b7417d..39becc1 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -368,10 +368,7 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, */ page->cp_inode = inode; } - /* We keep the refcount from cl_page_find, so we don't need - * another one here - */ - cl_2queue_add(queue, page, false); + cl_2queue_add(queue, page); /* * Set page clip to tell transfer formation engine * that page has to be sent even if it is beyond KMS. @@ -380,6 +377,8 @@ ll_direct_rw_pages(const struct lu_env *env, struct cl_io *io, size_t size, cl_page_clip(env, page, 0, size); ++io_pages; + /* drop the reference count for cl_page_find */ + cl_page_put(env, page); offset += page_size; size -= page_size; } @@ -875,7 +874,7 @@ static int ll_write_end(struct file *file, struct address_space *mapping, lcc->lcc_page = NULL; /* page will be queued */ /* Add it into write queue */ - cl_page_list_add(plist, page, true); + cl_page_list_add(plist, page); if (plist->pl_nr == 1) /* first page */ vio->u.readwrite.vui_from = from; else diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index ac0e79b..d3ac0da 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -1500,7 +1500,7 @@ static int vvp_io_fault_start(const struct lu_env *env, cl_page_assume(env, io, page); cl_page_list_init(plist); - cl_page_list_add(plist, page, true); + cl_page_list_add(plist, page); /* size fixup */ if (last_index == vvp_index(vpg)) @@ -1520,7 +1520,7 @@ static int vvp_io_fault_start(const struct lu_env *env, if (result >= 0) { io->ci_noquota = 1; cl_page_own(env, io, page); - cl_page_list_add(plist, page, true); + cl_page_list_add(plist, page); lu_ref_add(&page->cp_reference, "cl_io", io); result = cl_io_commit_async(env, io, diff --git a/lustre/llite/vvp_page.c b/lustre/llite/vvp_page.c index be61460..529244f 100644 --- a/lustre/llite/vvp_page.c +++ b/lustre/llite/vvp_page.c @@ -477,18 +477,18 @@ int vvp_page_init(const struct lu_env *env, struct cl_object *obj, CLOBINVRNT(env, obj, vvp_object_invariant(obj)); vpg->vpg_page = vmpage; + get_page(vmpage); - if (page->cp_type == CPT_TRANSIENT) { - cl_page_slice_add(page, &vpg->vpg_cl, obj, - &vvp_transient_page_ops); - } else { - get_page(vmpage); + if (page->cp_type == CPT_CACHEABLE) { /* in cache, decref in vvp_page_delete */ atomic_inc(&page->cp_ref); SetPagePrivate(vmpage); vmpage->private = (unsigned long)page; cl_page_slice_add(page, &vpg->vpg_cl, obj, &vvp_page_ops); + } else { + cl_page_slice_add(page, &vpg->vpg_cl, obj, + &vvp_transient_page_ops); } return 0; } diff --git a/lustre/obdclass/cl_io.c b/lustre/obdclass/cl_io.c index dc78aba..fbc7825 100644 --- a/lustre/obdclass/cl_io.c +++ b/lustre/obdclass/cl_io.c @@ -832,8 +832,7 @@ EXPORT_SYMBOL(cl_page_list_init); /** * Adds a page to a page list. */ -void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page, - bool get_ref) +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 @@ -844,8 +843,7 @@ void cl_page_list_add(struct cl_page_list *plist, struct cl_page *page, list_add_tail(&page->cp_batch, &plist->pl_pages); ++plist->pl_nr; lu_ref_add_at(&page->cp_reference, &page->cp_queue_ref, "queue", plist); - if (get_ref) - cl_page_get(page); + cl_page_get(page); EXIT; } EXPORT_SYMBOL(cl_page_list_add); @@ -1022,9 +1020,11 @@ EXPORT_SYMBOL(cl_2queue_init); /** * Add a page to the incoming page list of 2-queue. */ -void cl_2queue_add(struct cl_2queue *queue, struct cl_page *page, bool get_ref) +void cl_2queue_add(struct cl_2queue *queue, struct cl_page *page) { - cl_page_list_add(&queue->c2_qin, page, get_ref); + ENTRY; + cl_page_list_add(&queue->c2_qin, page); + EXIT; } EXPORT_SYMBOL(cl_2queue_add); @@ -1081,10 +1081,10 @@ EXPORT_SYMBOL(cl_2queue_fini); */ void cl_2queue_init_page(struct cl_2queue *queue, struct cl_page *page) { - ENTRY; - cl_2queue_init(queue); - cl_2queue_add(queue, page, true); - EXIT; + ENTRY; + cl_2queue_init(queue); + cl_2queue_add(queue, page); + EXIT; } EXPORT_SYMBOL(cl_2queue_init_page); diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c index bdec008..820cd22 100644 --- a/lustre/obdecho/echo_client.c +++ b/lustre/obdecho/echo_client.c @@ -1330,7 +1330,7 @@ static void echo_commit_callback(const struct lu_env *env, struct cl_io *io, struct page *vmpage = pvec->pages[i]; struct cl_page *page = (struct cl_page *)vmpage->private; - cl_page_list_add(&queue->c2_qout, page, true); + cl_page_list_add(&queue->c2_qout, page); } } @@ -1393,7 +1393,7 @@ static int cl_echo_object_brw(struct echo_object *eco, int rw, u64 offset, break; } - cl_2queue_add(queue, clp, true); + cl_2queue_add(queue, clp); /* * drop the reference count for cl_page_find, so that the page -- 1.8.3.1