The interface is slightly reworked to be more v2 like:

- switch from "-1" to "max" for max value following cgroup-v2 style

While on it also:
- make oom_guarantee (unsigned long) similar to regular cgroup limits,
  as we never set more than PAGE_COUNTER_MAX there anyway
- set oom_guarantee with xchg(), this ensures that update is atomic

https://virtuozzo.atlassian.net/browse/PSBM-154224
Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com>

Feature: mm/oom: OOM guarantee feature
---
v2:
- correct commit message part about "max"
- make oom_guarantee unsigned long
- update oom_guarantee with xchg()
---
 include/linux/memcontrol.h |  2 +-
 mm/memcontrol.c            | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 9c2b8774639e..2aa330cb81b4 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -263,7 +263,7 @@ struct mem_cgroup {
        struct vmpressure vmpressure;
 
        unsigned long overdraft;
-       unsigned long long oom_guarantee;
+       unsigned long oom_guarantee;
 
        /*
         * Should the OOM killer kill all belonging tasks, had it kill one?
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index fcc4b24ba330..1722a49855ac 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5239,6 +5239,14 @@ static u64 mem_cgroup_oom_guarantee_read(struct 
cgroup_subsys_state *css,
        return mem_cgroup_from_css(css)->oom_guarantee << PAGE_SHIFT;
 }
 
+static int seq_puts_memcg_tunable(struct seq_file *m, unsigned long value);
+
+static int memory_oom_guarantee_show(struct seq_file *m, void *v)
+{
+       return seq_puts_memcg_tunable(m,
+               READ_ONCE(mem_cgroup_from_seq(m)->oom_guarantee));
+}
+
 static ssize_t mem_cgroup_oom_guarantee_write(struct kernfs_open_file *kops,
                                        char *buffer, size_t nbytes, loff_t off)
 {
@@ -5255,6 +5263,22 @@ static ssize_t mem_cgroup_oom_guarantee_write(struct 
kernfs_open_file *kops,
        return nbytes;
 }
 
+static ssize_t memory_oom_guarantee_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));
+       unsigned long oom_guarantee;
+       int err;
+
+       buf = strstrip(buf);
+       err = page_counter_memparse(buf, "max", &oom_guarantee);
+       if (err)
+               return err;
+
+       xchg(&memcg->oom_guarantee, oom_guarantee);
+       return nbytes;
+}
+
 #ifdef CONFIG_CLEANCACHE
 static u64 mem_cgroup_disable_cleancache_read(struct cgroup_subsys_state *css,
                                              struct cftype *cft)
@@ -7629,6 +7653,12 @@ static struct cftype memory_files[] = {
                .flags = CFTYPE_NS_DELEGATABLE,
                .write = memory_reclaim,
        },
+       {
+               .name = "oom_guarantee",
+               .flags = CFTYPE_NOT_ON_ROOT,
+               .seq_show = memory_oom_guarantee_show,
+               .write = memory_oom_guarantee_write,
+       },
        { }     /* terminate */
 };
 
-- 
2.43.0

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to