All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched/rt: Fix rq's cpupri leak while enqueue/dequeue child RT entities
@ 2013-11-27 15:59 Kirill Tkhai
  2013-12-12 10:30 ` Kirill Tkhai
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Kirill Tkhai @ 2013-11-27 15:59 UTC (permalink / raw)
  To: linux-kernel@vger.kernel.org
  Cc: Ingo Molnar, Peter Zijlstra, Steven Rostedt, stable

This patch touches RT group scheduling case.

Functions inc_rt_prio_smp() and dec_rt_prio_smp() change (global) rq's priority,
while rt_rq passed to them may be not the top-level rt_rq. This is wrong, because
changing of priority on a child level does not guarantee that the priority is
the highest all over the rq. So, this leak makes RT balancing unusable.

The short example: the task having the highest priority among all rq's RT tasks
(no one other task has the same priority) are waking on a throttle rt_rq.
The rq's cpupri is set to the task's priority equivalent, but real
rq->rt.highest_prio.curr is less.

The patch below fixes the problem.

It looks like all version have this bug, so I CC'ed stable mailing list.

Signed-off-by: Kirill Tkhai <tkhai@yandex.ru>
CC: Ingo Molnar <mingo@redhat.com>
CC: Peter Zijlstra <peterz@infradead.org>
CC: Steven Rostedt <rostedt@goodmis.org>
CC: stable@vger.kernel.org
---
 kernel/sched/rt.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 7d57275..1c40655 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -901,6 +901,13 @@ inc_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio)
 {
 	struct rq *rq = rq_of_rt_rq(rt_rq);
 
+#ifdef CONFIG_RT_GROUP_SCHED
+	/*
+	 * Change rq's cpupri only if rt_rq is the top queue.
+	 */
+	if (&rq->rt != rt_rq)
+		return;
+#endif
 	if (rq->online && prio < prev_prio)
 		cpupri_set(&rq->rd->cpupri, rq->cpu, prio);
 }
@@ -910,6 +917,13 @@ dec_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio)
 {
 	struct rq *rq = rq_of_rt_rq(rt_rq);
 
+#ifdef CONFIG_RT_GROUP_SCHED
+	/*
+	 * Change rq's cpupri only if rt_rq is the top queue.
+	 */
+	if (&rq->rt != rt_rq)
+		return;
+#endif
 	if (rq->online && rt_rq->highest_prio.curr != prev_prio)
 		cpupri_set(&rq->rd->cpupri, rq->cpu, rt_rq->highest_prio.curr);
 }

^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-12-18 10:32 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-27 15:59 [PATCH] sched/rt: Fix rq's cpupri leak while enqueue/dequeue child RT entities Kirill Tkhai
2013-12-12 10:30 ` Kirill Tkhai
2013-12-13 15:42 ` Peter Zijlstra
2013-12-17 12:02   ` Kirill Tkhai
2013-12-17 12:02     ` Kirill Tkhai
2013-12-17 12:46     ` Peter Zijlstra
2013-12-17 12:46       ` Peter Zijlstra
2013-12-17 13:08       ` Kirill Tkhai
2013-12-17 13:08         ` Kirill Tkhai
2013-12-18 10:32 ` [tip:sched/core] sched/rt: Fix rq's cpupri leak while enqueue/ dequeue " tip-bot for Kirill Tkhai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.