[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xenbus: advertize control feature flags



The Xen docs specify several flags which a guest can set to advertize
which values of the xenstore control/shutdown key it will recognize.
This patch adds code to write all the relevant feature-flag keys.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
Cc: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
Cc: David Vrabel <david.vrabel@xxxxxxxxxx>
Cc: Juergen Gross <jgross@xxxxxxxx>
---
 drivers/xen/manage.c | 45 +++++++++++++++++++++++++++++++++++----------
 1 file changed, 35 insertions(+), 10 deletions(-)

diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index e12bd36..86cf57c 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -170,6 +170,7 @@ out:
 struct shutdown_handler {
        const char *command;
        void (*cb)(void);
+       bool flag;
 };
 
 static int poweroff_nb(struct notifier_block *cb, unsigned long code, void 
*unused)
@@ -206,21 +207,22 @@ static void do_reboot(void)
        ctrl_alt_del();
 }
 
+static struct shutdown_handler shutdown_handlers[] = {
+       { "poweroff", do_poweroff, true },
+       { "halt", do_poweroff, true },
+       { "reboot", do_reboot, false },
+#ifdef CONFIG_HIBERNATE_CALLBACKS
+       { "suspend", do_suspend, true },
+#endif
+       {NULL, NULL, false },
+};
+
 static void shutdown_handler(struct xenbus_watch *watch,
                             const char **vec, unsigned int len)
 {
        char *str;
        struct xenbus_transaction xbt;
        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;
 
        if (shutting_down != SHUTDOWN_INVALID)
@@ -238,7 +240,7 @@ static void shutdown_handler(struct xenbus_watch *watch,
                return;
        }
 
-       for (handler = &handlers[0]; handler->command; handler++) {
+       for (handler = &shutdown_handlers[0]; handler->command; handler++) {
                if (strcmp(str, handler->command) == 0)
                        break;
        }
@@ -309,8 +311,31 @@ static struct notifier_block xen_reboot_nb = {
 
 static int setup_shutdown_watcher(void)
 {
+       static struct shutdown_handler *handler;
        int err;
 
+       for (handler = &shutdown_handlers[0]; handler->command; handler++) {
+               const char *fmt = "feature-%s";
+               int size;
+               char *node;
+
+               if (!handler->flag)
+                       continue;
+
+               size = snprintf(NULL, 0, fmt, handler->command);
+
+               node = kmalloc(++size, GFP_KERNEL);
+               if (!node) {
+                       pr_err("Failed to allocate feature flag\n");
+                       return -ENOMEM;
+               }
+
+               (void) snprintf(node, size, fmt, handler->command);
+               xenbus_printf(XBT_NIL, "control", node, "%u", 1);
+
+               kfree(node);
+       }
+
        err = register_xenbus_watch(&shutdown_watch);
        if (err) {
                pr_err("Failed to set shutdown watcher\n");
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.