lkml.org 
[lkml]   [2007]   [Jan]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] fix-flush_workqueue-vs-cpu_dead-race-update
    ( Srivatsa, Gautham, could you please verify my thinking ? )

    On top of fix-flush_workqueue-vs-cpu_dead-race.patch

    hotplug_sequence is incremented under "case CPU_DEAD:". This was ok
    before flush_workqueue() was changed to use preempt_disable() instead
    of workqueue_mutex. However preempt_disable() can't garantee that there
    is no CPU_DEAD event in progress (it is possible that flush_workqueue()
    runs after STOPMACHINE_EXIT), so flush_workqueue() can miss CPU_DEAD
    event.

    Increment hotplug_sequence earlier, under CPU_DOWN_PREPARE. We can't
    miss the event, the task running flush_workqueue() will be re-scheduled
    at least once before CPU actually disappears from cpu_online_map.

    We may have a false positive but this is very unlikely and only means
    we will have one unneeded "goto again".

    Note: this patch depends on
    handle-cpu_lock_acquire-and-cpu_lock_release-in-workqueue_cpu_callback
    but only "textually".

    Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>

    --- mm-6.20-rc3/kernel/workqueue.c~1_down 2007-01-06 16:15:59.000000000 +0300
    +++ mm-6.20-rc3/kernel/workqueue.c 2007-01-06 17:52:10.000000000 +0300
    @@ -886,12 +886,15 @@ static int __devinit workqueue_cpu_callb
    }
    break;

    + case CPU_DOWN_PREPARE:
    + hotplug_sequence++;
    + break;
    +
    case CPU_DEAD:
    list_for_each_entry(wq, &workqueues, list)
    cleanup_workqueue_thread(wq, hotcpu);
    list_for_each_entry(wq, &workqueues, list)
    take_over_work(wq, hotcpu);
    - hotplug_sequence++;
    break;

    case CPU_LOCK_RELEASE:
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-01-06 16:13    [W:4.173 / U:0.508 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site