Skip to content

Commit 0eb2161

Browse files
scsiguybehlendorf
authored andcommitted
Illumos 6171 - dsl_prop_unregister() slows down dataset eviction.
6171 dsl_prop_unregister() slows down dataset eviction. Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Prakash Surya <prakash.surya@delphix.com> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/6171 illumos/illumos-gate@03bad06 Porting notes: - Conflicts - 3558fd7 Prototype/structure update for Linux - 2cf7f52 Linux compat 2.6.39: mount_nodev() - 13fe019 Illumos #3464 - 241b541 Illumos 5959 - clean up per-dataset feature count code - dsl_prop_unregister() preserved until out of tree consumers like Lustre can transition to dsl_prop_unregister_all(). - Fixing 'space or tab at end of line' in include/sys/dsl_dataset.h Ported-by: kernelOfTruth kerneloftruth@gmail.com Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
1 parent 5a28a97 commit 0eb2161

File tree

8 files changed

+186
-190
lines changed

8 files changed

+186
-190
lines changed

include/sys/dsl_dataset.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ typedef struct dsl_dataset {
184184
kmutex_t ds_sendstream_lock;
185185
list_t ds_sendstreams;
186186

187+
/* Protected by our dsl_dir's dd_lock */
188+
list_t ds_prop_cbs;
189+
187190
/*
188191
* For ZFEATURE_FLAG_PER_DATASET features, set if this dataset
189192
* uses this feature.

include/sys/dsl_dir.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ struct dsl_dir {
102102

103103
/* Protected by dd_lock */
104104
kmutex_t dd_lock;
105-
list_t dd_prop_cbs; /* list of dsl_prop_cb_record_t's */
105+
list_t dd_props; /* list of dsl_prop_record_t's */
106106
timestruc_t dd_snap_cmtime; /* last time snapshot namespace changed */
107107
uint64_t dd_origin_txg;
108108

include/sys/dsl_prop.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,17 @@ struct dsl_dir;
4141
/* The callback func may not call into the DMU or DSL! */
4242
typedef void (dsl_prop_changed_cb_t)(void *arg, uint64_t newval);
4343

44+
typedef struct dsl_prop_record {
45+
list_node_t pr_node; /* link on dd_props */
46+
const char *pr_propname;
47+
list_t pr_cbs;
48+
} dsl_prop_record_t;
49+
4450
typedef struct dsl_prop_cb_record {
45-
list_node_t cbr_node; /* link on dd_prop_cbs */
51+
list_node_t cbr_pr_node; /* link on pr_cbs */
52+
list_node_t cbr_ds_node; /* link on ds_prop_cbs */
53+
dsl_prop_record_t *cbr_pr;
4654
struct dsl_dataset *cbr_ds;
47-
const char *cbr_propname;
4855
dsl_prop_changed_cb_t *cbr_func;
4956
void *cbr_arg;
5057
} dsl_prop_cb_record_t;
@@ -54,10 +61,13 @@ typedef struct dsl_props_arg {
5461
zprop_source_t pa_source;
5562
} dsl_props_arg_t;
5663

64+
void dsl_prop_init(dsl_dir_t *dd);
65+
void dsl_prop_fini(dsl_dir_t *dd);
5766
int dsl_prop_register(struct dsl_dataset *ds, const char *propname,
5867
dsl_prop_changed_cb_t *callback, void *cbarg);
5968
int dsl_prop_unregister(struct dsl_dataset *ds, const char *propname,
6069
dsl_prop_changed_cb_t *callback, void *cbarg);
70+
void dsl_prop_unregister_all(struct dsl_dataset *ds, void *cbarg);
6171
void dsl_prop_notify_all(struct dsl_dir *dd);
6272
boolean_t dsl_prop_hascb(struct dsl_dataset *ds);
6373

module/zfs/dmu_objset.c

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -688,40 +688,8 @@ dmu_objset_evict(objset_t *os)
688688
for (t = 0; t < TXG_SIZE; t++)
689689
ASSERT(!dmu_objset_is_dirty(os, t));
690690

691-
if (ds) {
692-
if (!ds->ds_is_snapshot) {
693-
VERIFY0(dsl_prop_unregister(ds,
694-
zfs_prop_to_name(ZFS_PROP_CHECKSUM),
695-
checksum_changed_cb, os));
696-
VERIFY0(dsl_prop_unregister(ds,
697-
zfs_prop_to_name(ZFS_PROP_COMPRESSION),
698-
compression_changed_cb, os));
699-
VERIFY0(dsl_prop_unregister(ds,
700-
zfs_prop_to_name(ZFS_PROP_COPIES),
701-
copies_changed_cb, os));
702-
VERIFY0(dsl_prop_unregister(ds,
703-
zfs_prop_to_name(ZFS_PROP_DEDUP),
704-
dedup_changed_cb, os));
705-
VERIFY0(dsl_prop_unregister(ds,
706-
zfs_prop_to_name(ZFS_PROP_LOGBIAS),
707-
logbias_changed_cb, os));
708-
VERIFY0(dsl_prop_unregister(ds,
709-
zfs_prop_to_name(ZFS_PROP_SYNC),
710-
sync_changed_cb, os));
711-
VERIFY0(dsl_prop_unregister(ds,
712-
zfs_prop_to_name(ZFS_PROP_REDUNDANT_METADATA),
713-
redundant_metadata_changed_cb, os));
714-
VERIFY0(dsl_prop_unregister(ds,
715-
zfs_prop_to_name(ZFS_PROP_RECORDSIZE),
716-
recordsize_changed_cb, os));
717-
}
718-
VERIFY0(dsl_prop_unregister(ds,
719-
zfs_prop_to_name(ZFS_PROP_PRIMARYCACHE),
720-
primary_cache_changed_cb, os));
721-
VERIFY0(dsl_prop_unregister(ds,
722-
zfs_prop_to_name(ZFS_PROP_SECONDARYCACHE),
723-
secondary_cache_changed_cb, os));
724-
}
691+
if (ds)
692+
dsl_prop_unregister_all(ds, os);
725693

726694
if (os->os_sa)
727695
sa_tear_down(os);

module/zfs/dsl_dataset.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ dsl_dataset_evict(void *dbu)
284284

285285
ASSERT(!list_link_active(&ds->ds_synced_link));
286286

287+
list_destroy(&ds->ds_prop_cbs);
287288
mutex_destroy(&ds->ds_lock);
288289
mutex_destroy(&ds->ds_opening_lock);
289290
mutex_destroy(&ds->ds_sendstream_lock);
@@ -433,6 +434,9 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
433434
list_create(&ds->ds_sendstreams, sizeof (dmu_sendarg_t),
434435
offsetof(dmu_sendarg_t, dsa_link));
435436

437+
list_create(&ds->ds_prop_cbs, sizeof (dsl_prop_cb_record_t),
438+
offsetof(dsl_prop_cb_record_t, cbr_ds_node));
439+
436440
if (doi.doi_type == DMU_OTN_ZAP_METADATA) {
437441
spa_feature_t f;
438442

module/zfs/dsl_dir.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,7 @@ dsl_dir_evict(void *dbu)
147147

148148
spa_async_close(dd->dd_pool->dp_spa, dd);
149149

150-
/*
151-
* The props callback list should have been cleaned up by
152-
* objset_evict().
153-
*/
154-
list_destroy(&dd->dd_prop_cbs);
150+
dsl_prop_fini(dd);
155151
mutex_destroy(&dd->dd_lock);
156152
kmem_free(dd, sizeof (dsl_dir_t));
157153
}
@@ -186,9 +182,7 @@ dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
186182
dd->dd_dbuf = dbuf;
187183
dd->dd_pool = dp;
188184
mutex_init(&dd->dd_lock, NULL, MUTEX_DEFAULT, NULL);
189-
190-
list_create(&dd->dd_prop_cbs, sizeof (dsl_prop_cb_record_t),
191-
offsetof(dsl_prop_cb_record_t, cbr_node));
185+
dsl_prop_init(dd);
192186

193187
dsl_dir_snap_cmtime_update(dd);
194188

@@ -246,6 +240,7 @@ dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
246240
if (winner != NULL) {
247241
if (dd->dd_parent)
248242
dsl_dir_rele(dd->dd_parent, dd);
243+
dsl_prop_fini(dd);
249244
mutex_destroy(&dd->dd_lock);
250245
kmem_free(dd, sizeof (dsl_dir_t));
251246
dd = winner;
@@ -273,6 +268,7 @@ dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
273268
errout:
274269
if (dd->dd_parent)
275270
dsl_dir_rele(dd->dd_parent, dd);
271+
dsl_prop_fini(dd);
276272
mutex_destroy(&dd->dd_lock);
277273
kmem_free(dd, sizeof (dsl_dir_t));
278274
dmu_buf_rele(dbuf, tag);

0 commit comments

Comments
 (0)