diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index c29f2dc0f4fc..99ee9b939264 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1356,9 +1356,15 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,  	if (!(wq->flags & WQ_UNBOUND)) {  		struct global_cwq *gcwq = get_work_gcwq(work); -		if (gcwq && gcwq->cpu != WORK_CPU_UNBOUND) +		/* +		 * If we cannot get the last gcwq from @work directly, +		 * select the last CPU such that it avoids unnecessarily +		 * triggering non-reentrancy check in __queue_work(). +		 */ +		lcpu = cpu; +		if (gcwq)  			lcpu = gcwq->cpu; -		else +		if (lcpu == WORK_CPU_UNBOUND)  			lcpu = raw_smp_processor_id();  	} else {  		lcpu = WORK_CPU_UNBOUND;  | 
