From patchwork Mon Oct 10 07:43:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Durrant X-Patchwork-Id: 9369089 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9A2786048F for ; Mon, 10 Oct 2016 08:05:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7D1C0290C0 for ; Mon, 10 Oct 2016 08:05:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6CDC3290C8; Mon, 10 Oct 2016 08:05:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C0798290C0 for ; Mon, 10 Oct 2016 08:05:42 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1btVYI-0006HY-3j; Mon, 10 Oct 2016 08:03:14 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1btVYG-0006HO-Mb for xen-devel@lists.xenproject.org; Mon, 10 Oct 2016 08:03:12 +0000 Received: from [85.158.143.35] by server-2.bemta-6.messagelabs.com id E2/42-13744-F3B4BF75; Mon, 10 Oct 2016 08:03:11 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJLMWRWlGSWpSXmKPExsXitHSDva699+9 wg54VKhbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8bb5XOZC3aLVhxaF9PA+F2wi5GTQ0LAX6Jz 6TI2EJtNQEdi6tNLrCC2iICLxN2/84DiXBzMAksZJW4u/c4MkhAWsJC4eXkKO4jNIqAqcXTGZ bAGXgE3iQnre5gghspJnD/+E6xeSEBFYv3UWWwQNYISJ2c+YQGxmQUkJA6+eMEMUc8tcfv0VO YJjDyzkJTNQlK2gJFpFaNGcWpRWWqRrrGhXlJRZnpGSW5iZo6uoYGZXm5qcXFiempOYlKxXnJ +7iZGYJAwAMEOxqZFgYcYJTmYlER5E0/8CBfiS8pPqcxILM6ILyrNSS0+xCjDwaEkwSvo9Ttc SLAoNT21Ii0zBxiuMGkJDh4lEYg0b3FBYm5xZjpE6hSjopQ4719PoIQASCKjNA+uDRYjlxhlp YR5GYEOEeIpSC3KzSxBlX/FKM7BqCTMawMyniczrwRu+iugxUxAi1kW/wBZXJKIkJJqYFxSff f1w5OsMfwbP56q11Q4cuT8Rc8PH9807vYI5g34eqTpkEjHNSbviA19m5XkNu7hq7D9/lzviF6 QmnGd3aWFUkoF/QEHj9vKLN4d0yTsxO/+n6d4/9tYIVFJK52TlTYLZTIiTqg6LdUrKLI8sUT2 sZb4lc8yG+rzxA8lnZh/SyhGcs+cBiWW4oxEQy3mouJEAH0XWZKMAgAA X-Env-Sender: prvs=084faaadd=Paul.Durrant@citrix.com X-Msg-Ref: server-15.tower-21.messagelabs.com!1476086590!37162629!1 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 6548 invoked from network); 10 Oct 2016 08:03:11 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP; 10 Oct 2016 08:03:11 -0000 X-IronPort-AV: E=Sophos;i="5.31,471,1473120000"; d="scan'208";a="391552135" From: Paul Durrant To: , Date: Mon, 10 Oct 2016 08:43:06 +0100 Message-ID: <1476085386-4544-1-git-send-email-paul.durrant@citrix.com> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 X-DLP: MIA2 Cc: Juergen Gross , Boris Ostrovsky , Paul Durrant , David Vrabel Subject: [Xen-devel] [PATCH] xenbus: advertize control feature flags X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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");