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

Commit 6c5cc8bd authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cpu-hotplug: Always use real time scheduling when hotplugging a CPU"

parents 94a297b7 cbc3fee7
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -530,9 +530,41 @@ out:
	return ret;
}

static int switch_to_rt_policy(void)
{
	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
	unsigned int policy = current->policy;
	int err;

	/* Nobody should be attempting hotplug from these policy contexts. */
	if (policy == SCHED_BATCH || policy == SCHED_IDLE ||
					policy == SCHED_DEADLINE)
		return -EPERM;

	if (policy == SCHED_FIFO || policy == SCHED_RR)
		return 1;

	/* Only SCHED_NORMAL left. */
	err = sched_setscheduler_nocheck(current, SCHED_FIFO, &param);
	return err;

}

static int switch_to_fair_policy(void)
{
	struct sched_param param = { .sched_priority = 0 };

	return sched_setscheduler_nocheck(current, SCHED_NORMAL, &param);
}

int cpu_up(unsigned int cpu)
{
	int err = 0;
	int switch_err = 0;

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

	if (!cpu_possible(cpu)) {
		pr_err("can't online cpu %d because it is not configured as may-hotadd at boot time\n",
@@ -558,6 +590,13 @@ int cpu_up(unsigned int cpu)

out:
	cpu_maps_update_done();

	if (!switch_err) {
		switch_err = switch_to_fair_policy();
		pr_err("Hotplug policy switch err. Task %s pid=%d\n",
					current->comm, current->pid);
	}

	return err;
}
EXPORT_SYMBOL_GPL(cpu_up);