Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753347AbcJKMTd convert rfc822-to-8bit (ORCPT ); Tue, 11 Oct 2016 08:19:33 -0400 Received: from smtp.ctxuk.citrix.com ([185.25.65.24]:49923 "EHLO SMTP.EU.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752017AbcJKMTc (ORCPT ); Tue, 11 Oct 2016 08:19:32 -0400 X-IronPort-AV: E=Sophos;i="5.31,329,1473120000"; d="scan'208";a="32835738" From: Paul Durrant To: Juergen Gross , "linux-kernel@vger.kernel.org" , "xen-devel@lists.xen.org" CC: David Vrabel , "boris.ostrovsky@oracle.com" Subject: RE: [PATCH v2] xenbus: advertise control feature flags Thread-Topic: [PATCH v2] xenbus: advertise control feature flags Thread-Index: AQHSI7N6gwq+6kCqdUaJlRr1+lCkuqCjK6UQ Date: Tue, 11 Oct 2016 12:19:03 +0000 Message-ID: <8415882915024edba7e7c9ba8e08182e@AMSPEX02CL03.citrite.net> References: <1476185656-19766-1-git-send-email-jgross@suse.com> In-Reply-To: <1476185656-19766-1-git-send-email-jgross@suse.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-DLP: AMS1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3946 Lines: 131 > -----Original Message----- > From: Juergen Gross [mailto:jgross@suse.com] > Sent: 11 October 2016 12:34 > To: linux-kernel@vger.kernel.org; xen-devel@lists.xen.org > Cc: David Vrabel ; boris.ostrovsky@oracle.com; > Paul Durrant ; Juergen Gross > Subject: [PATCH v2] xenbus: advertise control feature flags > > The Xen docs specify several flags which a guest can set to advertise > which values of the xenstore control/shutdown key it will recognize. > This patch adds code to write all the relevant feature-flag keys. > > Based-on-patch-by: Paul Durrant > Signed-off-by: Juergen Gross > Reviewed-by: David Vrabel Reviewed-by: Paul Durrant > --- > V2: use snprintf() instead of sprintf() > --- > drivers/xen/manage.c | 45 +++++++++++++++++++++++++++++------------- > --- > 1 file changed, 29 insertions(+), 16 deletions(-) > > diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c > index e12bd36..26e5e85 100644 > --- a/drivers/xen/manage.c > +++ b/drivers/xen/manage.c > @@ -168,7 +168,9 @@ static void do_suspend(void) > #endif /* CONFIG_HIBERNATE_CALLBACKS */ > > struct shutdown_handler { > - const char *command; > +#define SHUTDOWN_CMD_SIZE 11 > + const char command[SHUTDOWN_CMD_SIZE]; > + bool flag; > void (*cb)(void); > }; > > @@ -206,22 +208,22 @@ static void do_reboot(void) > 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, > 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; > + int idx; > > if (shutting_down != SHUTDOWN_INVALID) > return; > @@ -238,13 +240,13 @@ static void shutdown_handler(struct xenbus_watch > *watch, > return; > } > > - for (handler = &handlers[0]; handler->command; handler++) { > - if (strcmp(str, handler->command) == 0) > + for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) { > + if (strcmp(str, shutdown_handlers[idx].command) == 0) > break; > } > > /* Only acknowledge commands which we are prepared to handle. > */ > - if (handler->cb) > + if (idx < ARRAY_SIZE(shutdown_handlers)) > xenbus_write(xbt, "control", "shutdown", ""); > > err = xenbus_transaction_end(xbt, 0); > @@ -253,8 +255,8 @@ static void shutdown_handler(struct xenbus_watch > *watch, > goto again; > } > > - if (handler->cb) { > - handler->cb(); > + if (idx < ARRAY_SIZE(shutdown_handlers)) { > + shutdown_handlers[idx].cb(); > } else { > pr_info("Ignoring shutdown request: %s\n", str); > shutting_down = SHUTDOWN_INVALID; > @@ -310,6 +312,9 @@ static struct notifier_block xen_reboot_nb = { > static int setup_shutdown_watcher(void) > { > int err; > + int idx; > +#define FEATURE_PATH_SIZE (SHUTDOWN_CMD_SIZE + sizeof("feature-")) > + char node[FEATURE_PATH_SIZE]; > > err = register_xenbus_watch(&shutdown_watch); > if (err) { > @@ -326,6 +331,14 @@ static int setup_shutdown_watcher(void) > } > #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; > } > > -- > 2.6.6