瀏覽代碼

Merge tag 'for-linus-4.9-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen fixes from David Vrabel:

 - advertise control feature flags in xenstore

 - fix x86 build when XEN_PVHVM is disabled

* tag 'for-linus-4.9-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xenbus: check return value of xenbus_scanf()
  xenbus: prefer list_for_each()
  x86: xen: move cpu_up functions out of ifdef
  xenbus: advertise control feature flags
Linus Torvalds 8 年之前
父節點
當前提交
aa34e07e45
共有 4 個文件被更改,包括 36 次插入19 次删除
  1. 2 0
      arch/x86/xen/enlighten.c
  2. 29 16
      drivers/xen/manage.c
  3. 2 2
      drivers/xen/xenbus/xenbus_dev_frontend.c
  4. 3 1
      drivers/xen/xenbus/xenbus_probe_frontend.c

+ 2 - 0
arch/x86/xen/enlighten.c

@@ -1837,6 +1837,7 @@ static void __init init_hvm_pv_info(void)
 
 
 	xen_domain_type = XEN_HVM_DOMAIN;
 	xen_domain_type = XEN_HVM_DOMAIN;
 }
 }
+#endif
 
 
 static int xen_cpu_up_prepare(unsigned int cpu)
 static int xen_cpu_up_prepare(unsigned int cpu)
 {
 {
@@ -1887,6 +1888,7 @@ static int xen_cpu_up_online(unsigned int cpu)
 	return 0;
 	return 0;
 }
 }
 
 
+#ifdef CONFIG_XEN_PVHVM
 #ifdef CONFIG_KEXEC_CORE
 #ifdef CONFIG_KEXEC_CORE
 static void xen_hvm_shutdown(void)
 static void xen_hvm_shutdown(void)
 {
 {

+ 29 - 16
drivers/xen/manage.c

@@ -168,7 +168,9 @@ out:
 #endif	/* CONFIG_HIBERNATE_CALLBACKS */
 #endif	/* CONFIG_HIBERNATE_CALLBACKS */
 
 
 struct shutdown_handler {
 struct shutdown_handler {
-	const char *command;
+#define SHUTDOWN_CMD_SIZE 11
+	const char command[SHUTDOWN_CMD_SIZE];
+	bool flag;
 	void (*cb)(void);
 	void (*cb)(void);
 };
 };
 
 
@@ -206,22 +208,22 @@ static void do_reboot(void)
 	ctrl_alt_del();
 	ctrl_alt_del();
 }
 }
 
 
+static struct shutdown_handler shutdown_handlers[] = {
+	{ "poweroff",	true,	do_poweroff },
+	{ "halt",	false,	do_poweroff },
+	{ "reboot",	true,	do_reboot   },
+#ifdef CONFIG_HIBERNATE_CALLBACKS
+	{ "suspend",	true,	do_suspend  },
+#endif
+};
+
 static void shutdown_handler(struct xenbus_watch *watch,
 static void shutdown_handler(struct xenbus_watch *watch,
 			     const char **vec, unsigned int len)
 			     const char **vec, unsigned int len)
 {
 {
 	char *str;
 	char *str;
 	struct xenbus_transaction xbt;
 	struct xenbus_transaction xbt;
 	int err;
 	int err;
-	static struct shutdown_handler handlers[] = {
-		{ "poweroff",	do_poweroff },
-		{ "halt",	do_poweroff },
-		{ "reboot",	do_reboot   },
-#ifdef CONFIG_HIBERNATE_CALLBACKS
-		{ "suspend",	do_suspend  },
-#endif
-		{NULL, NULL},
-	};
-	static struct shutdown_handler *handler;
+	int idx;
 
 
 	if (shutting_down != SHUTDOWN_INVALID)
 	if (shutting_down != SHUTDOWN_INVALID)
 		return;
 		return;
@@ -238,13 +240,13 @@ static void shutdown_handler(struct xenbus_watch *watch,
 		return;
 		return;
 	}
 	}
 
 
-	for (handler = &handlers[0]; handler->command; handler++) {
-		if (strcmp(str, handler->command) == 0)
+	for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) {
+		if (strcmp(str, shutdown_handlers[idx].command) == 0)
 			break;
 			break;
 	}
 	}
 
 
 	/* Only acknowledge commands which we are prepared to handle. */
 	/* Only acknowledge commands which we are prepared to handle. */
