Commit f5393693 authored by Lai Jiangshan's avatar Lai Jiangshan Committed by Linus Torvalds

cpuset: speed up sched domain partition

All child cpusets contain a subset of the parent's cpus, so we can skip
them when partitioning sched domains. This decreases 'csa' greately for
cpusets with multi-level hierarchy.
Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Cc: Paul Menage <menage@google.com>
Cc: Cedric Le Goater <clg@fr.ibm.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: default avatarPaul Jackson <pj@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8d1e6266
...@@ -486,13 +486,38 @@ static int cpusets_overlap(struct cpuset *a, struct cpuset *b) ...@@ -486,13 +486,38 @@ static int cpusets_overlap(struct cpuset *a, struct cpuset *b)
static void static void
update_domain_attr(struct sched_domain_attr *dattr, struct cpuset *c) update_domain_attr(struct sched_domain_attr *dattr, struct cpuset *c)
{ {
if (!dattr)
return;
if (dattr->relax_domain_level < c->relax_domain_level) if (dattr->relax_domain_level < c->relax_domain_level)
dattr->relax_domain_level = c->relax_domain_level; dattr->relax_domain_level = c->relax_domain_level;
return; return;
} }
static void
update_domain_attr_tree(struct sched_domain_attr *dattr, struct cpuset *c)
{
LIST_HEAD(q);
list_add(&c->stack_list, &q);
while (!list_empty(&q)) {
struct cpuset *cp;
struct cgroup *cont;
struct cpuset *child;
cp = list_first_entry(&q, struct cpuset, stack_list);
list_del(q.next);
if (cpus_empty(cp->cpus_allowed))
continue;
if (is_sched_load_balance(cp))
update_domain_attr(dattr, cp);
list_for_each_entry(cont, &cp->css.cgroup->children, sibling) {
child = cgroup_cs(cont);
list_add_tail(&child->stack_list, &q);
}
}
}
/* /*
* rebuild_sched_domains() * rebuild_sched_domains()
* *
...@@ -614,8 +639,16 @@ void rebuild_sched_domains(void) ...@@ -614,8 +639,16 @@ void rebuild_sched_domains(void)
if (cpus_empty(cp->cpus_allowed)) if (cpus_empty(cp->cpus_allowed))
continue; continue;
if (is_sched_load_balance(cp)) /*
* All child cpusets contain a subset of the parent's cpus, so
* just skip them, and then we call update_domain_attr_tree()
* to calc relax_domain_level of the corresponding sched
* domain.
*/
if (is_sched_load_balance(cp)) {
csa[csn++] = cp; csa[csn++] = cp;
continue;
}
list_for_each_entry(cont, &cp->css.cgroup->children, sibling) { list_for_each_entry(cont, &cp->css.cgroup->children, sibling) {
child = cgroup_cs(cont); child = cgroup_cs(cont);
...@@ -686,7 +719,7 @@ restart: ...@@ -686,7 +719,7 @@ restart:
cpus_or(*dp, *dp, b->cpus_allowed); cpus_or(*dp, *dp, b->cpus_allowed);
b->pn = -1; b->pn = -1;
if (dattr) if (dattr)
update_domain_attr(dattr update_domain_attr_tree(dattr
+ nslot, b); + nslot, b);
} }
} }
......
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