From 30fffb90218fd44466288d3a3d359271504c4f76 Mon Sep 17 00:00:00 2001 From: Debabrata Banerjee Date: Wed, 15 Mar 2017 18:39:40 -0400 Subject: [PATCH] Make arc_need_free updates atomic Ensures proper accounting of bytes we requested to free AKAMAI: zfs: CR 3695072 Reviewed-by: Tim Chase Reviewed-by: Richard Yao Reviewed-by: Brian Behlendorf Signed-off-by: Debabrata Banerjee Issue #6035 --- module/zfs/arc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/module/zfs/arc.c b/module/zfs/arc.c index 4e5c9eaf5..fa69e1ea4 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -4220,7 +4220,7 @@ arc_reclaim_thread(void) while (!arc_reclaim_thread_exit) { int64_t to_free; uint64_t evicted = 0; - + uint64_t need_free = arc_need_free; arc_tuning_update(); /* @@ -4270,7 +4270,7 @@ arc_reclaim_thread(void) to_free = (arc_c >> arc_shrink_shift) - free_memory; if (to_free > 0) { #ifdef _KERNEL - to_free = MAX(to_free, arc_need_free); + to_free = MAX(to_free, need_free); #endif arc_shrink(to_free); } @@ -4295,11 +4295,12 @@ arc_reclaim_thread(void) /* * We're either no longer overflowing, or we * can't evict anything more, so we should wake - * up any threads before we go to sleep and clear - * arc_need_free since nothing more can be done. + * up any threads before we go to sleep and remove + * the bytes we were working on from arc_need_free + * since nothing more will be done here. */ cv_broadcast(&arc_reclaim_waiters_cv); - arc_need_free = 0; + ARCSTAT_INCR(arcstat_need_free, -need_free); /* * Block until signaled, or after one second (we @@ -4452,7 +4453,7 @@ __arc_shrinker_func(struct shrinker *shrink, struct shrink_control *sc) ARCSTAT_BUMP(arcstat_memory_indirect_count); } else { arc_no_grow = B_TRUE; - arc_need_free = ptob(sc->nr_to_scan); + ARCSTAT_INCR(arcstat_need_free, ptob(sc->nr_to_scan)); ARCSTAT_BUMP(arcstat_memory_direct_count); }