Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752622AbcJKKyD (ORCPT ); Tue, 11 Oct 2016 06:54:03 -0400 Received: from mx2.suse.de ([195.135.220.15]:37410 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752132AbcJKKyB (ORCPT ); Tue, 11 Oct 2016 06:54:01 -0400 Subject: Re: [PATCH v3] xenbus: advertize control feature flags To: Paul Durrant , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org References: <1476094403-15064-1-git-send-email-paul.durrant@citrix.com> Cc: Boris Ostrovsky , David Vrabel From: Juergen Gross X-Enigmail-Draft-Status: N1110 Message-ID: Date: Tue, 11 Oct 2016 12:53:16 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: <1476094403-15064-1-git-send-email-paul.durrant@citrix.com> Content-Type: multipart/mixed; boundary="------------C781BC43C942F3697F8A4FB1" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4455 Lines: 150 This is a multi-part message in MIME format. --------------C781BC43C942F3697F8A4FB1 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit On 10/10/16 12:13, 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 > Cc: Boris Ostrovsky > Cc: David Vrabel > Cc: Juergen Gross Hmm, I'd prefer node[] allocated on the stack over dynamic allocation. What about something like the following? It will at least issue build warnings in case the size is too small, will use less memory and less coding. Juergen --------------C781BC43C942F3697F8A4FB1 Content-Type: text/x-patch; name="0001-xenbus-advertise-control-feature-flags.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-xenbus-advertise-control-feature-flags.patch" >From 2a09fbf3a53ac1491e75746742682105f39f9e3a Mon Sep 17 00:00:00 2001 From: Juergen Gross Date: Tue, 11 Oct 2016 12:20:11 +0200 Subject: [PATCH] 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 --- drivers/xen/manage.c | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index e12bd36..46d435a 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,8 @@ static struct notifier_block xen_reboot_nb = { static int setup_shutdown_watcher(void) { int err; + int idx; + char node[SHUTDOWN_CMD_SIZE + sizeof("feature-")]; err = register_xenbus_watch(&shutdown_watch); if (err) { @@ -326,6 +330,13 @@ static int setup_shutdown_watcher(void) } #endif + for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) { + if (!shutdown_handlers[idx].flag) + continue; + sprintf(node, "feature-%s", shutdown_handlers[idx].command); + xenbus_printf(XBT_NIL, "control", node, "%u", 1); + } + return 0; } -- 2.6.6 --------------C781BC43C942F3697F8A4FB1--