2016-10-10 10:03:51

by Paul Durrant

[permalink] [raw]
Subject: [PATCH v2] 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 <[email protected]>
Cc: Boris Ostrovsky <[email protected]>
Cc: David Vrabel <[email protected]>
Cc: Juergen Gross <[email protected]>
---

v2:
- Fix flag logic inversion
- Use kasprintf()
---
drivers/xen/manage.c | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index e12bd36..0671b98 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, false },
+ { "reboot", do_reboot, true },
+#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,24 @@ 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++) {
+ char *node;
+
+ node = kasprintf(GFP_KERNEL, "feature-%s",
+ handler->command);
+ if (!node) {
+ pr_err("Failed to allocate feature flag\n");
+ return -ENOMEM;
+ }
+
+ 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


2016-10-10 10:10:22

by Juergen Gross

[permalink] [raw]
Subject: Re: [PATCH v2] xenbus: advertize control feature flags

On 10/10/16 11:43, Paul Durrant wrote:
> 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 <[email protected]>
> Cc: Boris Ostrovsky <[email protected]>
> Cc: David Vrabel <[email protected]>
> Cc: Juergen Gross <[email protected]>
> ---
>
> v2:
> - Fix flag logic inversion
> - Use kasprintf()
> ---
> drivers/xen/manage.c | 38 ++++++++++++++++++++++++++++----------
> 1 file changed, 28 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
> index e12bd36..0671b98 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, false },
> + { "reboot", do_reboot, true },
> +#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,24 @@ 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++) {
> + char *node;
> +
> + node = kasprintf(GFP_KERNEL, "feature-%s",
> + handler->command);

Now you've dropped using flag?


Juergen

2016-10-10 10:16:21

by David Vrabel

[permalink] [raw]
Subject: Re: [PATCH v2] xenbus: advertize control feature flags

On 10/10/16 10:43, Paul Durrant wrote:
> 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.
[...]
> static int setup_shutdown_watcher(void)
> {
> + static struct shutdown_handler *handler;
> int err;
>
> + for (handler = &shutdown_handlers[0]; handler->command; handler++) {
> + char *node;

char node[20];

and avoid the allocation and resulting error path.

As Juergen notes, the 'flag' field isn't used anywhere now. Can you
please test your patches and verify the correct keys are being created?

David

2016-10-10 10:27:15

by Paul Durrant

[permalink] [raw]
Subject: RE: [PATCH v2] xenbus: advertize control feature flags

> -----Original Message-----
> From: David Vrabel [mailto:[email protected]]
> Sent: 10 October 2016 11:16
> To: Paul Durrant <[email protected]>; [email protected];
> [email protected]
> Cc: Boris Ostrovsky <[email protected]>; Juergen Gross
> <[email protected]>
> Subject: Re: [PATCH v2] xenbus: advertize control feature flags
>
> On 10/10/16 10:43, Paul Durrant wrote:
> > 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.
> [...]
> > static int setup_shutdown_watcher(void)
> > {
> > + static struct shutdown_handler *handler;
> > int err;
> >
> > + for (handler = &shutdown_handlers[0]; handler->command;
> handler++) {
> > + char *node;
>
> char node[20];

I didn't want to pick arbitrary numbers. I'd prefer to stick with kasprintf().

Paul

>
> and avoid the allocation and resulting error path.
>
> As Juergen notes, the 'flag' field isn't used anywhere now. Can you
> please test your patches and verify the correct keys are being created?
>
> David