diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-12-04 11:04:39 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-12-04 11:04:39 -0500 |
commit | 77034937dc4575ca0a76bf209838ecd39e804089 (patch) | |
tree | 96713ca12264ead56f859fd3619b27e49072456a /kernel | |
parent | 09b56adc98e0f8a21644fcb4d20ad367c3fceb55 (diff) |
sched: fix crash in sys_sched_rr_get_interval()
Luiz Fernando N. Capitulino reported that sched_rr_get_interval()
crashes for SCHED_OTHER tasks that are on an idle runqueue.
The fix is to return a 0 timeslice for tasks that are on an idle
runqueue. (and which are not running, obviously)
this also shrinks the code a bit:
text data bss dec hex filename
47903 3934 336 52173 cbcd sched.o.before
47885 3934 336 52155 cbbb sched.o.after
Reported-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 59ff6b140edb..b062856b946c 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -4850,17 +4850,21 @@ long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval) | |||
4850 | if (retval) | 4850 | if (retval) |
4851 | goto out_unlock; | 4851 | goto out_unlock; |
4852 | 4852 | ||
4853 | if (p->policy == SCHED_FIFO) | 4853 | /* |
4854 | time_slice = 0; | 4854 | * Time slice is 0 for SCHED_FIFO tasks and for SCHED_OTHER |
4855 | else if (p->policy == SCHED_RR) | 4855 | * tasks that are on an otherwise idle runqueue: |
4856 | */ | ||
4857 | time_slice = 0; | ||
4858 | if (p->policy == SCHED_RR) { | ||
4856 | time_slice = DEF_TIMESLICE; | 4859 | time_slice = DEF_TIMESLICE; |
4857 | else { | 4860 | } else { |
4858 | struct sched_entity *se = &p->se; | 4861 | struct sched_entity *se = &p->se; |
4859 | unsigned long flags; | 4862 | unsigned long flags; |
4860 | struct rq *rq; | 4863 | struct rq *rq; |
4861 | 4864 | ||
4862 | rq = task_rq_lock(p, &flags); | 4865 | rq = task_rq_lock(p, &flags); |
4863 | time_slice = NS_TO_JIFFIES(sched_slice(cfs_rq_of(se), se)); | 4866 | if (rq->cfs.load.weight) |
4867 | time_slice = NS_TO_JIFFIES(sched_slice(&rq->cfs, se)); | ||
4864 | task_rq_unlock(rq, &flags); | 4868 | task_rq_unlock(rq, &flags); |
4865 | } | 4869 | } |
4866 | read_unlock(&tasklist_lock); | 4870 | read_unlock(&tasklist_lock); |