Commit aa34e07e authored by Linus Torvalds's avatar Linus Torvalds

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
parents 0d731759 c251f15c
...@@ -1837,6 +1837,7 @@ static void __init init_hvm_pv_info(void) ...@@ -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) ...@@ -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)
{ {
......
...@@ -168,7 +168,9 @@ static void do_suspend(void) ...@@ -168,7 +168,9 @@ static void do_suspend(void)
#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) ...@@ -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[] = { int idx;
{ "poweroff", do_poweroff },
{ "halt", do_poweroff },
{ "reboot", do_reboot },
#ifdef CONFIG_HIBERNATE_CALLBACKS
{ "suspend", do_suspend },
#endif
{NULL, NULL},
};
static struct shutdown_handler *handler;
if (shutting_down != SHUTDOWN_INVALID) if (shutting_down != SHUTDOWN_INVALID)
return; return;
...@@ -238,13 +240,13 @@ static void shutdown_handler(struct xenbus_watch *watch, ...@@ -238,13 +240,13 @@ static void shutdown_handler(struct xenbus_watch *watch,
return; return;
} }
for (handler = &handlers[0]; handler->command; handler++) { for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) {
if (strcmp(str, handler->command) == 0) 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, ...@@ -253,8 +255,8 @@ static void shutdown_handler(struct xenbus_watch *watch,
goto again; goto again;
} }
if (handler->cb) { if (idx < ARRAY_SIZE(shutdown_handlers)) {
handler->cb(); 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 = { ...@@ -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) ...@@ -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;
} }
......
...@@ -364,7 +364,7 @@ static int xenbus_write_transaction(unsigned msg_type, ...@@ -364,7 +364,7 @@ static int xenbus_write_transaction(unsigned msg_type,
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) ...@@ -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);
......
...@@ -335,7 +335,9 @@ static int backend_state; ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment