Commit 9f2115f9 authored by Tejun Heo's avatar Tejun Heo Committed by Linus Torvalds

memcg: restructure mem_cgroup_can_attach()

Restructure it to lower nesting level and help the planned threadgroup
leader iteration changes.

This is pure reorganization.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
Reviewed-by: default avatarVladimir Davydov <vdavydov@parallels.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 64219994
...@@ -4834,10 +4834,12 @@ static void mem_cgroup_clear_mc(void) ...@@ -4834,10 +4834,12 @@ static void mem_cgroup_clear_mc(void)
static int mem_cgroup_can_attach(struct cgroup_subsys_state *css, static int mem_cgroup_can_attach(struct cgroup_subsys_state *css,
struct cgroup_taskset *tset) struct cgroup_taskset *tset)
{ {
struct task_struct *p = cgroup_taskset_first(tset);
int ret = 0;
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(css);
struct mem_cgroup *from;
struct task_struct *p;
struct mm_struct *mm;
unsigned long move_flags; unsigned long move_flags;
int ret = 0;
/* /*
* We are now commited to this value whatever it is. Changes in this * We are now commited to this value whatever it is. Changes in this
...@@ -4845,36 +4847,37 @@ static int mem_cgroup_can_attach(struct cgroup_subsys_state *css, ...@@ -4845,36 +4847,37 @@ static int mem_cgroup_can_attach(struct cgroup_subsys_state *css,
* So we need to save it, and keep it going. * So we need to save it, and keep it going.
*/ */
move_flags = READ_ONCE(memcg->move_charge_at_immigrate); move_flags = READ_ONCE(memcg->move_charge_at_immigrate);
if (move_flags) { if (!move_flags)
struct mm_struct *mm; return 0;
struct mem_cgroup *from = mem_cgroup_from_task(p);
VM_BUG_ON(from == memcg); p = cgroup_taskset_first(tset);
from = mem_cgroup_from_task(p);
mm = get_task_mm(p); VM_BUG_ON(from == memcg);
if (!mm)
return 0; mm = get_task_mm(p);
/* We move charges only when we move a owner of the mm */ if (!mm)
if (mm->owner == p) { return 0;
VM_BUG_ON(mc.from); /* We move charges only when we move a owner of the mm */
VM_BUG_ON(mc.to); if (mm->owner == p) {
VM_BUG_ON(mc.precharge); VM_BUG_ON(mc.from);
VM_BUG_ON(mc.moved_charge); VM_BUG_ON(mc.to);
VM_BUG_ON(mc.moved_swap); VM_BUG_ON(mc.precharge);
VM_BUG_ON(mc.moved_charge);
spin_lock(&mc.lock); VM_BUG_ON(mc.moved_swap);
mc.from = from;
mc.to = memcg; spin_lock(&mc.lock);
mc.flags = move_flags; mc.from = from;
spin_unlock(&mc.lock); mc.to = memcg;
/* We set mc.moving_task later */ mc.flags = move_flags;
spin_unlock(&mc.lock);
ret = mem_cgroup_precharge_mc(mm); /* We set mc.moving_task later */
if (ret)
mem_cgroup_clear_mc(); ret = mem_cgroup_precharge_mc(mm);
} if (ret)
mmput(mm); mem_cgroup_clear_mc();
} }
mmput(mm);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment