From f579b6f96a5ddf7c812d4cc307897854d8bba92e Mon Sep 17 00:00:00 2001 From: Xu Yu Date: Mon, 6 Apr 2020 01:24:14 +0800 Subject: [PATCH] alinux: kidled: make kidled_inc_page_age return latest page age fix #26416752 The idle page age shown in idle_page_stats is one scan period behind the theoretical idle age. The cause is that kidled_inc_page_age returned the ancient value, instead of the latest value, which leads to not accounting in corresponding memcg. This makes kidled_inc_page_age return the increased age of the page, i.e., the latest page age, when KIDLED_AGE_NOT_IN_PAGE_FLAGS is not set. Signed-off-by: Xu Yu Reviewed-by: Xunlei Pang Reviewed-by: Yang Shi --- mm/kidled.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/kidled.c b/mm/kidled.c index db63de493ece..78abc0784890 100644 --- a/mm/kidled.c +++ b/mm/kidled.c @@ -75,9 +75,10 @@ int kidled_inc_page_age(pg_data_t *pgdat, unsigned long pfn) if (age >= KIDLED_AGE_MASK) break; + age++; new = old = page->flags; new &= ~(KIDLED_AGE_MASK << KIDLED_AGE_PGSHIFT); - new |= (((age + 1) & KIDLED_AGE_MASK) << KIDLED_AGE_PGSHIFT); + new |= ((age & KIDLED_AGE_MASK) << KIDLED_AGE_PGSHIFT); } while (unlikely(cmpxchg(&page->flags, old, new) != old)); return age; -- GitLab