Whamcloud - gitweb
LU-9782 osd-ldiskfs: avoid extra search 45/28145/8
authorAlexey Lyashkov <alexey.lyashkov@seagate.com>
Thu, 20 Jul 2017 09:06:18 +0000 (14:36 +0530)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 24 Oct 2017 07:18:00 +0000 (07:18 +0000)
Extent tree grow greatly durin random IO test with small block size.
osd_is_mapped responsible to large cpu consumption in this case.

|          |
|          |--94.49%-- ldiskfs_es_find_delayed_extent_range
|          |          ldiskfs_fiemap
|          |          osd_is_mapped
|          |          osd_declare_write_commit
|          |
|          |--5.49%-- ldiskfs_fiemap
|          |          osd_is_mapped
|          |          osd_declare_write_commit
|
|--21.80%-- ldiskfs_es_find_delayed_extent_range
|          |
|          |--100.00%-- ldiskfs_fiemap
|          |          osd_is_mapped

let's cache a osd_is_mapped result to avoid extra search in extent
tree,

Seagate-bug-id: MRP-4474
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@seagate.com>
Change-Id: I63d480bfc7c6b7599b80ceeec9447b227a1610c8
Reviewed-on: https://review.whamcloud.com/28145
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@seagate.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/uapi/linux/lustre/lustre_idl.h
lustre/ofd/ofd_io.c
lustre/osd-ldiskfs/osd_internal.h
lustre/osd-ldiskfs/osd_io.c

index f333376..58816a7 100644 (file)
@@ -1274,6 +1274,13 @@ struct hsm_state_set {
                               OBD_BRW_OVER_GRPQUOTA | \
                               OBD_BRW_OVER_PRJQUOTA)
 
                               OBD_BRW_OVER_GRPQUOTA | \
                               OBD_BRW_OVER_PRJQUOTA)
 
+#define OBD_BRW_LOCAL1 0x80000000UL    /*
+                                        * osd-ldiskfs internal,
+                                        * page mapped to real block
+                                        */
+
+#define OBD_BRW_LOCALS (OBD_BRW_LOCAL1)
+
 #define OBD_OBJECT_EOF LUSTRE_EOF
 
 #define OST_MIN_PRECREATE 32
 #define OBD_OBJECT_EOF LUSTRE_EOF
 
 #define OST_MIN_PRECREATE 32
index 5313655..924bffa 100644 (file)
@@ -645,6 +645,7 @@ static int ofd_preprw_write(const struct lu_env *env, struct obd_export *exp,
                /* correct index for local buffers to continue with */
                for (k = 0; k < rc; k++) {
                        lnb[j+k].lnb_flags = rnb[i].rnb_flags;
                /* correct index for local buffers to continue with */
                for (k = 0; k < rc; k++) {
                        lnb[j+k].lnb_flags = rnb[i].rnb_flags;
+                       lnb[j+k].lnb_flags &= ~OBD_BRW_LOCALS;
                        if (!(rnb[i].rnb_flags & OBD_BRW_GRANTED))
                                lnb[j+k].lnb_rc = -ENOSPC;
                }
                        if (!(rnb[i].rnb_flags & OBD_BRW_GRANTED))
                                lnb[j+k].lnb_rc = -ENOSPC;
                }
index 1f4604f..6eb0909 100644 (file)
@@ -95,6 +95,8 @@ extern struct kmem_cache *dynlock_cachep;
 #undef HAVE_PROJECT_QUOTA
 #endif
 
 #undef HAVE_PROJECT_QUOTA
 #endif
 
+#define OBD_BRW_MAPPED OBD_BRW_LOCAL1
+
 struct osd_directory {
         struct iam_container od_container;
         struct iam_descr     od_descr;
 struct osd_directory {
         struct iam_container od_container;
         struct iam_descr     od_descr;
index b8182f0..dab5175 100644 (file)
@@ -1165,7 +1165,9 @@ static int osd_declare_write_commit(const struct lu_env *env,
                    lnb[i - 1].lnb_file_offset + lnb[i - 1].lnb_len)
                        extents++;
 
                    lnb[i - 1].lnb_file_offset + lnb[i - 1].lnb_len)
                        extents++;
 
-               if (!osd_is_mapped(dt, lnb[i].lnb_file_offset, &extent))
+               if (osd_is_mapped(dt, lnb[i].lnb_file_offset, &extent))
+                       lnb[i].lnb_flags |= OBD_BRW_MAPPED;
+               else
                        quota_space += PAGE_SIZE;
 
                /* ignore quota for the whole request if any page is from
                        quota_space += PAGE_SIZE;
 
                /* ignore quota for the whole request if any page is from
@@ -1258,7 +1260,6 @@ static int osd_write_commit(const struct lu_env *env, struct dt_object *dt,
         struct osd_device  *osd = osd_obj2dev(osd_dt_obj(dt));
         loff_t isize;
         int rc = 0, i;
         struct osd_device  *osd = osd_obj2dev(osd_dt_obj(dt));
         loff_t isize;
         int rc = 0, i;
-       struct osd_fextent extent = { 0 };
 
         LASSERT(inode);
 
 
         LASSERT(inode);
 
@@ -1271,7 +1272,7 @@ static int osd_write_commit(const struct lu_env *env, struct dt_object *dt,
 
         for (i = 0; i < npages; i++) {
                if (lnb[i].lnb_rc == -ENOSPC &&
 
         for (i = 0; i < npages; i++) {
                if (lnb[i].lnb_rc == -ENOSPC &&
-                   osd_is_mapped(dt, lnb[i].lnb_file_offset, &extent)) {
+                   (lnb[i].lnb_flags & OBD_BRW_MAPPED)) {
                        /* Allow the write to proceed if overwriting an
                         * existing block */
                        lnb[i].lnb_rc = 0;
                        /* Allow the write to proceed if overwriting an
                         * existing block */
                        lnb[i].lnb_rc = 0;