From e8a2014436147d07442e52f854e197082748fca6 Mon Sep 17 00:00:00 2001 From: Gvozden Neskovic Date: Sat, 3 Dec 2016 00:59:35 +0100 Subject: [PATCH] Cache ddt_get_dedup_dspace() value if there was no ddt changes Save and reuse ddt dspace calculation when there have been no ddt changes. This avoids unnecessary traversal of 168KiB of ddt histograms. Reviewed-by: Brian Behlendorf Signed-off-by: Gvozden Neskovic Closes #5425 --- include/sys/spa_impl.h | 1 + module/zfs/ddt.c | 13 +++++++++++-- module/zfs/spa_misc.c | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/sys/spa_impl.h b/include/sys/spa_impl.h index 88bde98dc..a1bf14eac 100644 --- a/include/sys/spa_impl.h +++ b/include/sys/spa_impl.h @@ -239,6 +239,7 @@ struct spa { uint64_t spa_autoexpand; /* lun expansion on/off */ ddt_t *spa_ddt[ZIO_CHECKSUM_FUNCTIONS]; /* in-core DDTs */ uint64_t spa_ddt_stat_object; /* DDT statistics */ + uint64_t spa_dedup_dspace; /* Cache get_dedup_dspace() */ uint64_t spa_dedup_ditto; /* dedup ditto threshold */ uint64_t spa_dedup_checksum; /* default dedup checksum */ uint64_t spa_dspace; /* dspace in normal class */ diff --git a/module/zfs/ddt.c b/module/zfs/ddt.c index cbec70057..75ab7f5b2 100644 --- a/module/zfs/ddt.c +++ b/module/zfs/ddt.c @@ -529,10 +529,17 @@ ddt_get_dedup_stats(spa_t *spa, ddt_stat_t *dds_total) uint64_t ddt_get_dedup_dspace(spa_t *spa) { - ddt_stat_t dds_total = { 0 }; + ddt_stat_t dds_total; + if (spa->spa_dedup_dspace != ~0ULL) + return (spa->spa_dedup_dspace); + + bzero(&dds_total, sizeof (ddt_stat_t)); + + /* Calculate and cache the stats */ ddt_get_dedup_stats(spa, &dds_total); - return (dds_total.dds_ref_dsize - dds_total.dds_dsize); + spa->spa_dedup_dspace = dds_total.dds_ref_dsize - dds_total.dds_dsize; + return (spa->spa_dedup_dspace); } uint64_t @@ -915,6 +922,7 @@ ddt_load(spa_t *spa) */ bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache, sizeof (ddt->ddt_histogram)); + spa->spa_dedup_dspace = ~0ULL; } return (0); @@ -1182,6 +1190,7 @@ ddt_sync_table(ddt_t *ddt, dmu_tx_t *tx, uint64_t txg) bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache, sizeof (ddt->ddt_histogram)); + spa->spa_dedup_dspace = ~0ULL; } void diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c index 6ec05214e..909002cf5 100644 --- a/module/zfs/spa_misc.c +++ b/module/zfs/spa_misc.c @@ -635,6 +635,9 @@ spa_add(const char *name, nvlist_t *config, const char *altroot) spa->spa_min_ashift = INT_MAX; spa->spa_max_ashift = 0; + /* Reset cached value */ + spa->spa_dedup_dspace = ~0ULL; + /* * As a pool is being created, treat all features as disabled by * setting SPA_FEATURE_DISABLED for all entries in the feature