
Replace HIGH_ASYNC_RATIO_GAP with variable wmark_scale_factor. Add interface to write/read wmark_scale_factor. Signed-off-by: Liu Shixin <liushixin2@huawei.com> --- include/linux/memcontrol.h | 5 +++- mm/memcontrol.c | 55 +++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f6a1494ad9ac..402600729147 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -420,8 +420,11 @@ struct mem_cgroup { #ifdef CONFIG_DYNAMIC_POOL struct dynamic_pool *dpool; #endif - +#ifdef CONFIG_MEMCG_V1_RECLAIM + KABI_USE(1, int wmark_scale_factor) +#else KABI_RESERVE(1) +#endif KABI_RESERVE(2) KABI_RESERVE(3) KABI_RESERVE(4) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ffc75baeacd4..d7a6ffc748f3 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2501,7 +2501,7 @@ static unsigned long async_high_read(struct mem_cgroup *memcg) static unsigned long async_low_read(struct mem_cgroup *memcg) { return async_high_read(memcg) - - READ_ONCE(memcg->memory.max) * HIGH_ASYNC_RATIO_GAP / HIGH_ASYNC_RATIO_BASE; + READ_ONCE(memcg->memory.max) * READ_ONCE(memcg->wmark_scale_factor) / 10000; } static bool is_high_async_reclaim(struct mem_cgroup *memcg) @@ -6094,6 +6094,51 @@ static ssize_t memcg_wmark_ratio_write(struct kernfs_open_file *of, return nbytes; } + +static inline void memcg_wmark_scale_factor_init(struct mem_cgroup *memcg, + struct mem_cgroup *parent) +{ + if (!parent) + memcg->wmark_scale_factor = 50; + else + memcg->wmark_scale_factor = parent->wmark_scale_factor; +} + +static int memcg_wmark_scale_factor_show(struct seq_file *m, void *v) +{ + seq_printf(m, "%d\n", + READ_ONCE(mem_cgroup_from_seq(m)->wmark_scale_factor)); + return 0; +} + +static ssize_t memcg_wmark_scale_factor_write(struct kernfs_open_file *of, + char *buf, size_t nbytes, loff_t off) +{ + struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); + int ret, wmark_scale_factor; + + buf = strstrip(buf); + if (!buf) + return -EINVAL; + + ret = kstrtoint(buf, 0, &wmark_scale_factor); + if (ret) + return ret; + + if (wmark_scale_factor > 1000 || + wmark_scale_factor < 1) + return -EINVAL; + + WRITE_ONCE(memcg->wmark_scale_factor, wmark_scale_factor); + + return nbytes; + +} +#else +static inline void memcg_wmark_scale_factor_init(struct mem_cgroup *memcg, + struct mem_cgroup *parent) +{ +} #endif #ifdef CONFIG_CGROUP_V1_WRITEBACK @@ -6358,6 +6403,12 @@ static struct cftype mem_cgroup_legacy_files[] = { .seq_show = memcg_wmark_ratio_show, .write = memcg_wmark_ratio_write, }, + { + .name = "wmark_scale_factor", + .flags = CFTYPE_NOT_ON_ROOT, + .seq_show = memcg_wmark_scale_factor_show, + .write = memcg_wmark_scale_factor_write, + }, { .name = "reclaim", .write = memory_reclaim, @@ -6679,6 +6730,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) page_counter_init(&memcg->kmem, &parent->kmem); page_counter_init(&memcg->tcpmem, &parent->tcpmem); memcg_swap_device_init(memcg, parent); + memcg_wmark_scale_factor_init(memcg, parent); } else { init_memcg_events(); page_counter_init(&memcg->memory, NULL); @@ -6686,6 +6738,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) page_counter_init(&memcg->kmem, NULL); page_counter_init(&memcg->tcpmem, NULL); memcg_swap_device_init(memcg, NULL); + memcg_wmark_scale_factor_init(memcg, NULL); root_mem_cgroup = memcg; return &memcg->css; -- 2.34.1