lkml.org 
[lkml]   [2009]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:sched/urgent] sched: Fix broken assertion
    Commit-ID:  077614ee1e93245a3b9a4e1213659405dbeb0ba6
    Gitweb: http://git.kernel.org/tip/077614ee1e93245a3b9a4e1213659405dbeb0ba6
    Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
    AuthorDate: Thu, 17 Dec 2009 13:16:31 +0100
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Thu, 17 Dec 2009 13:22:46 +0100

    sched: Fix broken assertion

    There's a preemption race in the set_task_cpu() debug check in
    that when we get preempted after setting task->state we'd still
    be on the rq proper, but fail the test.

    Check for preempted tasks, since those are always on the RQ.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <20091217121830.137155561@chello.nl>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    ---
    kernel/sched.c | 3 ++-
    1 files changed, 2 insertions(+), 1 deletions(-)

    diff --git a/kernel/sched.c b/kernel/sched.c
    index 7be88a7..720df10 100644
    --- a/kernel/sched.c
    +++ b/kernel/sched.c
    @@ -2041,7 +2041,8 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
    * We should never call set_task_cpu() on a blocked task,
    * ttwu() will sort out the placement.
    */
    - WARN_ON_ONCE(p->state != TASK_RUNNING && p->state != TASK_WAKING);
    + WARN_ON_ONCE(p->state != TASK_RUNNING && p->state != TASK_WAKING &&
    + !(task_thread_info(p)->preempt_count & PREEMPT_ACTIVE));
    #endif

    trace_sched_migrate_task(p, new_cpu);

    \
     
     \ /
      Last update: 2009-12-17 13:35    [W:0.038 / U:0.568 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site