Whamcloud - gitweb
LU-10994 lov: remove lov_page 21/47221/6
authorJohn L. Hammond <jhammond@whamcloud.com>
Thu, 5 May 2022 16:14:55 +0000 (11:14 -0500)
committerOleg Drokin <green@whamcloud.com>
Sat, 11 Jun 2022 05:41:42 +0000 (05:41 +0000)
Remove the lov page layer since it does nothing but costs 24 bytes per
page plus pointer chases.

Signed-off-by: John L. Hammond <jhammond@whamcloud.com>
Change-Id: Icd7b4b0041e0fe414a3a4143179f45845177960e
Reviewed-on: https://review.whamcloud.com/47221
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/cl_object.h
lustre/lov/lov_cl_internal.h
lustre/lov/lov_object.c
lustre/lov/lov_page.c

index b37e2e4..8d89a32 100644 (file)
@@ -719,7 +719,7 @@ enum cl_page_type {
 
 #define        CP_STATE_BITS   4
 #define        CP_TYPE_BITS    2
-#define        CP_MAX_LAYER    3
+#define        CP_MAX_LAYER    2
 
 /**
  * Fields are protected by the lock on struct page, except for atomics and
@@ -750,22 +750,21 @@ struct cl_page {
        /** Linkage of pages within group. Pages must be owned */
        struct list_head        cp_batch;
        /** array of slices offset. Immutable after creation. */
-       unsigned char           cp_layer_offset[CP_MAX_LAYER]; /* 24 bits */
+       unsigned char           cp_layer_offset[CP_MAX_LAYER];
        /** current slice index */
-       unsigned char           cp_layer_count:2; /* 26 bits */
+       unsigned char           cp_layer_count:2;
        /**
         * Page state. This field is const to avoid accidental update, it is
         * modified only internally within cl_page.c. Protected by a VM lock.
         */
-       enum cl_page_state       cp_state:CP_STATE_BITS; /* 30 bits */
+       enum cl_page_state       cp_state:CP_STATE_BITS;
         /**
          * Page type. Only CPT_TRANSIENT is used so far. Immutable after
          * creation.
          */
-       enum cl_page_type       cp_type:CP_TYPE_BITS; /* 32 bits */
+       enum cl_page_type       cp_type:CP_TYPE_BITS;
        /* which slab kmem index this memory allocated from */
-       short int               cp_kmem_index; /* 48 bits */
-       unsigned int            cp_unused1:16;  /* 64 bits */
+       short int               cp_kmem_index;
 
        /**
         * Owning IO in cl_page_state::CPS_OWNED state. Sub-page can be owned
index 7e14876..75d7ff3 100644 (file)
 /** \defgroup lov lov
  * Logical object volume layer. This layer implements data striping (raid0).
  *
- * At the lov layer top-entity (object, page, lock, io) is connected to one or
+ * At the lov layer top-entity (object, lock, io) is connected to one or
  * more sub-entities: top-object, representing a file is connected to a set of
  * sub-objects, each representing a stripe, file-level top-lock is connected
- * to a set of per-stripe sub-locks, top-page is connected to a (single)
- * sub-page, and a top-level IO is connected to a set of (potentially
- * concurrent) sub-IO's.
+ * to a set of per-stripe sub-locks, and a top-level IO is connected to a set of
+ * (potentially concurrent) sub-IO's.
  *
- * Sub-object, sub-page, and sub-io have well-defined top-object and top-page
+ * Sub-object and sub-io have well-defined top-object and top-io
  * respectively, while a single sub-lock can be part of multiple top-locks.
  *
  * Reference counting models are different for different types of entities:
@@ -63,9 +62,6 @@
  *     - top-object keeps a reference to its sub-objects, and destroys them
  *       when it is destroyed.
  *
- *     - top-page keeps a reference to its sub-page, and destroys it when it
- *       is destroyed.
- *
  *     - IO's are not reference counted.
  *
  * To implement a connection between top and sub entities, lov layer is split
@@ -438,10 +434,6 @@ struct lov_lock {
        struct lov_lock_sub     lls_sub[0];
 };
 
-struct lov_page {
-       struct cl_page_slice    lps_cl;
-};
-
 /*
  * Bottom half.
  */
@@ -622,6 +614,15 @@ int   lov_io_init_released(const struct lu_env *env, struct cl_object *obj,
 struct lov_io_sub *lov_sub_get(const struct lu_env *env, struct lov_io *lio,
                                int stripe);
 
+enum {
+       CP_LOV_INDEX_EMPTY = -1U,
+};
+
+static inline bool lov_page_is_empty(const struct cl_page *cp)
+{
+       return cp->cp_lov_index == CP_LOV_INDEX_EMPTY;
+}
+
 int   lov_page_init_empty (const struct lu_env *env, struct cl_object *obj,
                           struct cl_page *page, pgoff_t index);
 int   lov_page_init_composite(const struct lu_env *env, struct cl_object *obj,
@@ -636,8 +637,6 @@ struct lu_object *lovsub_object_alloc(const struct lu_env *env,
                                       const struct lu_object_header *hdr,
                                       struct lu_device *dev);
 
-int lov_page_stripe(const struct cl_page *page);
-bool lov_page_is_empty(const struct cl_page *page);
 int lov_lsm_entry(const struct lov_stripe_md *lsm, __u64 offset);
 int lov_io_layout_at(struct lov_io *lio, __u64 offset);
 
@@ -773,12 +772,6 @@ static inline struct lov_lock *cl2lov_lock(const struct cl_lock_slice *slice)
        return container_of(slice, struct lov_lock, lls_cl);
 }
 
-static inline struct lov_page *cl2lov_page(const struct cl_page_slice *slice)
-{
-       LINVRNT(lov_is_object(&slice->cpl_obj->co_lu));
-       return container_of(slice, struct lov_page, lps_cl);
-}
-
 static inline struct lov_io *cl2lov_io(const struct lu_env *env,
                                 const struct cl_io_slice *ios)
 {
index 11b8df7..5ae9e5a 100644 (file)
@@ -115,8 +115,7 @@ static int lov_page_slice_fixup(struct lov_object *lov,
        struct cl_object *o;
 
        if (stripe == NULL)
-               return hdr->coh_page_bufsize - lov->lo_cl.co_slice_off -
-                      cfs_size_round(sizeof(struct lov_page));
+               return hdr->coh_page_bufsize - lov->lo_cl.co_slice_off;
 
        cl_object_for_each(o, stripe)
                o->co_slice_off += hdr->coh_page_bufsize;
@@ -1345,7 +1344,7 @@ static int lov_object_init(const struct lu_env *env, struct lu_object *obj,
        init_rwsem(&lov->lo_type_guard);
        atomic_set(&lov->lo_active_ios, 0);
        init_waitqueue_head(&lov->lo_waitq);
-       cl_object_page_init(lu2cl(obj), sizeof(struct lov_page));
+       cl_object_page_init(lu2cl(obj), 0);
 
        lov->lo_type = LLT_EMPTY;
        if (cconf->u.coc_layout.lb_buf != NULL) {
index 887b304..73d92e5 100644 (file)
@@ -37,6 +37,8 @@
 #define DEBUG_SUBSYSTEM S_LOV
 
 #include "lov_cl_internal.h"
+#include <linux/bug.h>
+#include <linux/compiler.h>
 
 /** \addtogroup lov
  *  @{
  * Lov page operations.
  *
  */
-
-static int lov_comp_page_print(const struct lu_env *env,
-                              const struct cl_page_slice *slice,
-                              void *cookie, lu_printer_t printer)
-{
-       struct lov_page *lp = cl2lov_page(slice);
-
-       return (*printer)(env, cookie,
-                         LUSTRE_LOV_NAME"-page@%p\n", lp);
-}
-
-static const struct cl_page_operations lov_comp_page_ops = {
-       .cpo_print = lov_comp_page_print
-};
-
 int lov_page_init_composite(const struct lu_env *env, struct cl_object *obj,
                            struct cl_page *page, pgoff_t index)
 {
@@ -70,7 +57,6 @@ int lov_page_init_composite(const struct lu_env *env, struct cl_object *obj,
        struct cl_object *subobj;
        struct cl_object *o;
        struct lov_io_sub *sub;
-       struct lov_page *lpg = cl_object_page_slice(obj, page);
        struct lov_layout_raid0 *r0;
        loff_t offset;
        loff_t suboff;
@@ -119,7 +105,7 @@ int lov_page_init_composite(const struct lu_env *env, struct cl_object *obj,
               offset, entry, stripe, suboff);
 
        page->cp_lov_index = lov_comp_index(entry, stripe);
-       cl_page_slice_add(page, &lpg->lps_cl, obj, &lov_comp_page_ops);
+       LASSERT(page->cp_lov_index != CP_LOV_INDEX_EMPTY);
 
        if (!stripe_cached) {
                sub = lov_sub_get(env, lio, page->cp_lov_index);
@@ -147,29 +133,15 @@ int lov_page_init_composite(const struct lu_env *env, struct cl_object *obj,
        RETURN(rc);
 }
 
-static int lov_empty_page_print(const struct lu_env *env,
-                               const struct cl_page_slice *slice,
-                               void *cookie, lu_printer_t printer)
-{
-       struct lov_page *lp = cl2lov_page(slice);
-
-       return (*printer)(env, cookie, LUSTRE_LOV_NAME"-page@%p, empty.\n", lp);
-}
-
-static const struct cl_page_operations lov_empty_page_ops = {
-       .cpo_print = lov_empty_page_print
-};
-
 int lov_page_init_empty(const struct lu_env *env, struct cl_object *obj,
                        struct cl_page *page, pgoff_t index)
 {
-       struct lov_page *lpg = cl_object_page_slice(obj, page);
        void *addr;
 
        ENTRY;
+       BUILD_BUG_ON(!__same_type(page->cp_lov_index, CP_LOV_INDEX_EMPTY));
+       page->cp_lov_index = CP_LOV_INDEX_EMPTY;
 
-       page->cp_lov_index = ~0;
-       cl_page_slice_add(page, &lpg->lps_cl, obj, &lov_empty_page_ops);
        addr = kmap(page->cp_vmpage);
        memset(addr, 0, cl_page_size(obj));
        kunmap(page->cp_vmpage);
@@ -184,14 +156,4 @@ int lov_page_init_foreign(const struct lu_env *env, struct cl_object *obj,
        RETURN(-ENODATA);
 }
 
-bool lov_page_is_empty(const struct cl_page *page)
-{
-       const struct cl_page_slice *slice = cl_page_at(page, &lov_device_type);
-
-       LASSERT(slice != NULL);
-       return slice->cpl_ops == &lov_empty_page_ops;
-}
-
-
 /** @} lov */
-