Commit 16f3ef46 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched/core: Restructure destroy_sched_domain()

There is no point in doing a call_rcu() for each domain, only do a
callback for the root sched domain and clean up the entire set in one
go.

Also make the entire call chain be called destroy_sched_domain*() to
remove confusion with the free_sched_domains() call, which does an
entirely different thing.

Both cpu_attach_domain() callers of destroy_sched_domain() can live
without the call_rcu() because at those points the sched_domain hasn't
been published yet.
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent f39180ef
...@@ -5935,10 +5935,8 @@ static void free_sched_groups(struct sched_group *sg, int free_sgc) ...@@ -5935,10 +5935,8 @@ static void free_sched_groups(struct sched_group *sg, int free_sgc)
} while (sg != first); } while (sg != first);
} }
static void free_sched_domain(struct rcu_head *rcu) static void destroy_sched_domain(struct sched_domain *sd)
{ {
struct sched_domain *sd = container_of(rcu, struct sched_domain, rcu);
/* /*
* If its an overlapping domain it has private groups, iterate and * If its an overlapping domain it has private groups, iterate and
* nuke them all. * nuke them all.
...@@ -5952,15 +5950,21 @@ static void free_sched_domain(struct rcu_head *rcu) ...@@ -5952,15 +5950,21 @@ static void free_sched_domain(struct rcu_head *rcu)
kfree(sd); kfree(sd);
} }
static void destroy_sched_domain(struct sched_domain *sd) static void destroy_sched_domains_rcu(struct rcu_head *rcu)
{ {
call_rcu(&sd->rcu, free_sched_domain); struct sched_domain *sd = container_of(rcu, struct sched_domain, rcu);
while (sd) {
struct sched_domain *parent = sd->parent;
destroy_sched_domain(sd);
sd = parent;
}
} }
static void destroy_sched_domains(struct sched_domain *sd) static void destroy_sched_domains(struct sched_domain *sd)
{ {
for (; sd; sd = sd->parent) if (sd)
destroy_sched_domain(sd); call_rcu(&sd->rcu, destroy_sched_domains_rcu);
} }
/* /*
......
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