diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 32 | 
1 files changed, 10 insertions, 22 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index c66912be990f..b010eac595d2 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -2851,19 +2851,6 @@ already_gone:  	return false;  } -static bool __flush_work(struct work_struct *work) -{ -	struct wq_barrier barr; - -	if (start_flush_work(work, &barr)) { -		wait_for_completion(&barr.done); -		destroy_work_on_stack(&barr.work); -		return true; -	} else { -		return false; -	} -} -  /**   * flush_work - wait for a work to finish executing the last queueing instance   * @work: the work to flush @@ -2877,10 +2864,18 @@ static bool __flush_work(struct work_struct *work)   */  bool flush_work(struct work_struct *work)  { +	struct wq_barrier barr; +  	lock_map_acquire(&work->lockdep_map);  	lock_map_release(&work->lockdep_map); -	return __flush_work(work); +	if (start_flush_work(work, &barr)) { +		wait_for_completion(&barr.done); +		destroy_work_on_stack(&barr.work); +		return true; +	} else { +		return false; +	}  }  EXPORT_SYMBOL_GPL(flush_work); @@ -4832,14 +4827,7 @@ long work_on_cpu(int cpu, long (*fn)(void *), void *arg)  	INIT_WORK_ONSTACK(&wfc.work, work_for_cpu_fn);  	schedule_work_on(cpu, &wfc.work); - -	/* -	 * The work item is on-stack and can't lead to deadlock through -	 * flushing.  Use __flush_work() to avoid spurious lockdep warnings -	 * when work_on_cpu()s are nested. -	 */ -	__flush_work(&wfc.work); - +	flush_work(&wfc.work);  	return wfc.ret;  }  EXPORT_SYMBOL_GPL(work_on_cpu);  | 
