Browse Source

Merge branch 'for-4.15-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq

Pull workqueue fixlet from Tejun Heo:
 "One patch to add touch_nmi_watchdog() while dumping workqueue debug
  messages to avoid triggering the lockup detector spuriously.

  The change is very low risk"

* 'for-4.15-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:
  workqueue: avoid hard lockups in show_workqueue_state()
Linus Torvalds 7 years ago
parent
commit
a2c9c1c035
1 changed files with 13 additions and 0 deletions
  1. 13 0
      kernel/workqueue.c

+ 13 - 0
kernel/workqueue.c

@@ -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();