Message ID | 1476085386-4544-1-git-send-email-paul.durrant@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 10/10/16 09: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 <paul.durrant@citrix.com> > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > Cc: David Vrabel <david.vrabel@citrix.com> > Cc: Juergen Gross <jgross@suse.com> > --- > 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 }, I think you meant to set the flag to "false" for halt and "true" for reboot, no? Juergen
On 10/10/16 09: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 <paul.durrant@citrix.com> > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > Cc: David Vrabel <david.vrabel@citrix.com> > Cc: Juergen Gross <jgross@suse.com> > --- > 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 > @@ -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); One other nit: please us kasprintf() instead of open coding it. Juergen
> -----Original Message----- > From: Juergen Gross [mailto:jgross@suse.com] > Sent: 10 October 2016 10:11 > To: Paul Durrant <Paul.Durrant@citrix.com>; linux-kernel@vger.kernel.org; > xen-devel@lists.xenproject.org > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>; David Vrabel > <david.vrabel@citrix.com> > Subject: Re: [PATCH] xenbus: advertize control feature flags > > On 10/10/16 09: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 <paul.durrant@citrix.com> > > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > > Cc: David Vrabel <david.vrabel@citrix.com> > > Cc: Juergen Gross <jgross@suse.com> > > --- > > 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 }, > > I think you meant to set the flag to "false" for halt and "true" for > reboot, no? > Yes, you're right. Don't know why I got that backwards. Will fix in v2. Paul > > Juergen
> -----Original Message----- > From: Juergen Gross [mailto:jgross@suse.com] > Sent: 10 October 2016 10:17 > To: Paul Durrant <Paul.Durrant@citrix.com>; linux-kernel@vger.kernel.org; > xen-devel@lists.xenproject.org > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>; David Vrabel > <david.vrabel@citrix.com> > Subject: Re: [PATCH] xenbus: advertize control feature flags > > On 10/10/16 09: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 <paul.durrant@citrix.com> > > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> > > Cc: David Vrabel <david.vrabel@citrix.com> > > Cc: Juergen Gross <jgross@suse.com> > > --- > > 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 > > > @@ -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); > > One other nit: please us kasprintf() instead of open coding it. > Yes, that would be better. Cheers, Paul > > Juergen
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");
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@citrix.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: David Vrabel <david.vrabel@citrix.com> Cc: Juergen Gross <jgross@suse.com> --- drivers/xen/manage.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-)