• Li Bin's avatar
    workqueue: fix pool ID allocation leakage and remove BUILD_BUG_ON() in init_workqueues · 4e8b22bd
    Li Bin authored
    When one work starts execution, the high bits of work's data contain
    pool ID. It can represent a maximum of WORK_OFFQ_POOL_NONE. Pool ID
    is assigned WORK_OFFQ_POOL_NONE when the work being initialized
    indicating that no pool is associated and get_work_pool() uses it to
    check the associated pool. So if worker_pool_assign_id() assigns a
    ID greater than or equal WORK_OFFQ_POOL_NONE to a pool, it triggers
    leakage, and it may break the non-reentrance guarantee.
    
    This patch fix this issue by modifying the worker_pool_assign_id()
    function calling idr_alloc() by setting @end param WORK_OFFQ_POOL_NONE.
    
    Furthermore, in the current implementation, the BUILD_BUG_ON() in
    init_workqueues makes no sense. The number of worker pools needed
    cannot be determined at compile time, because the number of backing
    pools for UNBOUND workqueues is dynamic based on the assigned custom
    attributes. So remove it.
    
    tj: Minor comment and indentation updates.
    Signed-off-by: default avatarLi Bin <huawei.libin@huawei.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    4e8b22bd
workqueue.c 141 KB