Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Jan 2006 23:21:55 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 89388 for review
Message-ID:  <200601082321.k08NLtAA071267@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=89388

Change 89388 by kmacy@kmacy:freebsd7_xen3 on 2006/01/08 23:21:06

	add support for controlling reboot and shutdown via xm
	don't unconditionally call SHUTDOWN_crash in shutdown_panic
	don't call kfree in xenbus.h macro

Affected files ...

.. //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#5 edit
.. //depot/projects/xen3/src/sys/i386-xen/include/xenbus.h#2 edit
.. //depot/projects/xen3/src/sys/kern/kern_shutdown.c#4 edit

Differences ...

==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#5 (text+ko) ====

@@ -39,6 +39,7 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/reboot.h>
+#include <sys/sysproto.h>
 
 
 #include <vm/vm.h>
@@ -52,6 +53,8 @@
 #include <machine/intr_machdep.h>
 #include <machine/md_var.h>
 #include <machine/asmacros.h>
+#include <machine/xenbus.h>
+
 
 #include <sys/socket.h>
 #include <sys/sockio.h>
@@ -571,6 +574,74 @@
 };
 
 
+static void shutdown_handler(struct xenbus_watch *watch,
+			     const char **vec, unsigned int len)
+{
+	char *str;
+	struct xenbus_transaction *xbt;
+	int err, howto;
+	struct reboot_args uap;
+	
+	howto = 0;
+
+ again:
+	xbt = xenbus_transaction_start();
+	if (IS_ERR(xbt))
+		return;
+	str = (char *)xenbus_read(xbt, "control", "shutdown", NULL);
+	/* Ignore read errors and empty reads. */
+	if (XENBUS_IS_ERR_READ(str)) {
+		xenbus_transaction_end(xbt, 1);
+		return;
+	}
+
+	xenbus_write(xbt, "control", "shutdown", "");
+
+	err = xenbus_transaction_end(xbt, 0);
+	if (err == EAGAIN) {
+		free(str, M_DEVBUF);
+		goto again;
+	}
+
+	if (strcmp(str, "reboot") == 0)
+		howto = 0;
+	else if (strcmp(str, "poweroff") == 0)
+		howto |= (RB_POWEROFF | RB_HALT);
+	else if (strcmp(str, "halt") == 0)
+		howto |= RB_HALT;
+#ifdef notyet
+	else if (strcmp(str, "suspend") == 0)
+		shutting_down = SHUTDOWN_SUSPEND;
+#endif
+	else {
+		printf("Ignoring shutdown request: %s\n", str);
+		goto done;
+	}
+
+	uap.opt = howto;
+	reboot(curthread, &uap);
+ done:
+	free(str, M_DEVBUF);
+}
+
+static struct xenbus_watch shutdown_watch = {
+	.node = "control/shutdown",
+	.callback = shutdown_handler
+};
+
+
+static void
+setup_shutdown_watcher(void *unused)
+{
+	if (register_xenbus_watch(&shutdown_watch))
+		printf("Failed to set shutdown watcher\n");
+}
+
+
+SYSINIT(shutdown, SI_SUB_PSEUDO, SI_ORDER_ANY, setup_shutdown_watcher, NULL)
+
+
+
 /********** CODE WORTH KEEPING ABOVE HERE *****************/ 
 
 void xen_failsafe_handler(void);

==== //depot/projects/xen3/src/sys/i386-xen/include/xenbus.h#2 (text+ko) ====

@@ -161,7 +161,7 @@
 
 #define XENBUS_IS_ERR_READ(str) ({			\
 	if (!IS_ERR(str) && strlen(str) == 0) {		\
-		kfree(str);				\
+		free(str, M_DEVBUF);				\
 		str = ERR_PTR(-ERANGE);			\
 	}						\
 	IS_ERR(str);					\

==== //depot/projects/xen3/src/sys/kern/kern_shutdown.c#4 (text+ko) ====

@@ -439,11 +439,12 @@
 {
 	int loop;
 
+
+
+	if (howto & RB_DUMP) {
 #ifdef XEN
-	HYPERVISOR_sched_op(SCHEDOP_shutdown, SHUTDOWN_crash);
+		HYPERVISOR_sched_op(SCHEDOP_shutdown, SHUTDOWN_crash);
 #endif
-
-	if (howto & RB_DUMP) {
 		if (PANIC_REBOOT_WAIT_TIME != 0) {
 			if (PANIC_REBOOT_WAIT_TIME != -1) {
 				printf("Automatic reboot in %d seconds - "



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