• Lai Jiangshan's avatar
    workqueue: make work->data point to pool after try_to_grab_pending() · 4468a00f
    Lai Jiangshan authored
    We plan to use work->data pointing to cwq as the synchronization
    invariant when determining whether a given work item is on a locked
    pool or not, which requires work->data pointing to cwq only while the
    work item is queued on the associated pool.
    
    With delayed_work updated not to overload work->data for target
    workqueue recording, the only case where we still have off-queue
    work->data pointing to cwq is try_to_grab_pending() which doesn't
    update work->data after stealing a queued work item.  There's no
    reason for try_to_grab_pending() to not update work->data to point to
    the pool instead of cwq, like the normal execution does.
    
    This patch adds set_work_pool_and_keep_pending() which makes
    work->data point to pool instead of cwq but keeps the pending bit
    unlike set_work_pool_and_clear_pending() (surprise!).
    
    After this patch, it's guaranteed that only queued work items point to
    cwqs.
    
    This patch doesn't introduce any visible behavior change.
    
    tj: Renamed the new helper function to match
        set_work_pool_and_clear_pending() and rewrote the description.
    Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    4468a00f
workqueue.c 105 KB