struct lu_context_key osd_key;
+static int osd_txg_sync_delay_us = -1;
+
/* Slab for OSD object allocation */
struct kmem_cache *osd_object_kmem;
osd_unlinked_list_emptify(env, osd, &unlinked, true);
- if (sync)
- txg_wait_synced(dmu_objset_pool(osd->od_os), txg);
+ if (sync) {
+ if (osd_txg_sync_delay_us < 0)
+ txg_wait_synced(dmu_objset_pool(osd->od_os), txg);
+ else
+ udelay(osd_txg_sync_delay_us);
+ }
RETURN(rc);
}
module_param(osd_oi_count, int, 0444);
MODULE_PARM_DESC(osd_oi_count, "Number of Object Index containers to be created, it's only valid for new filesystem.");
+module_param(osd_txg_sync_delay_us, int, 0644);
+MODULE_PARM_DESC(osd_txg_sync_delay_us,
+ "When zero or larger delay N usec instead of doing TXG sync");
+
MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
MODULE_DESCRIPTION("Lustre Object Storage Device ("LUSTRE_OSD_ZFS_NAME")");
MODULE_VERSION(LUSTRE_VERSION_STRING);
#include <sys/txg.h>
char *osd_obj_tag = "osd_object";
+static int osd_object_sync_delay_us = -1;
static struct dt_object_operations osd_obj_ops;
static struct lu_object_operations osd_lu_obj_ops;
* support ZIL. If the object tracked the txg that it was last
* modified in, it could pass that txg here instead of "0". Maybe
* the changes are already committed, so no wait is needed at all? */
- if (!osd->od_dt_dev.dd_rdonly)
- txg_wait_synced(dmu_objset_pool(osd->od_os), 0ULL);
+ if (!osd->od_dt_dev.dd_rdonly) {
+ if (osd_object_sync_delay_us < 0)
+ txg_wait_synced(dmu_objset_pool(osd->od_os), 0ULL);
+ else
+ udelay(osd_object_sync_delay_us);
+ }
RETURN(0);
}
.do_attr_get = osd_otable_it_attr_get,
.do_index_try = osd_index_try,
};
+
+module_param(osd_object_sync_delay_us, int, 0644);
+MODULE_PARM_DESC(osd_object_sync_delay_us,
+ "If zero or larger delay N usec instead of doing object sync");