Skip to content
Permalink
Browse files

Fix comparison signedness in arc_is_overflowing()

When ARC size is very small, aggsum_lower_bound(&arc_size) may return
negative values, that due to unsigned comparison caused delays, waiting
for arc_adjust() to "fix" it by calling aggsum_value(&arc_size).  Use
of signed comparison there fixes the problem.

Reviewed-by: Matt Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Closes #8873
  • Loading branch information...
amotin authored and behlendorf committed Jun 10, 2019
1 parent 581c77e commit 72888812b01edb90f2f5bf6a4c7bcd9aafda951c
Showing with 2 additions and 2 deletions.
  1. +2 −2 module/zfs/arc.c
@@ -5480,7 +5480,7 @@ static boolean_t
arc_is_overflowing(void)
{
/* Always allow at least one block of overflow */
uint64_t overflow = MAX(SPA_MAXBLOCKSIZE,
int64_t overflow = MAX(SPA_MAXBLOCKSIZE,
arc_c >> zfs_arc_overflow_shift);

/*
@@ -5492,7 +5492,7 @@ arc_is_overflowing(void)
* in the ARC. In practice, that's in the tens of MB, which is low
* enough to be safe.
*/
return (aggsum_lower_bound(&arc_size) >= arc_c + overflow);
return (aggsum_lower_bound(&arc_size) >= (int64_t)arc_c + overflow);
}

static abd_t *

0 comments on commit 7288881

Please sign in to comment.
You can’t perform that action at this time.