From: Alexey Lyashkov Date: Thu, 20 Jul 2017 09:06:18 +0000 (+0530) Subject: LU-9782 osd-ldiskfs: avoid extra search X-Git-Tag: 2.10.2-RC1~24 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F39%2F29739%2F2;p=fs%2Flustre-release.git LU-9782 osd-ldiskfs: avoid extra search 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, Lustre-change: https://review.whamcloud.com/28145 Lustre-commit: 1eb0573fdeb7ef8ed667974fd30d4d110b8166c9 Seagate-bug-id: MRP-4474 Signed-off-by: Alexey Lyashkov Change-Id: I63d480bfc7c6b7599b80ceeec9447b227a1610c8 Reviewed-by: Fan Yong Reviewed-by: Andrew Perepechko Reviewed-by: Oleg Drokin Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/29739 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andrew Perepechko Reviewed-by: John L. Hammond --- diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 078adcc..2fef45e 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -1260,6 +1260,13 @@ struct hsm_state_set { 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 diff --git a/lustre/ofd/ofd_io.c b/lustre/ofd/ofd_io.c index 5313655..924bffa 100644 --- a/lustre/ofd/ofd_io.c +++ b/lustre/ofd/ofd_io.c @@ -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; + lnb[j+k].lnb_flags &= ~OBD_BRW_LOCALS; if (!(rnb[i].rnb_flags & OBD_BRW_GRANTED)) lnb[j+k].lnb_rc = -ENOSPC; } diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 1f4604f..6eb0909 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -95,6 +95,8 @@ extern struct kmem_cache *dynlock_cachep; #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; diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index c9989b3..aa15199 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1167,7 +1167,9 @@ static int osd_declare_write_commit(const struct lu_env *env, 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 @@ -1260,7 +1262,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_fextent extent = { 0 }; LASSERT(inode); @@ -1273,7 +1274,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 && - 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;