diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-06 14:33:08 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-06 14:33:08 -0700 |
| commit | 6c5cc8bddc7470a259a6376ca7946ece67404585 (patch) | |
| tree | c79417255a9097d4c32ae4b49f513f4415725281 /kernel | |
| parent | 94a297b7304b90f052dbb6fa81653f7fdad5d903 (diff) | |
| parent | cbc3fee7f780593872b5cc25572460606df86911 (diff) | |
Merge "cpu-hotplug: Always use real time scheduling when hotplugging a CPU"
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpu.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 8b6940755e4a..0ca3599cee1f 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -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, ¶m); + return err; + +} + +static int switch_to_fair_policy(void) +{ + struct sched_param param = { .sched_priority = 0 }; + + return sched_setscheduler_nocheck(current, SCHED_NORMAL, ¶m); +} + 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); |
