Re: [PATCH v3 3/3] mm: don't miss the last page because of round-off error
From: Roman Gushchin <hidden>
Date: 2018-08-29 21:34:15
Also in:
lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Roman Gushchin <hidden>
Date: 2018-08-29 21:34:15
Also in:
lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
On Mon, Aug 27, 2018 at 02:04:32PM -0700, Andrew Morton wrote:
On Mon, 27 Aug 2018 09:26:21 -0700 Roman Gushchin [off-list ref] wrote:quoted
I've noticed, that dying memory cgroups are often pinned in memory by a single pagecache page. Even under moderate memory pressure they sometimes stayed in such state for a long time. That looked strange. My investigation showed that the problem is caused by applying the LRU pressure balancing math: scan = div64_u64(scan * fraction[lru], denominator), where denominator = fraction[anon] + fraction[file] + 1. Because fraction[lru] is always less than denominator, if the initial scan size is 1, the result is always 0. This means the last page is not scanned and has no chances to be reclaimed. Fix this by rounding up the result of the division. In practice this change significantly improves the speed of dying cgroups reclaim. ...--- a/include/linux/math64.h +++ b/include/linux/math64.h@@ -281,4 +281,6 @@ static inline u64 mul_u64_u32_div(u64 a, u32 mul, u32 divisor) } #endif /* mul_u64_u32_div */ +#define DIV64_U64_ROUND_UP(ll, d) div64_u64((ll) + (d) - 1, (d))This macro references arg `d' more than once. That can cause problems if the passed expression has side-effects and is poor practice. Can we please redo this with a temporary?
Argh, the original DIV_ROUND_UP can't be fixed this way, as it's used in array's size declarations. So, below is the patch for the new DIV64_U64_ROUND_UP macro only. Thanks! --