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

This commit is contained in:
qctecmdr 2019-07-30 08:06:33 -07:00 • committed by Gerrit - the friendly Code Review server
commit 0f59cfa453

View file

@ -31,6 +31,7 @@
#include <linux/relay.h>
#include <linux/slab.h>
#include <linux/percpu-rwsem.h>
#include <uapi/linux/sched/types.h>
#include <trace/events/power.h>
#define CREATE_TRACE_POINTS
@ -1163,9 +1164,37 @@ 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);
}
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",
@ -1176,6 +1205,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;
@ -1194,6 +1227,14 @@ 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();
if (switch_err)
pr_err("Hotplug policy switch err=%d Task %s pid=%d\n",
switch_err, current->comm, current->pid);
}
return err;
}