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

Commit 091048b5 authored by Pavankumar Kondeti's avatar Pavankumar Kondeti Committed by Satya Durga Srinivasu Prabhala
Browse files

cpu/hotplug: Ensure that sched domains are rebuilt before hotplug



When cpusets are enabled, the rebuilding of the scheduling domains
is deferred to a workqueue context. Make sure that the work is
completed before proceeding to the next hotplug. Otherwise scheduler
observes an inconsistent view of online and offline CPUs in the
root domain. If the online CPUs are still stuck in the offline i.e
default domain, those CPUs would not be visible when scheduling
happens on from other CPUs in the root domain. This results in
packing tasks more on certain CPUs while leaving the other CPUs
idle. Also RT_RUNTIME_SHARE feature i.e borrowing RT runtime from
the other CPUs would not work correctly. Because the CPUs in the
root domain can't borrow the runtime from the online CPUs but stuck
in the offline/default domain.

Change-Id: I93c51d2abc8a9c099b62f1d2cbb9095d3a788bda
Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
[satyap@codeaurora.org: fix trivial merge conflict]
Signed-off-by: default avatarSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>
parent 61f31539
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <linux/slab.h>
#include <linux/percpu-rwsem.h>
#include <uapi/linux/sched/types.h>
#include <linux/cpuset.h>

#include <trace/events/power.h>
#define CREATE_TRACE_POINTS
@@ -1052,6 +1053,18 @@ static int do_cpu_down(unsigned int cpu, enum cpuhp_state target)
{
	int err;

	/*
	 * When cpusets are enabled, the rebuilding of the scheduling
	 * domains is deferred to a workqueue context. Make sure
	 * that the work is completed before proceeding to the next
	 * hotplug. Otherwise scheduler observes an inconsistent
	 * view of online and offline CPUs in the root domain. If
	 * the online CPUs are still stuck in the offline (default)
	 * domain, those CPUs would not be visible when scheduling
	 * happens on from other CPUs in the root domain.
	 */
	cpuset_wait_for_hotplug();

	cpu_maps_update_begin();
	err = cpu_down_maps_locked(cpu, target);
	cpu_maps_update_done();
@@ -1215,6 +1228,8 @@ static int do_cpu_up(unsigned int cpu, enum cpuhp_state target)
		return -EINVAL;
	}

	cpuset_wait_for_hotplug();

	switch_err = switch_to_rt_policy();
	if (switch_err < 0)
		return switch_err;