52 lines
1.5 KiB
Diff
52 lines
1.5 KiB
Diff
Subject: sched-prevent-idle-boost.patch
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Mon, 06 Jun 2011 20:07:38 +0200
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
kernel/sched.c | 21 +++++++++++++++++++--
|
|
1 file changed, 19 insertions(+), 2 deletions(-)
|
|
|
|
Index: linux-3.2/kernel/sched.c
|
|
===================================================================
|
|
--- linux-3.2.orig/kernel/sched.c
|
|
+++ linux-3.2/kernel/sched.c
|
|
@@ -5037,6 +5037,24 @@ void rt_mutex_setprio(struct task_struct
|
|
|
|
rq = __task_rq_lock(p);
|
|
|
|
+ /*
|
|
+ * Idle task boosting is a nono in general. There is one
|
|
+ * exception, when PREEMPT_RT and NOHZ is active:
|
|
+ *
|
|
+ * The idle task calls get_next_timer_interrupt() and holds
|
|
+ * the timer wheel base->lock on the CPU and another CPU wants
|
|
+ * to access the timer (probably to cancel it). We can safely
|
|
+ * ignore the boosting request, as the idle CPU runs this code
|
|
+ * with interrupts disabled and will complete the lock
|
|
+ * protected section without being interrupted. So there is no
|
|
+ * real need to boost.
|
|
+ */
|
|
+ if (unlikely(p == rq->idle)) {
|
|
+ WARN_ON(p != rq->curr);
|
|
+ WARN_ON(p->pi_blocked_on);
|
|
+ goto out_unlock;
|
|
+ }
|
|
+
|
|
trace_sched_pi_setprio(p, prio);
|
|
oldprio = p->prio;
|
|
prev_class = p->sched_class;
|
|
@@ -5060,11 +5078,10 @@ void rt_mutex_setprio(struct task_struct
|
|
enqueue_task(rq, p, oldprio < prio ? ENQUEUE_HEAD : 0);
|
|
|
|
check_class_changed(rq, p, prev_class, oldprio);
|
|
+out_unlock:
|
|
__task_rq_unlock(rq);
|
|
}
|
|
-
|
|
#endif
|
|
-
|
|
void set_user_nice(struct task_struct *p, long nice)
|
|
{
|
|
int old_prio, delta, on_rq;
|