sched/rt: Fix picking RT and DL tasks from empty queue
authorKirill Tkhai <ktkhai@parallels.com>
Tue, 4 Mar 2014 15:25:46 +0000 (19:25 +0400)
committerIngo Molnar <mingo@kernel.org>
Tue, 11 Mar 2014 11:05:35 +0000 (12:05 +0100)
commit734ff2a71f9e6aa6fedfa5a9a34818b8586516d5
tree50ee9626f98a1849c98a6d7308e259e4ad93b889
parenta02ed5e3e05ec5e8af21e645cccc77f3a6480aaf
sched/rt: Fix picking RT and DL tasks from empty queue

The problems:

1) We check for rt_nr_running before call of put_prev_task().
   If previous task is RT, its rt_rq may become throttled
   and dequeued after this call.

In case of p is from rt->rq this just causes picking a task
from throttled queue, but in case of its rt_rq is child
we are guaranteed catch BUG_ON.

2) The same with deadline class. The only difference we operate
   on only dl_rq.

This patch fixes all the above problems and it adds a small skip in the
DL update like we've already done for RT class:

if (unlikely((s64)delta_exec <= 0))
return;

This will optimize sequential update_curr_dl() calls a little.

Signed-off-by: Kirill Tkhai <ktkhai@parallels.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Juri Lelli <juri.lelli@gmail.com>
Link: http://lkml.kernel.org/r/1393946746.3643.3.camel@tkhai
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/deadline.c
kernel/sched/rt.c