Re: [PATCH v3 3/3] mm: don't miss the last page because of round-off error
From: Roman Gushchin <hidden>
Date: 2018-08-27 23:25:46
Also in:
lkml
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?
Sure. This was copy-pasted to match the existing DIV_ROUND_UP (probably, not the best idea). So let me fix them both in a separate patch. Thanks!