• T
    workqueue: make single thread workqueue shared worker pool friendly · 502ca9d8
    Tejun Heo 提交于
    Reimplement st (single thread) workqueue so that it's friendly to
    shared worker pool.  It was originally implemented by confining st
    workqueues to use cwq of a fixed cpu and always having a worker for
    the cpu.  This implementation isn't very friendly to shared worker
    pool and suboptimal in that it ends up crossing cpu boundaries often.
    
    Reimplement st workqueue using dynamic single cpu binding and
    cwq->limit.  WQ_SINGLE_THREAD is replaced with WQ_SINGLE_CPU.  In a
    single cpu workqueue, at most single cwq is bound to the wq at any
    given time.  Arbitration is done using atomic accesses to
    wq->single_cpu when queueing a work.  Once bound, the binding stays
    till the workqueue is drained.
    
    Note that the binding is never broken while a workqueue is frozen.
    This is because idle cwqs may have works waiting in delayed_works
    queue while frozen.  On thaw, the cwq is restarted if there are any
    delayed works or unbound otherwise.
    
    When combined with max_active limit of 1, single cpu workqueue has
    exactly the same execution properties as the original single thread
    workqueue while allowing sharing of per-cpu workers.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    502ca9d8
workqueue.h 9.7 KB