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.55~40 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F45%2F28145%2F8;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, Seagate-bug-id: MRP-4474 Signed-off-by: Alexey Lyashkov Change-Id: I63d480bfc7c6b7599b80ceeec9447b227a1610c8 Reviewed-on: https://review.whamcloud.com/28145 Reviewed-by: Fan Yong Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andrew Perepechko Reviewed-by: Oleg Drokin --- diff --git a/lustre/include/uapi/linux/lustre/lustre_idl.h b/lustre/include/uapi/linux/lustre/lustre_idl.h index f333376..58816a7 100644 --- a/lustre/include/uapi/linux/lustre/lustre_idl.h +++ b/lustre/include/uapi/linux/lustre/lustre_idl.h @@ -1274,6 +1274,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 b8182f0..dab5175 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -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++; - 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 @@ -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_fextent extent = { 0 }; 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 && - 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;