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

Commit f29c9b1c authored by Li Zefan's avatar Li Zefan Committed by Ingo Molnar
Browse files

sched: fix a bug in sched domain degenerate



Impact: re-add incorrectly eliminated sched domain layers

(1) on i386 with SCHED_SMT and SCHED_MC enabled
	# mount -t cgroup -o cpuset xxx /mnt
	# echo 0 > /mnt/cpuset.sched_load_balance
	# mkdir /mnt/0
	# echo 0 > /mnt/0/cpuset.cpus
	# dmesg
	CPU0 attaching sched-domain:
	 domain 0: span 0 level CPU
	  groups: 0

(2) on i386 with SCHED_MC enabled but SCHED_SMT disabled
	# same with (1)
	# dmesg
	CPU0 attaching NULL sched-domain.

The bug is that some sched domains may be skipped unintentionally when
degenerating (optimizing) sched domains.

Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 4bab0ea1
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -6877,15 +6877,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
	struct sched_domain *tmp;
	struct sched_domain *tmp;


	/* Remove the sched domains which do not contribute to scheduling. */
	/* Remove the sched domains which do not contribute to scheduling. */
	for (tmp = sd; tmp; tmp = tmp->parent) {
	for (tmp = sd; tmp; ) {
		struct sched_domain *parent = tmp->parent;
		struct sched_domain *parent = tmp->parent;
		if (!parent)
		if (!parent)
			break;
			break;

		if (sd_parent_degenerate(tmp, parent)) {
		if (sd_parent_degenerate(tmp, parent)) {
			tmp->parent = parent->parent;
			tmp->parent = parent->parent;
			if (parent->parent)
			if (parent->parent)
				parent->parent->child = tmp;
				parent->parent->child = tmp;
		}
		} else
			tmp = tmp->parent;
	}
	}


	if (sd && sd_degenerate(sd)) {
	if (sd && sd_degenerate(sd)) {