• T
    workqueue: apply __WQ_ORDERED to create_singlethread_workqueue() · e09c2c29
    Tejun Heo 提交于
    create_singlethread_workqueue() is a compat interface for single
    threaded workqueue which maps to ordered workqueue w/ rescuer in the
    current implementation.  create_singlethread_workqueue() currently
    implemented by invoking alloc_workqueue() w/ appropriate parameters.
    
    8719dcea ("workqueue: reject adjusting max_active or applying
    attrs to ordered workqueues") introduced __WQ_ORDERED to protect
    ordered workqueues against dynamic attribute changes which can break
    ordering guarantees but forgot to apply it to
    create_singlethread_workqueue().  This in itself is okay as nobody
    currently uses dynamic attribute change on workqueues created with
    create_singlethread_workqueue().
    
    However, 4c16bd32 ("workqueue: implement NUMA affinity for unbound
    workqueues") broke singlethreaded guarantee for ordered workqueues
    through allocating a separate pool_workqueue on each NUMA node by
    default.  A later change 8a2b7538 ("workqueue: fix ordered
    workqueues in NUMA setups") fixed it by allocating only one global
    pool_workqueue if __WQ_ORDERED is set.
    
    Combined, the __WQ_ORDERED omission in create_singlethread_workqueue()
    became critical breaking its single threadedness and ordering
    guarantee.
    
    Let's make create_singlethread_workqueue() wrap
    alloc_ordered_workqueue() instead so that it inherits __WQ_ORDERED and
    can implicitly track future ordered_workqueue changes.
    
    v2: I missed that __WQ_ORDERED now protects against pwq splitting
        across NUMA nodes and incorrectly described the patch as a
        nice-to-have fix to protect against future dynamic attribute
        usages.  Oleg pointed out that this is actually a critical
        breakage due to 8a2b7538 ("workqueue: fix ordered workqueues
        in NUMA setups").
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Reported-by: NMike Anderson <mike.anderson@us.ibm.com>
    Cc: Oleg Nesterov <onestero@redhat.com>
    Cc: Gustavo Luiz Duarte <gduarte@redhat.com>
    Cc: Tomas Henzl <thenzl@redhat.com>
    Cc: stable@vger.kernel.org
    Fixes: 4c16bd32 ("workqueue: implement NUMA affinity for unbound workqueues")
    e09c2c29
workqueue.h 19.0 KB