• Tejun Heo's avatar
    workqueue: fix HIGHPRI handling in keep_working() · 30310045
    Tejun Heo authored
    The policy function keep_working() didn't check GCWQ_HIGHPRI_PENDING
    and could return %false with highpri work pending.  This could lead to
    late execution of a highpri work which was delayed due to @max_active
    throttling if other works are actively consuming CPU cycles.
    
    For example, the following could happen.
    
    1. Work W0 which burns CPU cycles.
    
    2. Two works W1 and W2 are queued to a highpri wq w/ @max_active of 1.
    
    3. W1 starts executing and W2 is put to delayed queue.  W0 and W1 are
       both runnable.
    
    4. W1 finishes which puts W2 to pending queue but keep_working()
       incorrectly returns %false and the worker goes to sleep.
    
    5. W0 finishes and W2 starts execution.
    
    With this patch applied, W2 starts execution as soon as W1 finishes.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    30310045
workqueue.c 100 KB