diff --git a/include/linux/swap.h b/include/linux/swap.h index 2c3e35eb32c221b1a04bcd037ff77dfd81d1a729..8f1fcc75e7b3f04dc16e51a223e5138a2c7f4a4d 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 3b9f4698140107825622c11ebc511b5e60859ae4..6d69299601bef4f0c1d1d2bd857306ed5648eb2f 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 316a9745bb3867a2e8838f06a8c34a5b9dc1687c..a67af1d8e8ba5c400752cf8671caba509aff3672 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