cpuset: speed up sched domain partition
PATCH 2/3 cpuset: speed up sched domain partition
From: Lai Jiangshan <[email protected]>
Date: Mon, 28 Jul 2008 10:38:22 +0800
Subject: [PATCH 2/3] 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 Lai Jiangshan <[email protected]>
Signed-off-by Li Zefan <[email protected]>
--- kernel/cpuset.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 files changed, 37 insertions(+), 4 deletions(-)
kernel/cpuset.c +37 -4
@@ -485,13 +485,38 @@ static int cpusets_overlap(struct cpuset *a, struct cpuset *b)static void update_domain_attr (struct sched_domain_attr *dattr,struct cpuset *c) { -if (!dattr) -return ;if (dattr->relax_domain_level < c->relax_domain_level) dattr->relax_domain_level = c->relax_domain_level;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() *
@@ -611,8 +636,16 @@ void rebuild_sched_domains(void)if (cpus_empty (cp->cpus_allowed))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; +continue ; + }list_for_each_entry (cont, &cp->css.cgroup->children, sibling) { child =cgroup_cs (cont);
@@ -683,7 +716,7 @@ restart:cpus_or (*dp, *dp, b->cpus_allowed); b->pn =-1 ;if (dattr) -update_domain_attr (dattr +update_domain_attr_tree (dattr + nslot, b); } }
Signature · 1 line
1.5.4.rc3
Quoted 2 lines · Lai
All child cpusets contain a subset of the parent's cpus, so we can skip them when partitioning sched domains.
Nice - thanks.
Reviewed-by Paul Jackson <[email protected]>
Signature · 3 lines
I won't rest till it's the best ...
Programmer, Linux Scalability
Paul Jackson <[email protected]> 1.940.382.4214