sched/deadline: Fix sched_yield() behavior
authorJuri Lelli <juri.lelli@gmail.com>
Tue, 15 Apr 2014 11:49:04 +0000 (13:49 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 7 May 2014 09:51:31 +0000 (11:51 +0200)
commit5bfd126e80dca70431aef8fdbc1cf14535f3c338
tree7f1988050d32bcab50468b0bf4afb2556b638d68
parent2d513868e2a33e1d5315490ef4c861ee65babd65
sched/deadline: Fix sched_yield() behavior

yield_task_dl() is broken:

 o it forces current to be throttled setting its runtime to zero;
 o it sets current's dl_se->dl_new to one, expecting that dl_task_timer()
   will queue it back with proper parameters at replenish time.

Unfortunately, dl_task_timer() has this check at the very beginning:

if (!dl_task(p) || dl_se->dl_new)
goto unlock;

So, it just bails out and the task is never replenished. It actually
yielded forever.

To fix this, introduce a new flag indicating that the task properly yielded
the CPU before its current runtime expired. While this is a little overdoing
at the moment, the flag would be useful in the future to discriminate between
"good" jobs (of which remaining runtime could be reclaimed, i.e. recycled)
and "bad" jobs (for which dl_throttled task has been set) that needed to be
stopped.

Reported-by: yjay.kim <yjay.kim@lge.com>
Signed-off-by: Juri Lelli <juri.lelli@gmail.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20140429103953.e68eba1b2ac3309214e3dc5a@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/linux/sched.h
kernel/sched/core.c
kernel/sched/deadline.c