-	if (handler->cb)
+	if (idx < ARRAY_SIZE(shutdown_handlers))
 		xenbus_write(xbt, "control", "shutdown", "");
 		xenbus_write(xbt, "control", "shutdown", "");
 
 
 	err = xenbus_transaction_end(xbt, 0);
 	err = xenbus_transaction_end(xbt, 0);
@@ -253,8 +255,8 @@ static void shutdown_handler(struct xenbus_watch *watch,
 		goto again;
 		goto again;
 	}
 	}
 
 
-	if (handler->cb) {
-		handler->cb();
+	if (idx < ARRAY_SIZE(shutdown_handlers)) {
+		shutdown_handlers[idx].cb();
 	} else {
 	} else {
 		pr_info("Ignoring shutdown request: %s\n", str);
 		pr_info("Ignoring shutdown request: %s\n", str);
 		shutting_down = SHUTDOWN_INVALID;
 		shutting_down = SHUTDOWN_INVALID;
@@ -310,6 +312,9 @@ static struct notifier_block xen_reboot_nb = {
 static int setup_shutdown_watcher(void)
 static int setup_shutdown_watcher(void)
 {
 {
 	int err;
 	int err;
+	int idx;
+#define FEATURE_PATH_SIZE (SHUTDOWN_CMD_SIZE + sizeof("feature-"))
+	char node[FEATURE_PATH_SIZE];
 
 
 	err = register_xenbus_watch(&shutdown_watch);
 	err = register_xenbus_watch(&shutdown_watch);
 	if (err) {
 	if (err) {
@@ -326,6 +331,14 @@ static int setup_shutdown_watcher(void)
 	}
 	}
 #endif
 #endif
 
 
+	for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) {
+		if (!shutdown_handlers[idx].flag)
+			continue;
+		snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
+			 shutdown_handlers[idx].command);
+		xenbus_printf(XBT_NIL, "control", node, "%u", 1);
+	}
+
 	return 0;
 	return 0;
 }
 }
 
 

+ 2 - 2
drivers/xen/xenbus/xenbus_dev_frontend.c

@@ -364,7 +364,7 @@ out:
 
 
 static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
 static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
 {
 {
-	struct watch_adapter *watch, *tmp_watch;
+	struct watch_adapter *watch;
 	char *path, *token;
 	char *path, *token;
 	int err, rc;
 	int err, rc;
 	LIST_HEAD(staging_q);
 	LIST_HEAD(staging_q);
@@ -399,7 +399,7 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
 		}
 		}
 		list_add(&watch->list, &u->watches);
 		list_add(&watch->list, &u->watches);
 	} else {
 	} else {
-		list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) {
+		list_for_each_entry(watch, &u->watches, list) {
 			if (!strcmp(watch->token, token) &&
 			if (!strcmp(watch->token, token) &&
 			    !strcmp(watch->watch.node, path)) {
 			    !strcmp(watch->watch.node, path)) {
 				unregister_xenbus_watch(&watch->watch);
 				unregister_xenbus_watch(&watch->watch);

+ 3 - 1
drivers/xen/xenbus/xenbus_probe_frontend.c

@@ -335,7 +335,9 @@ static int backend_state;
 static void xenbus_reset_backend_state_changed(struct xenbus_watch *w,
 static void xenbus_reset_backend_state_changed(struct xenbus_watch *w,
 					const char **v, unsigned int l)
 					const char **v, unsigned int l)
 {
 {
-	xenbus_scanf(XBT_NIL, v[XS_WATCH_PATH], "", "%i", &backend_state);
+	if (xenbus_scanf(XBT_NIL, v[XS_WATCH_PATH], "", "%i",
+			 &backend_state) != 1)
+		backend_state = XenbusStateUnknown;
 	printk(KERN_DEBUG "XENBUS: backend %s %s\n",
 	printk(KERN_DEBUG "XENBUS: backend %s %s\n",
 			v[XS_WATCH_PATH], xenbus_strstate(backend_state));
 			v[XS_WATCH_PATH], xenbus_strstate(backend_state));
 	wake_up(&backend_state_wq);
 	wake_up(&backend_state_wq);