Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Oct 2015 15:48:44 +0000 (UTC)
From:      Colin Percival <cperciva@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r289032 - in stable/10: sbin/init sys/dev/acpica sys/kern sys/sys
Message-ID:  <201510081548.t98Fmi2V005101@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cperciva
Date: Thu Oct  8 15:48:44 2015
New Revision: 289032
URL: https://svnweb.freebsd.org/changeset/base/289032

Log:
  MFC r288446: Disable suspend during shutdown.

Modified:
  stable/10/sbin/init/init.c
  stable/10/sys/dev/acpica/acpi.c
  stable/10/sys/kern/kern_shutdown.c
  stable/10/sys/sys/systm.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/init/init.c
==============================================================================
--- stable/10/sbin/init/init.c	Thu Oct  8 15:38:34 2015	(r289031)
+++ stable/10/sbin/init/init.c	Thu Oct  8 15:48:44 2015	(r289032)
@@ -1499,6 +1499,15 @@ static state_func_t
 death(void)
 {
 	session_t *sp;
+	int block, blocked;
+	size_t len;
+
+	/* Temporarily block suspend. */
+	len = sizeof(blocked);
+	block = 1;
+	if (sysctlbyname("kern.suspend_blocked", &blocked, &len,
+	    &block, sizeof(block)) == -1)
+		blocked = 0;
 
 	/*
 	 * Also revoke the TTY here.  Because runshutdown() may reopen
@@ -1515,6 +1524,11 @@ death(void)
 	/* Try to run the rc.shutdown script within a period of time */
 	runshutdown();
 
+	/* Unblock suspend if we blocked it. */
+	if (!blocked)
+		sysctlbyname("kern.suspend_blocked", NULL, NULL,
+		    &blocked, sizeof(blocked));
+
 	return (state_func_t) death_single;
 }
 

Modified: stable/10/sys/dev/acpica/acpi.c
==============================================================================
--- stable/10/sys/dev/acpica/acpi.c	Thu Oct  8 15:38:34 2015	(r289031)
+++ stable/10/sys/dev/acpica/acpi.c	Thu Oct  8 15:48:44 2015	(r289032)
@@ -2546,8 +2546,11 @@ acpi_ReqSleepState(struct acpi_softc *sc
     if (!acpi_sleep_states[state])
 	return (EOPNOTSUPP);
 
-    /* If a suspend request is already in progress, just return. */
-    if (sc->acpi_next_sstate != 0) {
+    /*
+     * If a reboot/shutdown/suspend request is already in progress or
+     * suspend is blocked due to an upcoming shutdown, just return.
+     */
+    if (rebooting || sc->acpi_next_sstate != 0 || suspend_blocked) {
 	return (0);
     }
 

Modified: stable/10/sys/kern/kern_shutdown.c
==============================================================================
--- stable/10/sys/kern/kern_shutdown.c	Thu Oct  8 15:38:34 2015	(r289031)
+++ stable/10/sys/kern/kern_shutdown.c	Thu Oct  8 15:48:44 2015	(r289032)
@@ -139,6 +139,10 @@ static int show_busybufs = 1;
 SYSCTL_INT(_kern_shutdown, OID_AUTO, show_busybufs, CTLFLAG_RW,
 	&show_busybufs, 0, "");
 
+int suspend_blocked = 0;
+SYSCTL_INT(_kern, OID_AUTO, suspend_blocked, CTLFLAG_RW,
+	&suspend_blocked, 0, "Block suspend due to a pending shutdown");
+
 /*
  * Variable panicstr contains argument to first call to panic; used as flag
  * to indicate that the kernel has already called panic.

Modified: stable/10/sys/sys/systm.h
==============================================================================
--- stable/10/sys/sys/systm.h	Thu Oct  8 15:38:34 2015	(r289031)
+++ stable/10/sys/sys/systm.h	Thu Oct  8 15:48:44 2015	(r289032)
@@ -46,6 +46,7 @@
 #include <sys/stdint.h>		/* for people using printf mainly */
 
 extern int cold;		/* nonzero if we are doing a cold boot */
+extern int suspend_blocked;	/* block suspend due to pending shutdown */
 extern int rebooting;		/* kern_reboot() has been called. */
 extern const char *panicstr;	/* panic message */
 extern char version[];		/* system version */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510081548.t98Fmi2V005101>