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

Commit 023a1495 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" into msm-4.9

parents f9e48896 b3058808
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -1060,9 +1060,37 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen, enum cpuhp_state target)
	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);
}

static int do_cpu_up(unsigned int cpu, enum cpuhp_state target)
{
	int err = 0;
	int switch_err = 0;

	if (!cpu_possible(cpu)) {
		pr_err("can't online cpu %d because it is not configured as may-hotadd at boot time\n",
@@ -1073,6 +1101,10 @@ static int do_cpu_up(unsigned int cpu, enum cpuhp_state target)
		return -EINVAL;
	}

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

	err = try_online_node(cpu_to_node(cpu));
	if (err)
		return err;
@@ -1087,6 +1119,13 @@ static int do_cpu_up(unsigned int cpu, enum cpuhp_state target)
	err = _cpu_up(cpu, 0, target);
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;
}