Whamcloud - gitweb
LU-17063 osc: remove duplicate info 03/52203/8
authorPatrick Farrell <pfarrell@whamcloud.com>
Sun, 17 Sep 2023 18:07:16 +0000 (14:07 -0400)
committerPatrick Farrell <pfarrell@whamcloud.com>
Sun, 17 Sep 2023 18:07:16 +0000 (14:07 -0400)
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 <pfarrell@whamcloud.com>
Change-Id: If9f2ea5abfe1da6e586072f22c5e0758988b7760

lustre/include/lustre_osc.h
lustre/osc/osc_cache.c
lustre/osc/osc_page.c

index 58df0b1..a0e7ad6 100644 (file)
@@ -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 {
index b73b0e0..202ce7b 100644 (file)
@@ -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;
        }
 
index 54e3780..4e2717a 100644 (file)
@@ -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)