diff options
author | Alexander Motin <mav@FreeBSD.org> | 2018-11-10 01:58:37 +0000 |
---|---|---|
committer | Alexander Motin <mav@FreeBSD.org> | 2018-11-10 01:58:37 +0000 |
commit | 1fcdb5863499dd67516b110f54b5e786a5ed4695 (patch) | |
tree | 922f828b969189738d6db4161d2209a1fd4f73f4 /sys/cddl/contrib/opensolaris | |
parent | cf49cdd5a3fe2bee0a402c4d0bba0121afcde56c (diff) | |
download | src-1fcdb5863499dd67516b110f54b5e786a5ed4695.tar.gz src-1fcdb5863499dd67516b110f54b5e786a5ed4695.zip |
Do not ignore arc_adjust() return value.
This covers scenario when ARC may not shrink as fast as it could:
1. arc_size < arc_c and arc_adjust() does not evict anything, returning
zero to arc_reclaim_thread();
2. arc_available_memory() reports memory pressure, which can not be
satisfied by arc_kmem_reap_now();
3. arc_shrink() reduces arc_c and calls arc_adjust(), return of which is
ignored;
4. even if the last arc_adjust() could not satisfy arc_size < arc_c,
arc_reclaim_thread() will still go to sleep, since the first one
returned zero.
Reviewed by: allanjude, markj, sef
MFC after: 2 weeks
Sponsored by: iXsystems, Inc.
Differential Revision: https://reviews.freebsd.org/D17927
Notes
Notes:
svn path=/head/; revision=340311
Diffstat (limited to 'sys/cddl/contrib/opensolaris')
-rw-r--r-- | sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c index 37aa9bb3dc96..8616e7073bde 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c @@ -4565,7 +4565,7 @@ arc_flush(spa_t *spa, boolean_t retry) (void) arc_flush_state(arc_mfu_ghost, guid, ARC_BUFC_METADATA, retry); } -void +uint64_t arc_shrink(int64_t to_free) { uint64_t asize = aggsum_value(&arc_size); @@ -4593,8 +4593,9 @@ arc_shrink(int64_t to_free) if (asize > arc_c) { DTRACE_PROBE2(arc__shrink_adjust, uint64_t, asize, uint64_t, arc_c); - (void) arc_adjust(); + return (arc_adjust()); } + return (0); } typedef enum free_memory_reason_t { @@ -4917,7 +4918,7 @@ arc_reclaim_thread(void *unused __unused) to_free = MAX(to_free, ptob(needfree)); #endif #endif - arc_shrink(to_free); + evicted += arc_shrink(to_free); } } else if (free_memory < arc_c >> arc_no_grow_shift) { arc_no_grow = B_TRUE; |