• T
    workqueue: use worker_set/clr_flags() only from worker itself · cb444766
    Tejun Heo 提交于
    worker_set/clr_flags() assume that if none of NOT_RUNNING flags is set
    the worker must be contributing to nr_running which is only true if
    the worker is actually running.
    
    As when called from self, it is guaranteed that the worker is running,
    those functions can be safely used from the worker itself and they
    aren't necessary from other places anyway.  Make the following changes
    to fix the bug.
    
    * Make worker_set/clr_flags() whine if not called from self.
    
    * Convert all places which called those functions from other tasks to
      manipulate flags directly.
    
    * Make trustee_thread() directly clear nr_running after setting
      WORKER_ROGUE on all workers.  This is the only place where
      nr_running manipulation is necessary outside of workers themselves.
    
    * While at it, add sanity check for nr_running in worker_enter_idle().
    Signed-off-by: NTejun Heo <tj@kernel.org>
    cb444766
workqueue.c 93.8 KB