From 5a9dbb3c4ea66607c3b9164fd6ff50dfb1f7adf3 Mon Sep 17 00:00:00 2001 From: zhong jiang Date: Mon, 25 Mar 2019 23:42:38 +0800 Subject: [PATCH] pagecache: use the correct cache_reclaim_s immediately euler inclusion category: bugfix CVE: NA Bugzilla: 13084 --------------------------- when we set a large number in cache_reclaim_s to background thread to reclaim free pagecache, And then set a minimum number to it. It will trigger an unexpected result. we must drain the time slice of cache_reclaim_s. hence we will wait too long time for that. Signed-off-by: zhong jiang Reviewed-by: Jing Xiangfeng Signed-off-by: Yang Yingliang --- include/linux/swap.h | 2 ++ kernel/sysctl.c | 2 +- mm/vmscan.c | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 2c3e35eb32c2..8f1fcc75e7b3 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -389,6 +389,8 @@ extern int cache_limit_mbytes_sysctl_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); extern int cache_reclaim_enable_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); +extern int cache_reclaim_sysctl_handler(struct ctl_table *table, int write, + void __user *buffer, size_t *length, loff_t *ppos); #endif #ifdef CONFIG_NUMA diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 3b9f46981401..6d69299601be 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1382,7 +1382,7 @@ static struct ctl_table vm_table[] = { .data = &vm_cache_reclaim_s, .maxlen = sizeof(vm_cache_reclaim_s), .mode = 0644, - .proc_handler = proc_dointvec_minmax, + .proc_handler = cache_reclaim_sysctl_handler, .extra1 = &vm_cache_reclaim_s_min, .extra2 = &vm_cache_reclaim_s_max, }, diff --git a/mm/vmscan.c b/mm/vmscan.c index 316a9745bb38..a67af1d8e8ba 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4045,6 +4045,23 @@ int cache_reclaim_enable_handler(struct ctl_table *table, int write, return 0; } + +int cache_reclaim_sysctl_handler(struct ctl_table *table, int write, + void __user *buffer, size_t *length, loff_t *ppos) +{ + int ret, cpu; + + ret = proc_dointvec_minmax(table, write, buffer, length, ppos); + if (ret) + return ret; + + if (write) + mod_delayed_work_on(cpu, system_wq, &shepherd, + round_jiffies_relative( + (unsigned long)vm_cache_reclaim_s * HZ)); + + return ret; +} #endif /* It's optimal to keep kswapds on the same CPUs as their memory, but -- GitLab