• Oleg Nesterov's avatar
    workqueue: don't migrate pending works from the dead CPU · 3af24433
    Oleg Nesterov authored
    Currently CPU_DEAD uses kthread_stop() to stop cwq->thread and then
    transfers cwq->worklist to another CPU.  However, it is very unlikely that
    worker_thread() will notice kthread_should_stop() before flushing
    cwq->worklist.  It is only possible if worker_thread() was preempted after
    run_workqueue(cwq), a new work_struct was added, and CPU_DEAD happened
    before cwq->thread has a chance to run.
    
    This means that take_over_work() mostly adds unneeded complications.  Note
    also that kthread_stop() is not good per se, wake_up_process() may confuse
    work->func() if it sleeps waiting for some event.
    
    Remove take_over_work() and migrate_sequence complications.  CPU_DEAD sets
    the cwq->should_stop flag (introduced by this patch) and waits for
    cwq->thread to flush cwq->worklist and exit.  Because the dead CPU is not
    on cpu_online_map, no more works can be added to that cwq.
    
    cpu_populated_map was introduced to optimize for_each_possible_cpu(), it is
    not strictly needed, and it is more a documentation in fact.
    
    Saves 418 bytes.
    Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Cc: Srivatsa Vaddagiri <vatsa@in.ibm.com>
    Cc: "Pallipadi, Venkatesh" <venkatesh.pallipadi@intel.com>
    Cc: Gautham shenoy <ego@in.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3af24433
workqueue.c 22.2 KB