• Tejun Heo's avatar
    workqueue: Fix spurious sanity check failures in destroy_workqueue() · def98c84
    Tejun Heo authored
    Before actually destrying a workqueue, destroy_workqueue() checks
    whether it's actually idle.  If it isn't, it prints out a bunch of
    warning messages and leaves the workqueue dangling.  It unfortunately
    has a couple issues.
    
    * Mayday list queueing increments pwq's refcnts which gets detected as
      busy and fails the sanity checks.  However, because mayday list
      queueing is asynchronous, this condition can happen without any
      actual work items left in the workqueue.
    
    * Sanity check failure leaves the sysfs interface behind too which can
      lead to init failure of newer instances of the workqueue.
    
    This patch fixes the above two by
    
    * If a workqueue has a rescuer, disable and kill the rescuer before
      sanity checks.  Disabling and killing is guaranteed to flush the
      existing mayday list.
    
    * Remove sysfs interface before sanity checks.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarMarcin Pawlowski <mpawlowski@fb.com>
    Reported-by: default avatar"Williams, Gerald S" <gerald.s.williams@intel.com>
    Cc: stable@vger.kernel.org
    def98c84
workqueue.c 164 KB