]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mm: memcontrol: remove hierarchy restrictions for swappiness and oom_control
authorJohannes Weiner <hannes@cmpxchg.org>
Thu, 22 May 2014 00:42:49 +0000 (10:42 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 22 May 2014 00:42:49 +0000 (10:42 +1000)
Per-memcg swappiness and oom killing can currently not be tweaked on a
memcg that is part of a hierarchy, but not the root of that hierarchy.
Users have complained that they can't configure this when they turned on
hierarchy mode.  In fact, with hierarchy mode becoming the default, this
restriction disables the tunables entirely.

But there is no good reason for this restriction.  The settings for
swappiness and OOM killing are taken from whatever memcg whose limit
triggered reclaim and OOM invocation, regardless of its position in the
hierarchy tree.

Allow setting swappiness on any group.  The knob on the root memcg already
reads the global VM swappiness, make it writable as well.

Allow disabling the OOM killer on any non-root memcg.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Tejun Heo <tj@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memcontrol.c

index 1e3717681c21f54393075d163505b419297ef5c0..815c892d50818cf837f65451857a0a26522ce8c9 100644 (file)
@@ -5444,22 +5444,14 @@ static int mem_cgroup_swappiness_write(struct cgroup_subsys_state *css,
                                       struct cftype *cft, u64 val)
 {
        struct mem_cgroup *memcg = mem_cgroup_from_css(css);
-       struct mem_cgroup *parent = mem_cgroup_from_css(css_parent(&memcg->css));
 
-       if (val > 100 || !parent)
+       if (val > 100)
                return -EINVAL;
 
-       mutex_lock(&memcg_create_mutex);
-
-       /* If under hierarchy, only empty-root can set this value */
-       if ((parent->use_hierarchy) || memcg_has_children(memcg)) {
-               mutex_unlock(&memcg_create_mutex);
-               return -EINVAL;
-       }
-
-       memcg->swappiness = val;
-
-       mutex_unlock(&memcg_create_mutex);
+       if (css_parent(css))
+               memcg->swappiness = val;
+       else
+               vm_swappiness = val;
 
        return 0;
 }
@@ -5791,22 +5783,15 @@ static int mem_cgroup_oom_control_write(struct cgroup_subsys_state *css,
        struct cftype *cft, u64 val)
 {
        struct mem_cgroup *memcg = mem_cgroup_from_css(css);
-       struct mem_cgroup *parent = mem_cgroup_from_css(css_parent(&memcg->css));
 
        /* cannot set to root cgroup and only 0 and 1 are allowed */
-       if (!parent || !((val == 0) || (val == 1)))
+       if (!css_parent(css) || !((val == 0) || (val == 1)))
                return -EINVAL;
 
-       mutex_lock(&memcg_create_mutex);
-       /* oom-kill-disable is a flag for subhierarchy. */
-       if ((parent->use_hierarchy) || memcg_has_children(memcg)) {
-               mutex_unlock(&memcg_create_mutex);
-               return -EINVAL;
-       }
        memcg->oom_kill_disable = val;
        if (!val)
                memcg_oom_recover(memcg);
-       mutex_unlock(&memcg_create_mutex);
+
        return 0;
 }