diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 9 | 
1 files changed, 9 insertions, 0 deletions
| diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 7f5d4be22034..e93f7b9067d8 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -2201,6 +2201,15 @@ __acquires(&pool->lock)  		dump_stack();  	} +	/* +	 * The following prevents a kworker from hogging CPU on !PREEMPT +	 * kernels, where a requeueing work item waiting for something to +	 * happen could deadlock with stop_machine as such work item could +	 * indefinitely requeue itself while all other CPUs are trapped in +	 * stop_machine. +	 */ +	cond_resched(); +  	spin_lock_irq(&pool->lock);  	/* clear cpu intensive status */ |