From a7c7fee2a604e0801455cd9d16ab60f57e7db49f Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Sun, 17 Sep 2023 14:07:16 -0400 Subject: [PATCH] LU-17063 osc: remove duplicate info The from/to in osc_page replicate the info provided by oap_page_off and oap_count in osc_async_page, so just use those. Getting the full benefit of this requires removing the padding, but with that done, this gets us a full 8 bytes of size reduction in osc_page (and therefore cl_page) size. Signed-off-by: Patrick Farrell Change-Id: If9f2ea5abfe1da6e586072f22c5e0758988b7760 --- lustre/include/lustre_osc.h | 34 +++++++++------------------------- lustre/osc/osc_cache.c | 7 +++---- lustre/osc/osc_page.c | 10 ++-------- 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/lustre/include/lustre_osc.h b/lustre/include/lustre_osc.h index 58df0b1..a0e7ad6 100644 --- a/lustre/include/lustre_osc.h +++ b/lustre/include/lustre_osc.h @@ -66,16 +66,7 @@ enum oap_async_flags { OAP_ASYNC_BITS = 4 }; -/* add explicit padding to keep fields aligned despite "packed", - * which is needed to pack with following field in osc_page */ -#define OAP_PAD_BITS (16 - OBD_BRW_WRITE - OAP_ASYNC_BITS) struct osc_async_page { - unsigned short oap_page_off /* :PAGE_SHIFT */; - unsigned int oap_cmd:OBD_BRW_WRITE; - enum oap_async_flags oap_async_flags:OAP_ASYNC_BITS; - unsigned int oap_padding1:OAP_PAD_BITS; /* unused */ - unsigned int oap_padding2; /* unused */ - struct list_head oap_pending_item; struct list_head oap_rpc_item; @@ -85,6 +76,10 @@ struct osc_async_page { struct osc_object *oap_obj; struct brw_page oap_brw_page; + + unsigned int oap_page_off:PAGE_SHIFT, + oap_cmd:OBD_BRW_WRITE, + oap_async_flags:OAP_ASYNC_BITS; } __attribute__((packed)); #define oap_page oap_brw_page.bp_page @@ -497,24 +492,17 @@ static inline int osc_lock_is_lockless(const struct osc_lock *ols) struct osc_page { struct cl_page_slice ops_cl; /** - * Page queues used by osc to detect when RPC can be formed. - */ - struct osc_async_page ops_oap; - /** - * An offset within page from which next transfer starts. This is used - * by cl_page_clip() to submit partial page transfers. + * lru page list. See osc_lru_{del|use}() in osc_page.c for usage. */ - unsigned int ops_from:PAGE_SHIFT, + struct list_head ops_lru; /** - * An offset within page at which next transfer ends(inclusive). - * - * \see osc_page::ops_from. + * Page queues used by osc to detect when RPC can be formed. */ - ops_to:PAGE_SHIFT, + struct osc_async_page ops_oap; /** * Boolean, true iff page is under transfer. Used for sanity checking. */ - ops_transfer_pinned:1, + unsigned char ops_transfer_pinned:1, /** * in LRU? */ @@ -527,10 +515,6 @@ struct osc_page { * If the page is in osc_object::oo_tree. */ ops_intree:1; - /** - * lru page list. See osc_lru_{del|use}() in osc_page.c for usage. - */ - struct list_head ops_lru; }; struct osc_brw_async_args { diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index b73b0e0..202ce7b 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -2242,6 +2242,8 @@ int osc_prep_async_page(struct osc_object *osc, struct osc_page *ops, oap->oap_obj = osc; oap->oap_page = page->cp_vmpage; oap->oap_obj_off = offset; + oap->oap_page_off = 0; + oap->oap_count = PAGE_SIZE; LASSERT(!(offset & ~PAGE_MASK)); /* Count of transient (direct i/o) pages is always stable by the time @@ -2326,8 +2328,6 @@ int osc_queue_async_io(const struct lu_env *env, struct cl_io *io, } oap->oap_cmd = cmd; - oap->oap_page_off = ops->ops_from; - oap->oap_count = ops->ops_to - ops->ops_from + 1; /* No need to hold a lock here, * since this page is not in any list yet. */ oap->oap_async_flags = 0; @@ -2587,8 +2587,7 @@ int osc_queue_sync_pages(const struct lu_env *env, struct cl_io *io, ++page_count; mppr <<= (page_count > mppr); - if (unlikely(opg->ops_from > 0 || - opg->ops_to < PAGE_SIZE - 1)) + if (unlikely(oap->oap_count < PAGE_SIZE)) can_merge = false; } diff --git a/lustre/osc/osc_page.c b/lustre/osc/osc_page.c index 54e3780..4e2717a 100644 --- a/lustre/osc/osc_page.c +++ b/lustre/osc/osc_page.c @@ -207,9 +207,8 @@ static void osc_page_clip(const struct lu_env *env, CDEBUG(D_CACHE, "from %d, to %d\n", from, to); - opg->ops_from = from; - /* argument @to is exclusive, but @ops_to is inclusive */ - opg->ops_to = to - 1; + oap->oap_page_off = from; + oap->oap_count = to - from; oap->oap_async_flags |= ASYNC_COUNT_STABLE; } @@ -249,9 +248,6 @@ int osc_page_init(const struct lu_env *env, struct cl_io *io, struct osc_io *oio = osc_env_io(env); int result; - opg->ops_from = 0; - opg->ops_to = PAGE_SIZE - 1; - INIT_LIST_HEAD(&opg->ops_lru); result = osc_prep_async_page(osc, opg, cl_page, index << PAGE_SHIFT); @@ -311,8 +307,6 @@ void osc_page_submit(const struct lu_env *env, struct osc_page *opg, LASSERT(oap->oap_async_flags & ASYNC_COUNT_STABLE); oap->oap_cmd = crt == CRT_WRITE ? OBD_BRW_WRITE : OBD_BRW_READ; - oap->oap_page_off = opg->ops_from; - oap->oap_count = opg->ops_to - opg->ops_from + 1; oap->oap_brw_flags = OBD_BRW_SYNC | brw_flags; if (oio->oi_cap_sys_resource) -- 1.8.3.1