Apply arc_shrink_shift to ARC above arc_c_min
It makes sense to free memory in smaller chunks when approaching arc_c_min to let other kernel subsystems to free more, since after that point we can't free anything. This also matches behavior on Linux, where to shrinker reported only the size above arc_c_min. Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Closes #13794
This commit is contained in:
parent
15b64fbc94
commit
b6ebf270eb
|
@ -223,7 +223,10 @@ arc_lowmem(void *arg __unused, int howto __unused)
|
||||||
arc_warm = B_TRUE;
|
arc_warm = B_TRUE;
|
||||||
arc_growtime = gethrtime() + SEC2NSEC(arc_grow_retry);
|
arc_growtime = gethrtime() + SEC2NSEC(arc_grow_retry);
|
||||||
free_memory = arc_available_memory();
|
free_memory = arc_available_memory();
|
||||||
to_free = (arc_c >> arc_shrink_shift) - MIN(free_memory, 0);
|
int64_t can_free = arc_c - arc_c_min;
|
||||||
|
if (can_free <= 0)
|
||||||
|
return;
|
||||||
|
to_free = (can_free >> arc_shrink_shift) - MIN(free_memory, 0);
|
||||||
DTRACE_PROBE2(arc__needfree, int64_t, free_memory, int64_t, to_free);
|
DTRACE_PROBE2(arc__needfree, int64_t, free_memory, int64_t, to_free);
|
||||||
arc_reduce_target_size(to_free);
|
arc_reduce_target_size(to_free);
|
||||||
|
|
||||||
|
|
|
@ -5036,9 +5036,10 @@ arc_reap_cb(void *arg, zthr_t *zthr)
|
||||||
*/
|
*/
|
||||||
free_memory = arc_available_memory();
|
free_memory = arc_available_memory();
|
||||||
|
|
||||||
int64_t to_free =
|
int64_t can_free = arc_c - arc_c_min;
|
||||||
(arc_c >> arc_shrink_shift) - free_memory;
|
if (can_free > 0) {
|
||||||
if (to_free > 0) {
|
int64_t to_free = (can_free >> arc_shrink_shift) - free_memory;
|
||||||
|
if (to_free > 0)
|
||||||
arc_reduce_target_size(to_free);
|
arc_reduce_target_size(to_free);
|
||||||
}
|
}
|
||||||
spl_fstrans_unmark(cookie);
|
spl_fstrans_unmark(cookie);
|
||||||
|
|
Loading…
Reference in New Issue