[TIP/SCHED/DEVEL PATCH v3 4/6] sched: add sched_class->needs_post_schedule() member

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Gregory Haskins
Date: Thursday, September 4, 2008 - 5:55 am

We currently run class->post_schedule() outside of the rq->lock, which
means that we need to test for the need to post_schedule outside of
the lock to avoid a forced reacquistion.  This is currently not a problem
as we only look at rq->rt.overloaded.  However, we want to enhance this
going forward to look at more state to reduce the need to post_schedule to
a bare minimum set.  Therefore, we introduce a new member-func called
needs_post_schedule() which tests for the post_schedule condtion without
actually performing the work.  Therefore it is safe to call this
function before the rq->lock is released, because we are guaranteed not
to drop the lock at an intermediate point (such as what post_schedule()
may do).

We will use this later in the series

Signed-off-by: Gregory Haskins <ghaskins@novell.com>
---

 include/linux/sched.h |    1 +
 kernel/sched.c        |   10 +++++++++-
 kernel/sched_rt.c     |   24 ++++++++++++++----------
 3 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 08a87b5..cf8cd8c 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -912,6 +912,7 @@ struct sched_class {
 			      struct rq *busiest, struct sched_domain *sd,
 			      enum cpu_idle_type idle);
 	void (*pre_schedule) (struct rq *this_rq, struct task_struct *task);
+	int (*needs_post_schedule) (struct rq *this_rq);
 	void (*post_schedule) (struct rq *this_rq);
 	void (*task_wake_up) (struct rq *this_rq, struct task_struct *task);
 #endif
diff --git a/kernel/sched.c b/kernel/sched.c
index af4c6fa..ddc3877 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2525,6 +2525,14 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
 {
 	struct mm_struct *mm = rq->prev_mm;
 	long prev_state;
+#ifdef CONFIG_SMP
+	int post_schedule = 0;
+
+	if (current->sched_class->needs_post_schedule) {
+		BUG_ON(!current->sched_class->post_schedule);
+		post_schedule = current->sched_class->needs_post_schedule(rq);
+	}
+#endif
 
 	rq->prev_mm = NULL;
 
@@ -2543,7 +2551,7 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
 	finish_arch_switch(prev);
 	finish_lock_switch(rq, prev);
 #ifdef CONFIG_SMP
-	if (current->sched_class->post_schedule)
+	if (post_schedule)
 		current->sched_class->post_schedule(rq);
 #endif
 
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index 768be35..277ccd2 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -1212,20 +1212,23 @@ static void pre_schedule_rt(struct rq *rq, struct task_struct *prev)
 		pull_rt_task(rq);
 }
 
+/*
+ * assumes rq->lock is held
+ */
+static int needs_post_schedule_rt(struct rq *rq)
+{
+	return rq->rt.overloaded ? 1 : 0;
+}
+
 static void post_schedule_rt(struct rq *rq)
 {
 	/*
-	 * If we have more than one rt_task queued, then
-	 * see if we can push the other rt_tasks off to other CPUS.
-	 * Note we may release the rq lock, and since
-	 * the lock was owned by prev, we need to release it
-	 * first via finish_lock_switch and then reaquire it here.
+	 * This is only called if needs_post_schedule_rt() indicates that
+	 * we need to push tasks away
 	 */
-	if (unlikely(rq->rt.overloaded)) {
-		spin_lock_irq(&rq->lock);
-		push_rt_tasks(rq);
-		spin_unlock_irq(&rq->lock);
-	}
+	spin_lock_irq(&rq->lock);
+	push_rt_tasks(rq);
+	spin_unlock_irq(&rq->lock);
 }
 
 /*
@@ -1473,6 +1476,7 @@ static const struct sched_class rt_sched_class = {
 	.rq_online              = rq_online_rt,
 	.rq_offline             = rq_offline_rt,
 	.pre_schedule		= pre_schedule_rt,
+	.needs_post_schedule	= needs_post_schedule_rt,
 	.post_schedule		= post_schedule_rt,
 	.task_wake_up		= task_wake_up_rt,
 	.switched_from		= switched_from_rt,

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/5] sched: misc rt fixes for tip/sched/devel, Gregory Haskins, (Mon Aug 25, 1:15 pm)
[PATCH 3/5] sched: make double-lock-balance fair, Gregory Haskins, (Mon Aug 25, 1:15 pm)
Re: [PATCH 3/5] sched: make double-lock-balance fair, Nick Piggin, (Mon Aug 25, 11:14 pm)
Re: [PATCH 3/5] sched: make double-lock-balance fair, Gregory Haskins, (Tue Aug 26, 5:23 am)
[PATCH v2 0/6] Series short description, Gregory Haskins, (Tue Aug 26, 10:34 am)
[PATCH v2 3/6] sched: make double-lock-balance fair, Gregory Haskins, (Tue Aug 26, 10:35 am)
Re: [PATCH 3/5] sched: make double-lock-balance fair, Nick Piggin, (Tue Aug 26, 11:36 pm)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Peter Zijlstra, (Wed Aug 27, 1:21 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Peter Zijlstra, (Wed Aug 27, 1:25 am)
Re: [PATCH v2 0/6] Series short description, Peter Zijlstra, (Wed Aug 27, 1:33 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Peter Zijlstra, (Wed Aug 27, 3:41 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Peter Zijlstra, (Wed Aug 27, 4:07 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Russell King, (Wed Aug 27, 4:17 am)
Re: [PATCH 3/5] sched: make double-lock-balance fair, Gregory Haskins, (Wed Aug 27, 4:41 am)
Re: [PATCH 3/5] sched: make double-lock-balance fair, Nick Piggin, (Wed Aug 27, 4:53 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Gregory Haskins, (Wed Aug 27, 5:00 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Gregory Haskins, (Wed Aug 27, 5:02 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Gregory Haskins, (Wed Aug 27, 5:03 am)
Re: [PATCH 3/5] sched: make double-lock-balance fair, Gregory Haskins, (Wed Aug 27, 5:10 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Gregory Haskins, (Wed Aug 27, 5:13 am)
Re: [PATCH v2 3/6] sched: make double-lock-balance fair, Ralf Baechle, (Fri Aug 29, 5:49 am)
[TIP/SCHED/DEVEL PATCH v3 0/6] sched: misc rt fixes, Gregory Haskins, (Thu Sep 4, 5:54 am)
[TIP/SCHED/DEVEL PATCH v3 4/6] sched: add sched_class->nee ..., Gregory Haskins, (Thu Sep 4, 5:55 am)