From b91b37989d2f8c831986b6e9636ef8b475ad392b Mon Sep 17 00:00:00 2001 From: zhongjiang-ali Date: Thu, 12 Nov 2020 11:43:40 +0800 Subject: [PATCH 2211/2944] alinux: mm: make the swap throttle more accurate fix #31384714 Since commit ea64127123e4 ("alios: mm: support swap.high for cgroup v1") is introduced, we use memsw usage subtract memory usage as the swap usage. but the result can be not correct because their update is not synchronous. The patch compares memsw and memcg usage to make sure it will not be throttled when the swap is not really used. Reviewed-by: Xunlei Pang Signed-off-by: zhongjiang-ali --- mm/memcontrol.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c57f838..180d1fb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2457,6 +2457,21 @@ static void high_work_func(struct work_struct *work) #define MEMCG_DELAY_PRECISION_SHIFT 20 #define MEMCG_DELAY_SCALING_SHIFT 14 +static inline unsigned long mem_cgroup_v1_swap_usage(struct mem_cgroup *memcg) +{ + unsigned long swap_usage = 0; + + if (do_memsw_account()) { + unsigned long memsw_usage = page_counter_read(&memcg->memsw); + unsigned long memcg_usage = page_counter_read(&memcg->memory); + + if (memsw_usage > memcg_usage) + swap_usage = memsw_usage - memcg_usage; + } + + return swap_usage; +} + static u64 calculate_overage(unsigned long usage, unsigned long high) { u64 overage; @@ -2499,8 +2514,7 @@ static u64 swap_find_max_overage(struct mem_cgroup *memcg) else { unsigned long swap_usage; - swap_usage = page_counter_read(&memcg->memsw) - - page_counter_read(&memcg->memory); + swap_usage = mem_cgroup_v1_swap_usage(memcg); overage = calculate_overage(swap_usage, READ_ONCE(memcg->memsw.high)); } @@ -2798,8 +2812,7 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, else { unsigned long swap_usage; - swap_usage = page_counter_read(&memcg->memsw) - - page_counter_read(&memcg->memory); + swap_usage = mem_cgroup_v1_swap_usage(memcg); swap_high = swap_usage > READ_ONCE(memcg->memsw.high); } -- 1.8.3.1