• Tejun Heo's avatar
    workqueue: carry cpu number in work data once execution starts · 7a22ad75
    Tejun Heo authored
    To implement non-reentrant workqueue, the last gcwq a work was
    executed on must be reliably obtainable as long as the work structure
    is valid even if the previous workqueue has been destroyed.
    
    To achieve this, work->data will be overloaded to carry the last cpu
    number once execution starts so that the previous gcwq can be located
    reliably.  This means that cwq can't be obtained from work after
    execution starts but only gcwq.
    
    Implement set_work_{cwq|cpu}(), get_work_[g]cwq() and
    clear_work_data() to set work data to the cpu number when starting
    execution, access the overloaded work data and clear it after
    cancellation.
    
    queue_delayed_work_on() is updated to preserve the last cpu while
    in-flight in timer and other callers which depended on getting cwq
    from work after execution starts are converted to depend on gcwq
    instead.
    
    * Anton Blanchard fixed compile error on powerpc due to missing
      linux/threads.h include.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Anton Blanchard <anton@samba.org>
    7a22ad75
workqueue.c 64.6 KB