Skip to contentSkip to conversation

xenbus: advertize control feature flags

PATCH Superseded Paul Durrant 3 participants 6 messages Oct 10, 2016 Xen hypervisor interface

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 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.

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(-)
drivers/xen/manage.c +28 -10
index e12bd36..0671b98 100644
@@ -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");
Signature · 1 line
2.1.4
maintainer
#1 lore raw
Quoted 72 lines · Paul Durrant

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.

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(-)
drivers/xen/manage.c +12 -10
index e12bd36..0671b98 100644
@@ -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 = {
 

drivers/xen/manage.c static struct notifier_block xen_reboot_nb = { · line 321

Quoted 10 lines
drivers/xen/manage.c +6 -0
 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

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel

#2 lore raw
In reply to Paul Durrant
Quoted 3 lines · Paul Durrant

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.

[...]

drivers/xen/manage.c static struct notifier_block xen_reboot_nb = { · line 318

Quoted 7 lines

static int setup_shutdown_watcher(void)
{

drivers/xen/manage.c +3 -0
+	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

#3 lore raw
Quoted 19 lines

-----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

Quoted 3 lines · Paul Durrant

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.

[...]

Quoted 5 lines

static int setup_shutdown_watcher(void)
{

drivers/xen/manage.c +1 -0
+	static struct shutdown_handler *handler;
 	int err;
Quoted 5 lines

Review

Quoted 1 line
(quoted diff) +1 -0
+	for (handler = &shutdown_handlers[0]; handler->command;

handler++) {

drivers/xen/manage.c static struct notifier_block xen_reboot_nb = { · line 318

Quoted 1 line
drivers/xen/manage.c +1 -0
+		char *node;

char node[20];

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

Paul

Quoted 7 lines

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

#4 lore raw
In reply to David Vrabel
Quoted 19 lines

-----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

Quoted 3 lines · Paul Durrant

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.

[...]

Quoted 5 lines

static int setup_shutdown_watcher(void)
{

drivers/xen/manage.c +1 -0
+	static struct shutdown_handler *handler;
 	int err;
Quoted 5 lines

Review

Quoted 1 line
(quoted diff) +1 -0
+	for (handler = &shutdown_handlers[0]; handler->command;

handler++) {

drivers/xen/manage.c static struct notifier_block xen_reboot_nb = { · line 318

Quoted 1 line
drivers/xen/manage.c +1 -0
+		char *node;

char node[20];

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

Paul

Quoted 7 lines

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

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel

#5 lore raw
In reply to Paul Durrant
Quoted 3 lines · Paul Durrant

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.

[...]

drivers/xen/manage.c static struct notifier_block xen_reboot_nb = { · line 318

Quoted 7 lines

static int setup_shutdown_watcher(void)
{

drivers/xen/manage.c +3 -0
+	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

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel