All of lore.kernel.org
 help / color / mirror / Atom feed
* [BUGFIX][PATCH] Fix sched rt group scheduling when hierachy is enabled
@ 2011-03-03 11:34 Balbir Singh
  2011-03-03 14:05 ` Yong Zhang
  2011-03-04 11:49 ` [tip:sched/core] sched: " tip-bot for Balbir Singh
  0 siblings, 2 replies; 15+ messages in thread
From: Balbir Singh @ 2011-03-03 11:34 UTC (permalink / raw)
  To: linux-kernel@vger.kernel.org
  Cc: Ingo Molnar, Peter Zijlstra, Srivatsa Vaddagiri, Bharata B Rao

Fix hierarchical scheduling in sched rt group

From: Balbir Singh <balbir@linux.vnet.ibm.com>

The current sched rt code is broken when it comes to hierarchical
scheduling, this patch fixes two problems

1. It adds redundant enqueuing (harmless) when it finds a queue
   has tasks enqueued, but it has no run time and it is not
   throttled.
2. The most important change is in sched_rt_rq_enqueue/dequeue.
   The code just picks the rt_rq belonging to the current cpu
   on which the period timer runs, the patch fixes it, so that
   the correct rt_se is enqueued/dequeued.

Tested with a simple hierarchy

/c/d, c and d assigned similar runtimes of 50,000 and a while
1 loop runs within "d". Both c and d get throttled, without
the patch, the task just stops running and never runs (depends
on where the sched_rt b/w timer runs). With the patch, the
task is throttled and runs as expected.

[bharata, suggestions on how to pick the rt_se belong to the rt_rq
and correct cpu]

Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
---
 kernel/sched_rt.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index ad62677..01f75a5 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -210,11 +210,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se);
 
 static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
 {
-	int this_cpu = smp_processor_id();
 	struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
 	struct sched_rt_entity *rt_se;
 
-	rt_se = rt_rq->tg->rt_se[this_cpu];
+	int cpu = cpu_of(rq_of_rt_rq(rt_rq));
+
+	rt_se = rt_rq->tg->rt_se[cpu];
 
 	if (rt_rq->rt_nr_running) {
 		if (rt_se && !on_rt_rq(rt_se))
@@ -226,10 +227,10 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
 
 static void sched_rt_rq_dequeue(struct rt_rq *rt_rq)
 {
-	int this_cpu = smp_processor_id();
 	struct sched_rt_entity *rt_se;
+	int cpu = cpu_of(rq_of_rt_rq(rt_rq));
 
-	rt_se = rt_rq->tg->rt_se[this_cpu];
+	rt_se = rt_rq->tg->rt_se[cpu];
 
 	if (rt_se && on_rt_rq(rt_se))
 		dequeue_rt_entity(rt_se);
@@ -565,8 +566,11 @@ static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun)
 			if (rt_rq->rt_time || rt_rq->rt_nr_running)
 				idle = 0;
 			raw_spin_unlock(&rt_rq->rt_runtime_lock);
-		} else if (rt_rq->rt_nr_running)
+		} else if (rt_rq->rt_nr_running) {
 			idle = 0;
+			if (!rt_rq_throttled(rt_rq))
+				enqueue = 1;
+		}
 
 		if (enqueue)
 			sched_rt_rq_enqueue(rt_rq);

-- 
	Three Cheers,
	Balbir

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

end of thread, other threads:[~2011-03-08 18:34 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-03 11:34 [BUGFIX][PATCH] Fix sched rt group scheduling when hierachy is enabled Balbir Singh
2011-03-03 14:05 ` Yong Zhang
2011-03-03 15:29   ` Balbir Singh
2011-03-04  3:43     ` Yong Zhang
2011-03-04  7:25       ` Balbir Singh
2011-03-04  8:32         ` Yong Zhang
2011-03-04  8:35           ` Balbir Singh
2011-03-04  8:52             ` Yong Zhang
2011-03-04  8:59               ` Balbir Singh
2011-03-04  9:30                 ` Yong Zhang
2011-03-04 12:11                   ` Balbir Singh
2011-03-07  7:00                     ` Yong Zhang
2011-03-08  8:42                       ` Yong Zhang
2011-03-08 18:34                         ` Balbir Singh
2011-03-04 11:49 ` [tip:sched/core] sched: " tip-bot for Balbir Singh

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.