From f8a6ae902811f38d53596e0a91aa81f8d381e06a Mon Sep 17 00:00:00 2001 From: zhongjiang-ali Date: Sat, 18 Jul 2020 01:35:18 +0800 Subject: [PATCH 2164/2944] alinux: mm: support swap.high for cgroup v1 task #31315199 We backport some patches to support the swap.high in cgroup v2. But we need to use the feature in cgroup v1 for my product. hence, we export the related interface for cgroup v1. Reviewed-by: Xunlei Pang Signed-off-by: zhongjiang-ali --- mm/memcontrol.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e9fdf6a..7252422 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -294,6 +294,10 @@ struct cgroup_subsys_state *vmpressure_to_css(struct vmpressure *vmpr) /* Protects memcg_nr_cache_ids */ static DECLARE_RWSEM(memcg_cache_ids_sem); +static int swap_high_show(struct seq_file *m, void *v); +static ssize_t swap_high_write(struct kernfs_open_file *of, + char *buf, size_t nbytes, loff_t off); +static int swap_events_show(struct seq_file *m, void *v); void memcg_get_cache_ids(void) { @@ -2488,8 +2492,18 @@ static u64 swap_find_max_overage(struct mem_cgroup *memcg) u64 overage, max_overage = 0; do { - overage = calculate_overage(page_counter_read(&memcg->swap), - READ_ONCE(memcg->swap.high)); + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) + overage = calculate_overage(page_counter_read(&memcg->swap), + READ_ONCE(memcg->swap.high)); + else { + unsigned long swap_usage; + + swap_usage = page_counter_read(&memcg->memsw) - + page_counter_read(&memcg->memory); + overage = calculate_overage(swap_usage, + READ_ONCE(memcg->memsw.high)); + } + if (overage) memcg_memory_event(memcg, MEMCG_SWAP_HIGH); max_overage = max(overage, max_overage); @@ -2776,8 +2790,16 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, mem_high = page_counter_read(&memcg->memory) > READ_ONCE(memcg->memory.high); - swap_high = page_counter_read(&memcg->swap) > - READ_ONCE(memcg->swap.high); + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) + swap_high = page_counter_read(&memcg->swap) > + READ_ONCE(memcg->swap.high); + else { + unsigned long swap_usage; + + swap_usage = page_counter_read(&memcg->memsw) - + page_counter_read(&memcg->memory); + swap_high = swap_usage > READ_ONCE(memcg->memsw.high); + } /* Don't bother a random interrupted task */ if (in_interrupt()) { @@ -5821,6 +5843,18 @@ static int memory_events_local_show(struct seq_file *m, void *v) .file_offset = offsetof(struct mem_cgroup, events_local_file), .seq_show = memory_events_local_show, }, + { + .name = "swap.high", + .flags = CFTYPE_NOT_ON_ROOT, + .seq_show = swap_high_show, + .write = swap_high_write, + }, + { + .name = "swap.events", + .flags = CFTYPE_NOT_ON_ROOT, + .file_offset = offsetof(struct mem_cgroup, swap_events_file), + .seq_show = swap_events_show, + }, { }, /* terminate */ }; @@ -6042,6 +6076,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) page_counter_set_high(&memcg->memory, PAGE_COUNTER_MAX); memcg->soft_limit = PAGE_COUNTER_MAX; page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX); + page_counter_set_high(&memcg->memsw, PAGE_COUNTER_MAX); if (parent) { memcg->swappiness = max(mem_cgroup_swappiness(parent), 0); memcg->oom_kill_disable = parent->oom_kill_disable; @@ -6205,7 +6240,10 @@ static void mem_cgroup_css_reset(struct cgroup_subsys_state *css) page_counter_set_wmark_high(&memcg->memory, PAGE_COUNTER_MAX); page_counter_set_high(&memcg->memory, PAGE_COUNTER_MAX); memcg->soft_limit = PAGE_COUNTER_MAX; - page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX); + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) + page_counter_set_high(&memcg->swap, PAGE_COUNTER_MAX); + else + page_counter_set_high(&memcg->memsw, PAGE_COUNTER_MAX); memcg_wb_domain_size_changed(memcg); } @@ -8205,6 +8243,9 @@ static int swap_high_show(struct seq_file *m, void *v) struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); unsigned long high = READ_ONCE(memcg->swap.high); + if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) + high = READ_ONCE(memcg->memsw.high); + if (high == PAGE_COUNTER_MAX) seq_puts(m, "max\n"); else @@ -8225,7 +8266,10 @@ static ssize_t swap_high_write(struct kernfs_open_file *of, if (err) return err; - page_counter_set_high(&memcg->swap, high); + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) + page_counter_set_high(&memcg->swap, high); + else + page_counter_set_high(&memcg->memsw, high); return nbytes; } -- 1.8.3.1