mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
xen: fixes for 4.9-rc2
- Advertise control feature flags in xenstore. - Fix x86 build when XEN_PVHVM is disabled. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJYDjVtAAoJEFxbo/MsZsTRv2UH/0YR95ajlgJnN/ldeG4KhBdV Oe6piyw1cbHDPvFrFFl7HgYgAiiuaMxOFk+j/XKVJ7naAOD06kWHoVzZNkpNFF4i 2m81jGfvW3msbXd77aR+IHulWxRxQ9TE4HV2s94DiQiSJa2f02PqVCdqyJws736m mjDdDRzd90xb2rDI3XrcRNnjgNaFtfMLGhtwtgXI5U+Ic+uVW1VBwLefZXCI2SKw yUSVBwsYENgfGUJ+NmYrl53WmlSnAatrs1wClLVqm/0fD7+J2XLHRAonISTwoKtp z+XJthe7uWq0Fb/DMiWhvTrTn852chy9BEC6QsRBmGM6RRZG9n7x8k97NgTiqiw= =lM7p -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
aa34e07e45
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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[] = {
|
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,
|
|||||||
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,
|
|||||||
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 = {
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user