• Xuewen Yan's avatar
    workqueue: Add rcu lock check at the end of work item execution · 1a65a6d1
    Xuewen Yan authored
    
    
    Currently the workqueue just checks the atomic and locking states after work
    execution ends. However, sometimes, a work item may not unlock rcu after
    acquiring rcu_read_lock(). And as a result, it would cause rcu stall, but
    the rcu stall warning can not dump the work func, because the work has
    finished.
    
    In order to quickly discover those works that do not call rcu_read_unlock()
    after rcu_read_lock(), add the rcu lock check.
    
    Use rcu_preempt_depth() to check the work's rcu status. Normally, this value
    is 0. If this value is bigger than 0, it means the work are still holding
    rcu lock. If so, print err info and the work func.
    
    tj: Reworded the description for clarity. Minor formatting tweak.
    Signed-off-by: default avatarXuewen Yan <xuewen.yan@unisoc.com>
    Reviewed-by: default avatarLai Jiangshan <jiangshanlai@gmail.com>
    Reviewed-by: default avatarWaiman Long <longman@redhat.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    1a65a6d1
workqueue.c 192 KB