From b893a7d561349451ba0f740a097648c0e55401a5 Mon Sep 17 00:00:00 2001 From: Xu Yu Date: Wed, 22 Jul 2020 18:33:00 +0800 Subject: [PATCH 1887/2944] alinux: mm: completely disable swapout with negative swappiness fix #29564148 Global swapout can happen even with swappiness set to 0. In some scenario, we do want OOM instead of unexpected global swapout. This extends value range of vm_swappiness, and disables swapout completely by setting swappiness to -1. Signed-off-by: Xu Yu Reviewed-by: Xunlei Pang --- kernel/sysctl.c | 2 +- mm/memcontrol.c | 14 +++++++------- mm/vmscan.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index df81419..2bf58ad 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1392,7 +1392,7 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .maxlen = sizeof(vm_swappiness), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = &zero, + .extra1 = &neg_one, .extra2 = &one_hundred, }, #ifdef CONFIG_HUGETLB_PAGE diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 4817580..1f29004 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1567,7 +1567,7 @@ unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg) unsigned long max; max = memcg->memory.max; - if (mem_cgroup_swappiness(memcg)) { + if (mem_cgroup_swappiness(memcg) > 0) { unsigned long memsw_max; unsigned long swap_max; @@ -4236,7 +4236,7 @@ static int memcg_exstat_show(struct seq_file *m, void *v) return 0; } -static u64 mem_cgroup_swappiness_read(struct cgroup_subsys_state *css, +static s64 mem_cgroup_swappiness_read(struct cgroup_subsys_state *css, struct cftype *cft) { struct mem_cgroup *memcg = mem_cgroup_from_css(css); @@ -4245,11 +4245,11 @@ static u64 mem_cgroup_swappiness_read(struct cgroup_subsys_state *css, } static int mem_cgroup_swappiness_write(struct cgroup_subsys_state *css, - struct cftype *cft, u64 val) + struct cftype *cft, s64 val) { struct mem_cgroup *memcg = mem_cgroup_from_css(css); - if (val > 100) + if (val > 100 || val < -1 || (css->parent && val < 0)) return -EINVAL; if (css->parent) @@ -5619,8 +5619,8 @@ static int memory_events_local_show(struct seq_file *m, void *v) }, { .name = "swappiness", - .read_u64 = mem_cgroup_swappiness_read, - .write_u64 = mem_cgroup_swappiness_write, + .read_s64 = mem_cgroup_swappiness_read, + .write_s64 = mem_cgroup_swappiness_write, }, { .name = "priority", @@ -5967,7 +5967,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void) memcg->high = PAGE_COUNTER_MAX; memcg->soft_limit = PAGE_COUNTER_MAX; if (parent) { - memcg->swappiness = mem_cgroup_swappiness(parent); + memcg->swappiness = max(mem_cgroup_swappiness(parent), 0); memcg->oom_kill_disable = parent->oom_kill_disable; memcg->wmark_ratio = parent->wmark_ratio; /* Default gap is 0.5% max limit */ diff --git a/mm/vmscan.c b/mm/vmscan.c index 2212743..684f004 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2423,7 +2423,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg, struct scan_control *sc, unsigned long *nr, unsigned long *lru_pages) { - int swappiness = mem_cgroup_swappiness(memcg); + int swappiness = max(mem_cgroup_swappiness(memcg), 0); struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat; u64 fraction[2]; u64 denominator = 0; /* gcc */ @@ -2471,7 +2471,7 @@ static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg, * thrashing file LRU becomes infinitely more attractive than * anon pages. Try to detect this based on file LRU size. */ - if (global_reclaim(sc)) { + if (global_reclaim(sc) && vm_swappiness != -1) { unsigned long pgdatfile; unsigned long pgdatfree; int z; -- 1.8.3.1