• Tejun Heo's avatar
    workqueue: reimplement workqueue flushing using color coded works · 73f53c4a
    Tejun Heo authored
    Reimplement workqueue flushing using color coded works.  wq has the
    current work color which is painted on the works being issued via
    cwqs.  Flushing a workqueue is achieved by advancing the current work
    colors of cwqs and waiting for all the works which have any of the
    previous colors to drain.
    
    Currently there are 16 possible colors, one is reserved for no color
    and 15 colors are useable allowing 14 concurrent flushes.  When color
    space gets full, flush attempts are batched up and processed together
    when color frees up, so even with many concurrent flushers, the new
    implementation won't build up huge queue of flushers which has to be
    processed one after another.
    
    Only works which are queued via __queue_work() are colored.  Works
    which are directly put on queue using insert_work() use NO_COLOR and
    don't participate in workqueue flushing.  Currently only works used
    for work-specific flush fall in this category.
    
    This new implementation leaves only cleanup_workqueue_thread() as the
    user of flush_cpu_workqueue().  Just make its users use
    flush_workqueue() and kthread_stop() directly and kill
    cleanup_workqueue_thread().  As workqueue flushing doesn't use barrier
    request anymore, the comment describing the complex synchronization
    around it in cleanup_workqueue_thread() is removed together with the
    function.
    
    This new implementation is to allow having and sharing multiple
    workers per cpu.
    
    Please note that one more bit is reserved for a future work flag by
    this patch.  This is to avoid shifting bits and updating comments
    later.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    73f53c4a
workqueue.c 37.6 KB