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>
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
/* 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;
}
#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;
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
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 };
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;