|
@@ -48,6 +48,7 @@
|
|
#include <linux/moduleparam.h>
|
|
#include <linux/moduleparam.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/sched/isolation.h>
|
|
#include <linux/sched/isolation.h>
|
|
|
|
+#include <linux/nmi.h>
|
|
|
|
|
|
#include "workqueue_internal.h"
|
|
#include "workqueue_internal.h"
|
|
|
|
|
|
@@ -4463,6 +4464,12 @@ void show_workqueue_state(void)
|
|
if (pwq->nr_active || !list_empty(&pwq->delayed_works))
|
|
if (pwq->nr_active || !list_empty(&pwq->delayed_works))
|
|
show_pwq(pwq);
|
|
show_pwq(pwq);
|
|
spin_unlock_irqrestore(&pwq->pool->lock, flags);
|
|
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");
|
|
pr_cont("\n");
|
|
next_pool:
|
|
next_pool:
|
|
spin_unlock_irqrestore(&pool->lock, flags);
|
|
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();
|
|
rcu_read_unlock_sched();
|