Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −7
Original line number Original line Diff line number Diff line
@@ -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)
	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);
}
}


/*
/*