On Sun, Jun 09, 2013 at 05:17:03PM +0800, Li Zefan wrote: > Before moving tasks out of empty cpusets, update_tasks_nodemask() > is called, which calls do_migrate_pages(xx, from, to). Then those > tasks are moved to an ancestor, and do_migrate_pages() is called > again. > > The first time: from = node_to_be_offlined, to = empty. > The second time: from = empty, to = ancestor's nodemask. > > so looks like no pages will be migrated. > > Fix this by: > > - Don't call update_tasks_nodemask() on empty cpusets. > - Pass cs->old_mems_allowed to do_migrate_pages(). > > Signed-off-by: Li Zefan <lizefan@xxxxxxxxxx> > --- > kernel/cpuset.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/kernel/cpuset.c b/kernel/cpuset.c > index d1d6782..3cd68b8 100644 > --- a/kernel/cpuset.c > +++ b/kernel/cpuset.c > @@ -1563,9 +1563,16 @@ static void cpuset_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) > struct cpuset *mems_oldcs = effective_nodemask_cpuset(oldcs); > > mpol_rebind_mm(mm, &cpuset_attach_nodemask_to); > - if (is_memory_migrate(cs)) > - cpuset_migrate_mm(mm, &mems_oldcs->mems_allowed, > + if (is_memory_migrate(cs)) { > + /* > + * old_mems_allowed is the same with mems_allowed here, > + * except if this task is being moved automatically due > + * to hotplug, and in this case mems_allowed is empty > + * and old_mems_allowed is the offlined node. > + */ Wouldn't it be better if the above explain why rather than what? > + cpuset_migrate_mm(mm, &mems_oldcs->old_mems_allowed, > &cpuset_attach_nodemask_to); > + } > mmput(mm); > } > > @@ -2155,7 +2162,7 @@ retry: > * for empty cpuset to take on ancestor's cpumask. > */ > if ((sane && cpumask_empty(cs->cpus_allowed)) || > - !cpumask_empty(&off_cpus)) > + (!cpumask_empty(&off_cpus) && !cpumask_empty(cs->cpus_allowed))) > update_tasks_cpumask(cs, NULL); No biggie but maybe we want briefly explain the conditions being tested? Thanks. -- tejun _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers