summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorGeorge McCollister <george.mccollister@gmail.com>2014-02-18 17:56:51 -0600
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-03-23 21:38:09 -0700
commit84bb5b645ec5a54744180a1edc5dc72adc862457 (patch)
treeb4e782d13dc84a8915e9ac833793ecddfae01724 /include
parent52ed96fc71877b15d1090313cc7b63264bdb466b (diff)
downloadlinux-3.10-84bb5b645ec5a54744180a1edc5dc72adc862457.tar.gz
linux-3.10-84bb5b645ec5a54744180a1edc5dc72adc862457.tar.bz2
linux-3.10-84bb5b645ec5a54744180a1edc5dc72adc862457.zip
sched: Fix double normalization of vruntime
commit 791c9e0292671a3bfa95286bb5c08129d8605618 upstream. dequeue_entity() is called when p->on_rq and sets se->on_rq = 0 which appears to guarentee that the !se->on_rq condition is met. If the task has done set_current_state(TASK_INTERRUPTIBLE) without schedule() the second condition will be met and vruntime will be incorrectly adjusted twice. In certain cases this can result in the task's vruntime never increasing past the vruntime of other tasks on the CFS' run queue, starving them of CPU time. This patch changes switched_from_fair() to use !p->on_rq instead of !se->on_rq. I'm able to cause a task with a priority of 120 to starve all other tasks with the same priority on an ARM platform running 3.2.51-rt72 PREEMPT RT by writing one character at time to a serial tty (16550 UART) in a tight loop. I'm also able to verify making this change corrects the problem on that platform and kernel version. Signed-off-by: George McCollister <george.mccollister@gmail.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1392767811-28916-1-git-send-email-george.mccollister@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include')
0 files changed, 0 insertions, 0 deletions