sched: Fix cross-sched-class wakeup preemption
PATCH 25/28 sched: Fix cross-sched-class wakeup preemption
Commit: 1e5a74059f9059d330744eac84873b1b99657008 upstream
Author: Peter Zijlstra <[email protected]>
AuthorDate: Sun Oct 31 12:37:04 2010 +0100
Instead of dealing with sched classes inside each check_preempt_curr() implementation, pull out this logic into the generic wakeup preemption path.
This fixes a hang in KVM (and others) where we are waiting for the stop machine thread to run ...
Reported-by Markus Trippelsdorf <[email protected]>
Tested-by Marcelo Tosatti <[email protected]>
Tested-by Sergey Senozhatsky <[email protected]>
Signed-off-by Peter Zijlstra <[email protected]>
LKML-Reference: <1288891946.2039.31.camel@laptop>
Signed-off-by Ingo Molnar <[email protected]>
Signed-off-by Mike Galbraith <[email protected]>
Acked-by Peter Zijlstra <[email protected]>
--- kernel/sched.c | 24 +++++++++++++++++++----- 1 files changed, 19 insertions(+), 5 deletions(-)
kernel/sched.c +19 -5
@@ -594,11 +594,7 @@ struct rq { static DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); -static inline -void check_preempt_curr (struct rq *rq,struct task_struct *p,int flags) -{ - rq->curr->sched_class->check_preempt_curr (rq, p, flags); -} +static void check_preempt_curr (struct rq *rq,struct task_struct *p,int flags);static inline int cpu_of (struct rq *rq) {
@@ -2392,6 +2388,24 @@ void task_oncpu_function_call(struct task_struct *p,preempt_enable (); } +static void check_preempt_curr (struct rq *rq,struct task_struct *p,int flags) +{ +const struct sched_class *class; + +if (p->sched_class == rq->curr->sched_class) { + rq->curr->sched_class->check_preempt_curr (rq, p, flags); + }else { +for_each_class (class) { +if (class == rq->curr->sched_class) +break ; +if (class == p->sched_class) { +resched_task (rq->curr); +break ; + } + } + } +} +#ifdef CONFIG_SMP /* * ->cpus_allowed is protected by either TASK_WAKING or rq->lock held.
Signature · 1 line
1.7.4