svn commit: r300671 - in head/sys/compat/linuxkpi/common: include/linux src

Hans Petter Selasky hselasky at FreeBSD.org
Wed May 25 09:04:08 UTC 2016


Author: hselasky
Date: Wed May 25 09:04:06 2016
New Revision: 300671
URL: https://svnweb.freebsd.org/changeset/base/300671

Log:
  Add checks for SCHEDULER_STOPPED() so that code using the LinuxKPI can
  run after a panic(). This for example allows a LinuxKPI based graphics
  stack to receive prints during a panic.
  
  Obtained from:	kmacy @
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/sched.h
  head/sys/compat/linuxkpi/common/include/linux/wait.h
  head/sys/compat/linuxkpi/common/src/linux_compat.c

Modified: head/sys/compat/linuxkpi/common/include/linux/sched.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/sched.h	Wed May 25 09:00:05 2016	(r300670)
+++ head/sys/compat/linuxkpi/common/include/linux/sched.h	Wed May 25 09:04:06 2016	(r300671)
@@ -91,7 +91,7 @@ CTASSERT(sizeof(((struct thread *)0)->td
 do {									\
 	void *c;							\
 									\
-	if (cold)							\
+	if (cold || SCHEDULER_STOPPED())				\
 		break;							\
 	c = curthread;							\
 	sleepq_lock(c);							\

Modified: head/sys/compat/linuxkpi/common/include/linux/wait.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/wait.h	Wed May 25 09:00:05 2016	(r300670)
+++ head/sys/compat/linuxkpi/common/include/linux/wait.h	Wed May 25 09:04:06 2016	(r300671)
@@ -31,6 +31,7 @@
 #ifndef	_LINUX_WAIT_H_
 #define	_LINUX_WAIT_H_
 
+#include <linux/compiler.h>
 #include <linux/spinlock.h>
 #include <linux/sched.h>
 #include <linux/list.h>
@@ -81,6 +82,8 @@ do {									\
 	void *c = &(q).wchan;						\
 	if (!(cond)) {							\
 		for (;;) {						\
+			if (unlikely(SCHEDULER_STOPPED()))		\
+				break;					\
 			sleepq_lock(c);					\
 			if (cond) {					\
 				sleepq_release(c);			\
@@ -100,6 +103,8 @@ do {									\
 	_error = 0;							\
 	if (!(cond)) {							\
 		for (; _error == 0;) {					\
+			if (unlikely(SCHEDULER_STOPPED()))		\
+				break;					\
 			sleepq_lock(c);					\
 			if (cond) {					\
 				sleepq_release(c);			\
@@ -123,6 +128,8 @@ do {									\
 									\
 	if (!(cond)) {							\
 		for (; __rc == 0;) {					\
+			if (unlikely(SCHEDULER_STOPPED()))		\
+				break;					\
 			sleepq_lock(c);					\
 			if (cond) {					\
 				sleepq_release(c);			\

Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c	Wed May 25 09:00:05 2016	(r300670)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c	Wed May 25 09:04:06 2016	(r300671)
@@ -1093,6 +1093,8 @@ linux_complete_common(struct completion 
 long
 linux_wait_for_common(struct completion *c, int flags)
 {
+	if (unlikely(SCHEDULER_STOPPED()))
+		return (0);
 
 	if (flags != 0)
 		flags = SLEEPQ_INTERRUPTIBLE | SLEEPQ_SLEEP;
@@ -1123,6 +1125,9 @@ linux_wait_for_timeout_common(struct com
 {
 	long end = jiffies + timeout;
 
+	if (unlikely(SCHEDULER_STOPPED()))
+		return (0);
+
 	if (flags != 0)
 		flags = SLEEPQ_INTERRUPTIBLE | SLEEPQ_SLEEP;
 	else


More information about the svn-src-all mailing list