• Lai Jiangshan's avatar
    workqueue: allow work_on_cpu() to be called recursively · c2fda509
    Lai Jiangshan authored
    
    
    If the @fn call work_on_cpu() again, the lockdep will complain:
    
    > [ INFO: possible recursive locking detected ]
    > 3.11.0-rc1-lockdep-fix-a #6 Not tainted
    > ---------------------------------------------
    > kworker/0:1/142 is trying to acquire lock:
    >  ((&wfc.work)){+.+.+.}, at: [<ffffffff81077100>] flush_work+0x0/0xb0
    >
    > but task is already holding lock:
    >  ((&wfc.work)){+.+.+.}, at: [<ffffffff81075dd9>] process_one_work+0x169/0x610
    >
    > other info that might help us debug this:
    >  Possible unsafe locking scenario:
    >
    >        CPU0
    >        ----
    >   lock((&wfc.work));
    >   lock((&wfc.work));
    >
    >  *** DEADLOCK ***
    
    It is false-positive lockdep report. In this sutiation,
    the two "wfc"s of the two work_on_cpu() are different,
    they are both on stack. flush_work() can't be deadlock.
    
    To fix this, we need to avoid the lockdep checking in this case,
    thus we instroduce a internal __flush_work() which skip the lockdep.
    
    tj: Minor comment adjustment.
    Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    Reported-by: default avatar"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
    Reported-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    c2fda509
workqueue.c 139 KB