rcu: put per-CPU kthread at non-RT priority during CPU hotplug operations
If you are doing CPU hotplug operations, it is best not to have CPU-bound realtime tasks running CPU-bound on the outgoing CPU. So this commit makes per-CPU kthreads run at non-realtime priority during that time. Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
parent
0f962a5e72
commit
e3995a25fa
@ -1463,6 +1463,30 @@ static void invoke_rcu_node_kthread(struct rcu_node *rnp)
|
|||||||
wake_up_process(t);
|
wake_up_process(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the specified CPU's kthread to run RT or not, as specified by
|
||||||
|
* the to_rt argument. The CPU-hotplug locks are held, so the task
|
||||||
|
* is not going away.
|
||||||
|
*/
|
||||||
|
static void rcu_cpu_kthread_setrt(int cpu, int to_rt)
|
||||||
|
{
|
||||||
|
int policy;
|
||||||
|
struct sched_param sp;
|
||||||
|
struct task_struct *t;
|
||||||
|
|
||||||
|
t = per_cpu(rcu_cpu_kthread_task, cpu);
|
||||||
|
if (t == NULL)
|
||||||
|
return;
|
||||||
|
if (to_rt) {
|
||||||
|
policy = SCHED_FIFO;
|
||||||
|
sp.sched_priority = RCU_KTHREAD_PRIO;
|
||||||
|
} else {
|
||||||
|
policy = SCHED_NORMAL;
|
||||||
|
sp.sched_priority = 0;
|
||||||
|
}
|
||||||
|
sched_setscheduler_nocheck(t, policy, &sp);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timer handler to initiate the waking up of per-CPU kthreads that
|
* Timer handler to initiate the waking up of per-CPU kthreads that
|
||||||
* have yielded the CPU due to excess numbers of RCU callbacks.
|
* have yielded the CPU due to excess numbers of RCU callbacks.
|
||||||
@ -2166,9 +2190,11 @@ static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
|
|||||||
case CPU_ONLINE:
|
case CPU_ONLINE:
|
||||||
case CPU_DOWN_FAILED:
|
case CPU_DOWN_FAILED:
|
||||||
rcu_node_kthread_setaffinity(rnp, -1);
|
rcu_node_kthread_setaffinity(rnp, -1);
|
||||||
|
rcu_cpu_kthread_setrt(cpu, 1);
|
||||||
break;
|
break;
|
||||||
case CPU_DOWN_PREPARE:
|
case CPU_DOWN_PREPARE:
|
||||||
rcu_node_kthread_setaffinity(rnp, cpu);
|
rcu_node_kthread_setaffinity(rnp, cpu);
|
||||||
|
rcu_cpu_kthread_setrt(cpu, 0);
|
||||||
break;
|
break;
|
||||||
case CPU_DYING:
|
case CPU_DYING:
|
||||||
case CPU_DYING_FROZEN:
|
case CPU_DYING_FROZEN:
|
||||||
|
Loading…
Reference in New Issue
Block a user