diff options
author | Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com> | 2018-01-11 09:53:35 +0900 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-01-12 11:39:49 -0800 |
commit | 62635ea8c18f0f62df4cc58379e4f1d33afd5801 (patch) | |
tree | 31dbe0ad060063595b2c088e5d1ccd88bde93974 /kernel/workqueue.c | |
parent | 01dfee9582d9b4403c4902df096ed8b43d55181c (diff) | |
download | linux-stable-62635ea8c18f0f62df4cc58379e4f1d33afd5801.tar.gz linux-stable-62635ea8c18f0f62df4cc58379e4f1d33afd5801.tar.bz2 linux-stable-62635ea8c18f0f62df4cc58379e4f1d33afd5801.zip |
workqueue: avoid hard lockups in show_workqueue_state()
show_workqueue_state() can print out a lot of messages while being in
atomic context, e.g. sysrq-t -> show_workqueue_state(). If the console
device is slow it may end up triggering NMI hard lockup watchdog.
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: stable@vger.kernel.org # v4.5+
Diffstat (limited to 'kernel/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 43d18cb46308..f699122dab32 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" @@ -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(); |