public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: leave sched_setscheduler earlier if possible.
@ 2011-03-24 13:00 Dario Faggioli
  2011-03-24 14:21 ` Steven Rostedt
  2011-03-31 12:39 ` [tip:sched/urgent] sched: Leave sched_setscheduler() earlier if possible, do not disturb SCHED_FIFO tasks tip-bot for Dario Faggioli
  0 siblings, 2 replies; 9+ messages in thread
From: Dario Faggioli @ 2011-03-24 13:00 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Ingo Molnar, Steven Rostedt, Thomas Gleixner, Gregory Haskins,
	Mike Galbraith, linux-kernel, Andrew Morton

[-- Attachment #1: Type: text/plain, Size: 2101 bytes --]

sched_setscheduler (in sched.c) is called in order of changing the
scheduling policy and/or the real-time priority of a task. Thus,
if we find out that neither of those are actually being modified, it
is possible to return earlier and save the overhead of a full
deactivate+activate cycle of the task in question.

Beside that, if we have more than one SCHED_FIFO task with the same
priority on the same rq (which means they share the same priority queue)
having one of them changing its position in the priority queue because of
a sched_setscheduler (as it happens by means of the deactivate+activate)
that does not actually change the priority violates POSIX which states,
for SCHED_FIFO:

"If a thread whose policy or priority has been modified by
pthread_setschedprio() is a running thread or is runnable, the effect on
its position in the thread list depends on the direction of the
modification, as follows: a. <...> b. If the priority is unchanged, the
thread does not change position in the thread list. c. <...>"

(http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html)

Signed-off-by: Dario Faggioli <raistlin@linux.it>
---
 kernel/sched.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/kernel/sched.c b/kernel/sched.c
index c5ae6bc..d73bbc5 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4998,6 +4998,16 @@ recheck:
 		return -EINVAL;
 	}
 
+	/*
+	 * If not changing anything there's no need to proceed further
+	 */
+	if (unlikely(policy == p->policy && (!rt_policy(policy) ||
+	    param->sched_priority == p->rt_priority))) {
+			__task_rq_unlock(rq);
+			raw_spin_unlock_irqrestore(&p->pi_lock, flags);
+			return 0;
+	}
+
 #ifdef CONFIG_RT_GROUP_SCHED
 	if (user) {
 		/*
-- 
1.7.4.1

-- 
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

http://retis.sssup.it/people/faggioli -- dario.faggioli@jabber.org


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

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

end of thread, other threads:[~2011-03-31 12:40 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-24 13:00 [PATCH] sched: leave sched_setscheduler earlier if possible Dario Faggioli
2011-03-24 14:21 ` Steven Rostedt
2011-03-25 10:28   ` Peter Zijlstra
2011-03-25 12:52     ` Steven Rostedt
2011-03-25 13:07       ` Peter Zijlstra
2011-03-25 22:36         ` Junio C Hamano
2011-03-26 10:26           ` Peter Zijlstra
2011-03-26 10:30             ` Peter Zijlstra
2011-03-31 12:39 ` [tip:sched/urgent] sched: Leave sched_setscheduler() earlier if possible, do not disturb SCHED_FIFO tasks tip-bot for Dario Faggioli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox