diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 15 | 
1 files changed, 14 insertions, 1 deletions
| diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 43d18cb46308..8c34981d90ad 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -48,6 +48,7 @@  #include <linux/moduleparam.h>  #include <linux/uaccess.h>  #include <linux/sched/isolation.h> +#include <linux/nmi.h>  #include "workqueue_internal.h" @@ -2135,7 +2136,7 @@ __acquires(&pool->lock)  	 * stop_machine. At the same time, report a quiescent RCU state so  	 * the same condition doesn't freeze RCU.  	 */ -	cond_resched_rcu_qs(); +	cond_resched();  	spin_lock_irq(&pool->lock); @@ -4463,6 +4464,12 @@ void show_workqueue_state(void)  			if (pwq->nr_active || !list_empty(&pwq->delayed_works))  				show_pwq(pwq);  			spin_unlock_irqrestore(&pwq->pool->lock, flags); +			/* +			 * We could be printing a lot from atomic context, e.g. +			 * sysrq-t -> show_workqueue_state(). Avoid triggering +			 * hard lockup. +			 */ +			touch_nmi_watchdog();  		}  	} @@ -4490,6 +4497,12 @@ void show_workqueue_state(void)  		pr_cont("\n");  	next_pool:  		spin_unlock_irqrestore(&pool->lock, flags); +		/* +		 * We could be printing a lot from atomic context, e.g. +		 * sysrq-t -> show_workqueue_state(). Avoid triggering +		 * hard lockup. +		 */ +		touch_nmi_watchdog();  	}  	rcu_read_unlock_sched(); |