aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-11-05 17:51:32 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-11-05 17:51:32 -0500
commit69234acee54407962a20bedf90ef9c96326994b5 (patch)
tree5e979b1a489d866691c2c65ac3f46b4f29feef68 /mm/memcontrol.c
parent11eaaadb3ea376c6c194491c2e9bddd647f9d253 (diff)
parentd57456753787ab158f906f1f8eb58d54a2ccd9f4 (diff)
Merge branch 'for-4.4' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo: "The cgroup core saw several significant updates this cycle: - percpu_rwsem for threadgroup locking is reinstated. This was temporarily dropped due to down_write latency issues. Oleg's rework of percpu_rwsem which is scheduled to be merged in this merge window resolves the issue. - On the v2 hierarchy, when controllers are enabled and disabled, all operations are atomic and can fail and revert cleanly. This allows ->can_attach() failure which is necessary for cpu RT slices. - Tasks now stay associated with the original cgroups after exit until released. This allows tracking resources held by zombies (e.g. pids) and makes it easy to find out where zombies came from on the v2 hierarchy. The pids controller was broken before these changes as zombies escaped the limits; unfortunately, updating this behavior required too many invasive changes and I don't think it's a good idea to backport them, so the pids controller on 4.3, the first version which included the pids controller, will stay broken at least until I'm sure about the cgroup core changes. - Optimization of a couple common tests using static_key" * 'for-4.4' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (38 commits) cgroup: fix race condition around termination check in css_task_iter_next() blkcg: don't create "io.stat" on the root cgroup cgroup: drop cgroup__DEVEL__legacy_files_on_dfl cgroup: replace error handling in cgroup_init() with WARN_ON()s cgroup: add cgroup_subsys->free() method and use it to fix pids controller cgroup: keep zombies associated with their original cgroups cgroup: make css_set_rwsem a spinlock and rename it to css_set_lock cgroup: don't hold css_set_rwsem across css task iteration cgroup: reorganize css_task_iter functions cgroup: factor out css_set_move_task() cgroup: keep css_set and task lists in chronological order cgroup: make cgroup_destroy_locked() test cgroup_is_populated() cgroup: make css_sets pin the associated cgroups cgroup: relocate cgroup_[try]get/put() cgroup: move check_for_release() invocation cgroup: replace cgroup_has_tasks() with cgroup_is_populated() cgroup: make cgroup->nr_populated count the number of populated css_sets cgroup: remove an unused parameter from cgroup_task_migrate() cgroup: fix too early usage of static_branch_disable() cgroup: make cgroup_update_dfl_csses() migrate all target processes atomically ...
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index c57c4423c688..b732edfddb76 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -434,7 +434,7 @@ struct cgroup_subsys_state *mem_cgroup_css_from_page(struct page *page)
434 434
435 memcg = page->mem_cgroup; 435 memcg = page->mem_cgroup;
436 436
437 if (!memcg || !cgroup_on_dfl(memcg->css.cgroup)) 437 if (!memcg || !cgroup_subsys_on_dfl(memory_cgrp_subsys))
438 memcg = root_mem_cgroup; 438 memcg = root_mem_cgroup;
439 439
440 rcu_read_unlock(); 440 rcu_read_unlock();
@@ -2926,7 +2926,7 @@ static int memcg_activate_kmem(struct mem_cgroup *memcg,
2926 * of course permitted. 2926 * of course permitted.
2927 */ 2927 */
2928 mutex_lock(&memcg_create_mutex); 2928 mutex_lock(&memcg_create_mutex);
2929 if (cgroup_has_tasks(memcg->css.cgroup) || 2929 if (cgroup_is_populated(memcg->css.cgroup) ||
2930 (memcg->use_hierarchy && memcg_has_children(memcg))) 2930 (memcg->use_hierarchy && memcg_has_children(memcg)))
2931 err = -EBUSY; 2931 err = -EBUSY;
2932 mutex_unlock(&memcg_create_mutex); 2932 mutex_unlock(&memcg_create_mutex);
@@ -4066,8 +4066,7 @@ static struct cftype mem_cgroup_legacy_files[] = {
4066 { 4066 {
4067 .name = "cgroup.event_control", /* XXX: for compat */ 4067 .name = "cgroup.event_control", /* XXX: for compat */
4068 .write = memcg_write_event_control, 4068 .write = memcg_write_event_control,
4069 .flags = CFTYPE_NO_PREFIX, 4069 .flags = CFTYPE_NO_PREFIX | CFTYPE_WORLD_WRITABLE,
4070 .mode = S_IWUGO,
4071 }, 4070 },
4072 { 4071 {
4073 .name = "swappiness", 4072 .name = "swappiness",
@@ -4834,7 +4833,7 @@ static int mem_cgroup_can_attach(struct cgroup_subsys_state *css,
4834{ 4833{
4835 struct mem_cgroup *memcg = mem_cgroup_from_css(css); 4834 struct mem_cgroup *memcg = mem_cgroup_from_css(css);
4836 struct mem_cgroup *from; 4835 struct mem_cgroup *from;
4837 struct task_struct *p; 4836 struct task_struct *leader, *p;
4838 struct mm_struct *mm; 4837 struct mm_struct *mm;
4839 unsigned long move_flags; 4838 unsigned long move_flags;
4840 int ret = 0; 4839 int ret = 0;
@@ -4848,7 +4847,20 @@ static int mem_cgroup_can_attach(struct cgroup_subsys_state *css,
4848 if (!move_flags) 4847 if (!move_flags)
4849 return 0; 4848 return 0;
4850 4849
4851 p = cgroup_taskset_first(tset); 4850 /*
4851 * Multi-process migrations only happen on the default hierarchy
4852 * where charge immigration is not used. Perform charge
4853 * immigration if @tset contains a leader and whine if there are
4854 * multiple.
4855 */
4856 p = NULL;
4857 cgroup_taskset_for_each_leader(leader, tset) {
4858 WARN_ON_ONCE(p);
4859 p = leader;
4860 }
4861 if (!p)
4862 return 0;
4863
4852 from = mem_cgroup_from_task(p); 4864 from = mem_cgroup_from_task(p);
4853 4865
4854 VM_BUG_ON(from == memcg); 4866 VM_BUG_ON(from == memcg);
@@ -5064,7 +5076,7 @@ static void mem_cgroup_bind(struct cgroup_subsys_state *root_css)
5064 * guarantees that @root doesn't have any children, so turning it 5076 * guarantees that @root doesn't have any children, so turning it
5065 * on for the root memcg is enough. 5077 * on for the root memcg is enough.
5066 */ 5078 */
5067 if (cgroup_on_dfl(root_css->cgroup)) 5079 if (cgroup_subsys_on_dfl(memory_cgrp_subsys))
5068 root_mem_cgroup->use_hierarchy = true; 5080 root_mem_cgroup->use_hierarchy = true;
5069 else 5081 else
5070 root_mem_cgroup->use_hierarchy = false; 5082 root_mem_cgroup->use_hierarchy = false;
@@ -5208,6 +5220,7 @@ static struct cftype memory_files[] = {
5208 { 5220 {
5209 .name = "events", 5221 .name = "events",
5210 .flags = CFTYPE_NOT_ON_ROOT, 5222 .flags = CFTYPE_NOT_ON_ROOT,
5223 .file_offset = offsetof(struct mem_cgroup, events_file),
5211 .seq_show = memory_events_show, 5224 .seq_show = memory_events_show,
5212 }, 5225 },
5213 { } /* terminate */ 5226 { } /* terminate */