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)
commitc8122638e3c290bdc9fd210e0746f64f7aa0ae43
tree7f1988050d32bcab50468b0bf4afb2556b638d68
parent05a1f2c94ee1f31a06c2597c59df908905905c03
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