diff options
author | Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com> | 2018-01-10 19:53:35 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-01-12 14:39:49 -0500 |
commit | 62635ea8c18f0f62df4cc58379e4f1d33afd5801 (patch) | |
tree | 31dbe0ad060063595b2c088e5d1ccd88bde93974 /kernel/workqueue.c | |
parent | 01dfee9582d9b4403c4902df096ed8b43d55181c (diff) |
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 @@ | |||
48 | #include <linux/moduleparam.h> | 48 | #include <linux/moduleparam.h> |
49 | #include <linux/uaccess.h> | 49 | #include <linux/uaccess.h> |
50 | #include <linux/sched/isolation.h> | 50 | #include <linux/sched/isolation.h> |
51 | #include <linux/nmi.h> | ||
51 | 52 | ||
52 | #include "workqueue_internal.h" | 53 | #include "workqueue_internal.h" |
53 | 54 | ||
@@ -4463,6 +4464,12 @@ void show_workqueue_state(void) | |||
4463 | if (pwq->nr_active || !list_empty(&pwq->delayed_works)) | 4464 | if (pwq->nr_active || !list_empty(&pwq->delayed_works)) |
4464 | show_pwq(pwq); | 4465 | show_pwq(pwq); |
4465 | spin_unlock_irqrestore(&pwq->pool->lock, flags); | 4466 | spin_unlock_irqrestore(&pwq->pool->lock, flags); |
4467 | /* | ||
4468 | * We could be printing a lot from atomic context, e.g. | ||
4469 | * sysrq-t -> show_workqueue_state(). Avoid triggering | ||
4470 | * hard lockup. | ||
4471 | */ | ||
4472 | touch_nmi_watchdog(); | ||
4466 | } | 4473 | } |
4467 | } | 4474 | } |
4468 | 4475 | ||
@@ -4490,6 +4497,12 @@ void show_workqueue_state(void) | |||
4490 | pr_cont("\n"); | 4497 | pr_cont("\n"); |
4491 | next_pool: | 4498 | next_pool: |
4492 | spin_unlock_irqrestore(&pool->lock, flags); | 4499 | spin_unlock_irqrestore(&pool->lock, flags); |
4500 | /* | ||
4501 | * We could be printing a lot from atomic context, e.g. | ||
4502 | * sysrq-t -> show_workqueue_state(). Avoid triggering | ||
4503 | * hard lockup. | ||
4504 | */ | ||
4505 | touch_nmi_watchdog(); | ||
4493 | } | 4506 | } |
4494 | 4507 | ||
4495 | rcu_read_unlock_sched(); | 4508 | rcu_read_unlock_sched(); |