lkml.org 
[lkml]   [2012]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [BUG] TASK_DEAD task is able to be woken up in special condition
    On 01/26, Peter Zijlstra wrote:
    >
    > So since we never call schedule() the p->on_rq thing will always be
    > true. This means we don't need to consider all the icky ttwu after that,
    > it also means the whole thing is inside ->pi_lock.
    >
    > So we only have to consider the exact case Yasunori-San illustrated, and
    > waiting on ->pi_lock is sufficient.

    Yes, and this is why I think Yasunori-san's patch should work. Because,
    to remind, it adds unlock_wait(pi_lock).

    > However I think your proposal:
    >
    > > for (;;) {
    > > tsk->state = TASK_DEAD;
    > > schedule();
    > > }
    >
    > should equally work, if we hit the race and call schedule() with ->state
    > = TASK_RUNNING,

    Yes, in this case everything is fine, but we can shedule() with TASK_DEAD
    state. preempt_disable() can't (and shouldn't) prevent deactivate_task().

    To simplify, try_to_wake_up() does

    spin_lock(pi_lock);

    if (!(p->state & state))
    goto out;

    /* WINDOW */

    if (p->on_rq) {
    ... everything is fine ...
    }

    p->state = TASK_WAKING;
    ttwu_queue(p, cpu);

    And the exiting task does

    // but do not sleep ...
    current->state = TASK_UNINTERRUPTIBLE;
    // ttwu() checks ->state
    ...
    tsk->state = TASK_DEAD;
    schedule();
    -> deactivate_task();
    -> tsk->on_rq = 0;
    -> finish_task_switch();

    // ttwu() checks ->on_rq

    In theory it can do this all in the WINDOW above. In this case we
    can wake it up again, after finish_task_switch()-put_task_struct().

    No?

    Oleg.



    \
     
     \ /
      Last update: 2012-01-26 17:35    [W:2.693 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site