* [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes
@ 2025-01-15 16:27 David Woodhouse
2025-01-15 16:27 ` [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function David Woodhouse
` (6 more replies)
0 siblings, 7 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
Add a new xs_node_read() helper function which constructs the node path
using a printf format string, and use it where appropriate.
In particular, use it to eliminate the use of the %ms format specifier
for scanf(), which doesn't exist in FreeBSD.
v3:
• Further cleanups using xs_node_read().
• Clean up errp handling for xen-console 'output' node.
• Improve comment for xs_node_read().
v2:
• Add xs_node_read() helper.
• Also fix usage of %ms in xen-block.c
David Woodhouse (6):
hw/xen: Add xs_node_read() helper function
hw/xen: Use xs_node_read() from xs_node_vscanf()
hw/xen: Use xs_node_read() from xen_console_get_name()
hw/xen: Use xs_node_read() from xen_netdev_get_name()
hw/xen: Use xs_node_read() from xenstore_read_str() instead of open-coding it
hw/xen: Fix errp handling in xen_console
Roger Pau Monné (1):
xen: do not use '%ms' scanf specifier
hw/block/xen-block.c | 3 ++-
hw/char/xen_console.c | 56 ++++++++++++++++++++++++-----------------
hw/net/xen_nic.c | 13 +++++-----
hw/xen/trace-events | 2 +-
hw/xen/xen-bus-helper.c | 37 ++++++++++++++++++++-------
hw/xen/xen-bus.c | 14 +++++++++--
hw/xen/xen_pvdev.c | 6 ++---
include/hw/xen/xen-bus-helper.h | 9 +++++++
include/hw/xen/xen-bus.h | 1 +
9 files changed, 94 insertions(+), 47 deletions(-)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:44 ` Anthony PERARD
2025-01-15 16:27 ` [PATCH v3 2/7] xen: do not use '%ms' scanf specifier David Woodhouse
` (5 subsequent siblings)
6 siblings, 1 reply; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: David Woodhouse <dwmw@amazon.co.uk>
This returns the full contents of the node, having created the node path
from the printf-style format string provided in its arguments.
This will save various callers from having to do so for themselves (and
from using xs_node_scanf() with the non-portable %ms format string.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
[remove double newline and constify trace parameters]
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
hw/xen/trace-events | 1 +
hw/xen/xen-bus-helper.c | 22 ++++++++++++++++++++++
include/hw/xen/xen-bus-helper.h | 9 +++++++++
3 files changed, 32 insertions(+)
diff --git a/hw/xen/trace-events b/hw/xen/trace-events
index a07fe41c6d..461dee7b23 100644
--- a/hw/xen/trace-events
+++ b/hw/xen/trace-events
@@ -39,6 +39,7 @@ xs_node_create(const char *node) "%s"
xs_node_destroy(const char *node) "%s"
xs_node_vprintf(char *path, char *value) "%s %s"
xs_node_vscanf(char *path, char *value) "%s %s"
+xs_node_read(const char *path, const char *value) "%s %s"
xs_node_watch(char *path) "%s"
xs_node_unwatch(char *path) "%s"
diff --git a/hw/xen/xen-bus-helper.c b/hw/xen/xen-bus-helper.c
index b2b2cc9c5d..22fd2f6c1a 100644
--- a/hw/xen/xen-bus-helper.c
+++ b/hw/xen/xen-bus-helper.c
@@ -142,6 +142,28 @@ int xs_node_scanf(struct qemu_xs_handle *h, xs_transaction_t tid,
return rc;
}
+char *xs_node_read(struct qemu_xs_handle *h, xs_transaction_t tid,
+ unsigned int *len, Error **errp,
+ const char *path_fmt, ...)
+{
+ char *path, *value;
+ va_list ap;
+
+ va_start(ap, path_fmt);
+ path = g_strdup_vprintf(path_fmt, ap);
+ va_end(ap);
+
+ value = qemu_xen_xs_read(h, tid, path, len);
+ trace_xs_node_read(path, value);
+ if (!value) {
+ error_setg_errno(errp, errno, "failed to read from '%s'", path);
+ }
+
+ g_free(path);
+
+ return value;
+}
+
struct qemu_xs_watch *xs_node_watch(struct qemu_xs_handle *h, const char *node,
const char *key, xs_watch_fn fn,
void *opaque, Error **errp)
diff --git a/include/hw/xen/xen-bus-helper.h b/include/hw/xen/xen-bus-helper.h
index d8dcc2f010..e9911115b3 100644
--- a/include/hw/xen/xen-bus-helper.h
+++ b/include/hw/xen/xen-bus-helper.h
@@ -38,6 +38,15 @@ int xs_node_scanf(struct qemu_xs_handle *h, xs_transaction_t tid,
const char *fmt, ...)
G_GNUC_SCANF(6, 7);
+/*
+ * Unlike other functions here, the printf-formatted path_fmt is for
+ * the XenStore path, not the contents of the node.
+ */
+char *xs_node_read(struct qemu_xs_handle *h, xs_transaction_t tid,
+ unsigned int *len, Error **errp,
+ const char *path_fmt, ...)
+ G_GNUC_PRINTF(5, 6);
+
/* Watch node/key unless node is empty, in which case watch key */
struct qemu_xs_watch *xs_node_watch(struct qemu_xs_handle *h, const char *node,
const char *key, xs_watch_fn fn,
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 2/7] xen: do not use '%ms' scanf specifier
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
2025-01-15 16:27 ` [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:45 ` Anthony PERARD
2025-01-15 16:46 ` Andrew Cooper
2025-01-15 16:27 ` [PATCH v3 3/7] hw/xen: Use xs_node_read() from xs_node_vscanf() David Woodhouse
` (4 subsequent siblings)
6 siblings, 2 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: Roger Pau Monne <roger.pau@citrix.com>
The 'm' parameter used to request auto-allocation of the destination variable
is not supported on FreeBSD, and as such leads to failures to parse.
What's more, the current usage of '%ms' with xs_node_scanf() is pointless, as
it just leads to a double allocation of the same string. Instead use
xs_node_read() to read the whole xenstore node.
Fixes: a783f8ad4ec9 ('xen: add a mechanism to automatically create XenDevice-s...')
Fixes: 9b7737469080 ('hw/xen: update Xen console to XenDevice model')
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
hw/block/xen-block.c | 3 ++-
hw/char/xen_console.c | 6 ++++--
hw/xen/xen-bus.c | 14 ++++++++++++--
include/hw/xen/xen-bus.h | 1 +
4 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 306d38927c..034a18b70e 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -239,7 +239,8 @@ static void xen_block_connect(XenDevice *xendev, Error **errp)
return;
}
- if (xen_device_frontend_scanf(xendev, "protocol", "%ms", &str) != 1) {
+ str = xen_device_frontend_read(xendev, "protocol");
+ if (!str) {
/* x86 defaults to the 32-bit protocol even for 64-bit guests. */
if (object_dynamic_cast(OBJECT(qdev_get_machine()), "x86-machine")) {
protocol = BLKIF_PROTOCOL_X86_32;
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index ef0c2912ef..cb39b21504 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -550,7 +550,8 @@ static void xen_console_device_create(XenBackendInstance *backend,
goto fail;
}
- if (xs_node_scanf(xsh, XBT_NULL, fe, "type", errp, "%ms", &type) != 1) {
+ type = xs_node_read(xsh, XBT_NULL, NULL, errp, "%s/%s", fe, "type");
+ if (!type) {
error_prepend(errp, "failed to read console device type: ");
goto fail;
}
@@ -568,7 +569,8 @@ static void xen_console_device_create(XenBackendInstance *backend,
snprintf(label, sizeof(label), "xencons%ld", number);
- if (xs_node_scanf(xsh, XBT_NULL, fe, "output", NULL, "%ms", &output) == 1) {
+ output = xs_node_read(xsh, XBT_NULL, NULL, NULL, "%s/%s", fe, "output");
+ if (output) {
/*
* FIXME: sure we want to support implicit
* muxed monitors here?
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index adfc4efad0..85b92cded4 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -156,8 +156,8 @@ again:
!strcmp(key[i], "hotplug-status"))
continue;
- if (xs_node_scanf(xenbus->xsh, tid, path, key[i], NULL, "%ms",
- &val) == 1) {
+ val = xs_node_read(xenbus->xsh, tid, NULL, NULL, "%s/%s", path, key[i]);
+ if (val) {
qdict_put_str(opts, key[i], val);
free(val);
}
@@ -650,6 +650,16 @@ int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
return rc;
}
+char *xen_device_frontend_read(XenDevice *xendev, const char *key)
+{
+ XenBus *xenbus = XEN_BUS(qdev_get_parent_bus(DEVICE(xendev)));
+
+ g_assert(xenbus->xsh);
+
+ return xs_node_read(xenbus->xsh, XBT_NULL, NULL, NULL, "%s/%s",
+ xendev->frontend_path, key);;
+}
+
static void xen_device_frontend_set_state(XenDevice *xendev,
enum xenbus_state state,
bool publish)
diff --git a/include/hw/xen/xen-bus.h b/include/hw/xen/xen-bus.h
index 38d40afa37..2adb2af839 100644
--- a/include/hw/xen/xen-bus.h
+++ b/include/hw/xen/xen-bus.h
@@ -91,6 +91,7 @@ void xen_device_frontend_printf(XenDevice *xendev, const char *key,
int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
const char *fmt, ...)
G_GNUC_SCANF(3, 4);
+char *xen_device_frontend_read(XenDevice *xendev, const char *key);
void xen_device_set_max_grant_refs(XenDevice *xendev, unsigned int nr_refs,
Error **errp);
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 3/7] hw/xen: Use xs_node_read() from xs_node_vscanf()
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
2025-01-15 16:27 ` [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function David Woodhouse
2025-01-15 16:27 ` [PATCH v3 2/7] xen: do not use '%ms' scanf specifier David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:27 ` [PATCH v3 4/7] hw/xen: Use xs_node_read() from xen_console_get_name() David Woodhouse
` (3 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: David Woodhouse <dwmw@amazon.co.uk>
Reduce some duplication.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
---
hw/xen/trace-events | 1 -
hw/xen/xen-bus-helper.c | 15 ++++++---------
2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/hw/xen/trace-events b/hw/xen/trace-events
index 461dee7b23..b67942d07b 100644
--- a/hw/xen/trace-events
+++ b/hw/xen/trace-events
@@ -38,7 +38,6 @@ xen_device_remove_watch(const char *type, char *name, const char *node, const ch
xs_node_create(const char *node) "%s"
xs_node_destroy(const char *node) "%s"
xs_node_vprintf(char *path, char *value) "%s %s"
-xs_node_vscanf(char *path, char *value) "%s %s"
xs_node_read(const char *path, const char *value) "%s %s"
xs_node_watch(char *path) "%s"
xs_node_unwatch(char *path) "%s"
diff --git a/hw/xen/xen-bus-helper.c b/hw/xen/xen-bus-helper.c
index 22fd2f6c1a..288fad422b 100644
--- a/hw/xen/xen-bus-helper.c
+++ b/hw/xen/xen-bus-helper.c
@@ -105,25 +105,22 @@ int xs_node_vscanf(struct qemu_xs_handle *h, xs_transaction_t tid,
const char *node, const char *key, Error **errp,
const char *fmt, va_list ap)
{
- char *path, *value;
+ char *value;
int rc;
- path = (strlen(node) != 0) ? g_strdup_printf("%s/%s", node, key) :
- g_strdup(key);
- value = qemu_xen_xs_read(h, tid, path, NULL);
-
- trace_xs_node_vscanf(path, value);
+ if (node && strlen(node) != 0) {
+ value = xs_node_read(h, tid, NULL, errp, "%s/%s", node, key);
+ } else {
+ value = xs_node_read(h, tid, NULL, errp, "%s", key);
+ }
if (value) {
rc = vsscanf(value, fmt, ap);
} else {
- error_setg_errno(errp, errno, "failed to read from '%s'",
- path);
rc = EOF;
}
free(value);
- g_free(path);
return rc;
}
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 4/7] hw/xen: Use xs_node_read() from xen_console_get_name()
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
` (2 preceding siblings ...)
2025-01-15 16:27 ` [PATCH v3 3/7] hw/xen: Use xs_node_read() from xs_node_vscanf() David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:27 ` [PATCH v3 5/7] hw/xen: Use xs_node_read() from xen_netdev_get_name() David Woodhouse
` (2 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: David Woodhouse <dwmw@amazon.co.uk>
Now that xs_node_read() can construct a node path, no need to open-code it.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
---
hw/char/xen_console.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index cb39b21504..e61902461b 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -367,28 +367,28 @@ static char *xen_console_get_name(XenDevice *xendev, Error **errp)
if (con->dev == -1) {
XenBus *xenbus = XEN_BUS(qdev_get_parent_bus(DEVICE(xendev)));
- char fe_path[XENSTORE_ABS_PATH_MAX + 1];
int idx = (xen_mode == XEN_EMULATE) ? 0 : 1;
+ Error *local_err = NULL;
char *value;
/* Theoretically we could go up to INT_MAX here but that's overkill */
while (idx < 100) {
if (!idx) {
- snprintf(fe_path, sizeof(fe_path),
- "/local/domain/%u/console", xendev->frontend_id);
+ value = xs_node_read(xenbus->xsh, XBT_NULL, NULL, &local_err,
+ "/local/domain/%u/console",
+ xendev->frontend_id);
} else {
- snprintf(fe_path, sizeof(fe_path),
- "/local/domain/%u/device/console/%u",
- xendev->frontend_id, idx);
+ value = xs_node_read(xenbus->xsh, XBT_NULL, NULL, &local_err,
+ "/local/domain/%u/device/console/%u",
+ xendev->frontend_id, idx);
}
- value = qemu_xen_xs_read(xenbus->xsh, XBT_NULL, fe_path, NULL);
if (!value) {
if (errno == ENOENT) {
con->dev = idx;
+ error_free(local_err);
goto found;
}
- error_setg(errp, "cannot read %s: %s", fe_path,
- strerror(errno));
+ error_propagate(errp, local_err);
return NULL;
}
free(value);
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 5/7] hw/xen: Use xs_node_read() from xen_netdev_get_name()
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
` (3 preceding siblings ...)
2025-01-15 16:27 ` [PATCH v3 4/7] hw/xen: Use xs_node_read() from xen_console_get_name() David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:27 ` [PATCH v3 6/7] hw/xen: Use xs_node_read() from xenstore_read_str() instead of open-coding it David Woodhouse
2025-01-15 16:27 ` [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console David Woodhouse
6 siblings, 0 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: David Woodhouse <dwmw@amazon.co.uk>
Now that xs_node_read() can construct a node path, no need to open-code it.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
---
hw/net/xen_nic.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/hw/net/xen_nic.c b/hw/net/xen_nic.c
index 97ebd9fa30..5410039490 100644
--- a/hw/net/xen_nic.c
+++ b/hw/net/xen_nic.c
@@ -510,23 +510,22 @@ static char *xen_netdev_get_name(XenDevice *xendev, Error **errp)
if (netdev->dev == -1) {
XenBus *xenbus = XEN_BUS(qdev_get_parent_bus(DEVICE(xendev)));
- char fe_path[XENSTORE_ABS_PATH_MAX + 1];
int idx = (xen_mode == XEN_EMULATE) ? 0 : 1;
+ Error *local_err = NULL;
char *value;
/* Theoretically we could go up to INT_MAX here but that's overkill */
while (idx < 100) {
- snprintf(fe_path, sizeof(fe_path),
- "/local/domain/%u/device/vif/%u",
- xendev->frontend_id, idx);
- value = qemu_xen_xs_read(xenbus->xsh, XBT_NULL, fe_path, NULL);
+ value = xs_node_read(xenbus->xsh, XBT_NULL, NULL, &local_err,
+ "/local/domain/%u/device/vif/%u",
+ xendev->frontend_id, idx);
if (!value) {
if (errno == ENOENT) {
netdev->dev = idx;
+ error_free(local_err);
goto found;
}
- error_setg(errp, "cannot read %s: %s", fe_path,
- strerror(errno));
+ error_propagate(errp, local_err);
return NULL;
}
free(value);
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 6/7] hw/xen: Use xs_node_read() from xenstore_read_str() instead of open-coding it
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
` (4 preceding siblings ...)
2025-01-15 16:27 ` [PATCH v3 5/7] hw/xen: Use xs_node_read() from xen_netdev_get_name() David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:27 ` [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console David Woodhouse
6 siblings, 0 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
---
hw/xen/xen_pvdev.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/hw/xen/xen_pvdev.c b/hw/xen/xen_pvdev.c
index c5ad71e8dc..c9143ba259 100644
--- a/hw/xen/xen_pvdev.c
+++ b/hw/xen/xen_pvdev.c
@@ -22,6 +22,7 @@
#include "qemu/main-loop.h"
#include "hw/qdev-core.h"
#include "hw/xen/xen-legacy-backend.h"
+#include "hw/xen/xen-bus-helper.h"
#include "hw/xen/xen_pvdev.h"
/* private */
@@ -81,12 +82,9 @@ int xenstore_write_str(const char *base, const char *node, const char *val)
char *xenstore_read_str(const char *base, const char *node)
{
- char abspath[XEN_BUFSIZE];
- unsigned int len;
char *str, *ret = NULL;
- snprintf(abspath, sizeof(abspath), "%s/%s", base, node);
- str = qemu_xen_xs_read(xenstore, 0, abspath, &len);
+ str = xs_node_read(xenstore, 0, NULL, NULL, "%s/%s", base, node);
if (str != NULL) {
/* move to qemu-allocated memory to make sure
* callers can safely g_free() stuff. */
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
` (5 preceding siblings ...)
2025-01-15 16:27 ` [PATCH v3 6/7] hw/xen: Use xs_node_read() from xenstore_read_str() instead of open-coding it David Woodhouse
@ 2025-01-15 16:27 ` David Woodhouse
2025-01-15 16:49 ` Anthony PERARD
6 siblings, 1 reply; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 16:27 UTC (permalink / raw)
To: qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
From: David Woodhouse <dwmw@amazon.co.uk>
When attempting to read the 'output' node, interpret any error *other*
than ENOENT as a fatal error. For ENOENT, fall back to serial_hd() to
find a character device, or create a null device.
Do not attempt to prepend to errp when serial_hd() fails; the error
isn't relevant (and prior to this change, wasn't set anyway).
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
hw/char/xen_console.c | 34 +++++++++++++++++++++-------------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index e61902461b..9e7f6da343 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -569,7 +569,7 @@ static void xen_console_device_create(XenBackendInstance *backend,
snprintf(label, sizeof(label), "xencons%ld", number);
- output = xs_node_read(xsh, XBT_NULL, NULL, NULL, "%s/%s", fe, "output");
+ output = xs_node_read(xsh, XBT_NULL, NULL, errp, "%s/%s", fe, "output");
if (output) {
/*
* FIXME: sure we want to support implicit
@@ -581,19 +581,27 @@ static void xen_console_device_create(XenBackendInstance *backend,
output);
goto fail;
}
- } else if (number) {
- cd = serial_hd(number);
- if (!cd) {
- error_prepend(errp, "console: No serial device #%ld found: ",
- number);
- goto fail;
- }
+ } else if (errno != ENOENT) {
+ error_prepend(errp, "console: No valid chardev found: ");
+ goto fail;
} else {
- /* No 'output' node on primary console: use null. */
- cd = qemu_chr_new(label, "null", NULL);
- if (!cd) {
- error_setg(errp, "console: failed to create null device");
- goto fail;
+ if (errp) {
+ error_free(*errp);
+ }
+ if (number) {
+ cd = serial_hd(number);
+ if (!cd) {
+ error_setg(errp, "console: No serial device #%ld found: ",
+ number);
+ goto fail;
+ }
+ } else {
+ /* No 'output' node on primary console: use null. */
+ cd = qemu_chr_new(label, "null", NULL);
+ if (!cd) {
+ error_setg(errp, "console: failed to create null device");
+ goto fail;
+ }
}
}
--
2.47.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function
2025-01-15 16:27 ` [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function David Woodhouse
@ 2025-01-15 16:44 ` Anthony PERARD
0 siblings, 0 replies; 13+ messages in thread
From: Anthony PERARD @ 2025-01-15 16:44 UTC (permalink / raw)
To: David Woodhouse
Cc: qemu-devel, Roger Pau Monné, Stefano Stabellini,
Paul Durrant, Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
On Wed, Jan 15, 2025 at 04:27:19PM +0000, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
>
> This returns the full contents of the node, having created the node path
> from the printf-style format string provided in its arguments.
>
> This will save various callers from having to do so for themselves (and
> from using xs_node_scanf() with the non-portable %ms format string.
>
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> [remove double newline and constify trace parameters]
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Thanks,
--
Anthony PERARD
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/7] xen: do not use '%ms' scanf specifier
2025-01-15 16:27 ` [PATCH v3 2/7] xen: do not use '%ms' scanf specifier David Woodhouse
@ 2025-01-15 16:45 ` Anthony PERARD
2025-01-15 16:46 ` Andrew Cooper
1 sibling, 0 replies; 13+ messages in thread
From: Anthony PERARD @ 2025-01-15 16:45 UTC (permalink / raw)
To: David Woodhouse
Cc: qemu-devel, Roger Pau Monné, Stefano Stabellini,
Paul Durrant, Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
On Wed, Jan 15, 2025 at 04:27:20PM +0000, David Woodhouse wrote:
> From: Roger Pau Monne <roger.pau@citrix.com>
>
> The 'm' parameter used to request auto-allocation of the destination variable
> is not supported on FreeBSD, and as such leads to failures to parse.
>
> What's more, the current usage of '%ms' with xs_node_scanf() is pointless, as
> it just leads to a double allocation of the same string. Instead use
> xs_node_read() to read the whole xenstore node.
>
> Fixes: a783f8ad4ec9 ('xen: add a mechanism to automatically create XenDevice-s...')
> Fixes: 9b7737469080 ('hw/xen: update Xen console to XenDevice model')
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Thanks,
--
Anthony PERARD
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/7] xen: do not use '%ms' scanf specifier
2025-01-15 16:27 ` [PATCH v3 2/7] xen: do not use '%ms' scanf specifier David Woodhouse
2025-01-15 16:45 ` Anthony PERARD
@ 2025-01-15 16:46 ` Andrew Cooper
1 sibling, 0 replies; 13+ messages in thread
From: Andrew Cooper @ 2025-01-15 16:46 UTC (permalink / raw)
To: David Woodhouse, qemu-devel, Roger Pau Monné
Cc: Stefano Stabellini, Anthony PERARD, Paul Durrant,
Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
On 15/01/2025 4:27 pm, David Woodhouse wrote:
> diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
> index adfc4efad0..85b92cded4 100644
> --- a/hw/xen/xen-bus.c
> +++ b/hw/xen/xen-bus.c
> @@ -650,6 +650,16 @@ int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
> return rc;
> }
>
> +char *xen_device_frontend_read(XenDevice *xendev, const char *key)
> +{
> + XenBus *xenbus = XEN_BUS(qdev_get_parent_bus(DEVICE(xendev)));
> +
> + g_assert(xenbus->xsh);
> +
> + return xs_node_read(xenbus->xsh, XBT_NULL, NULL, NULL, "%s/%s",
> + xendev->frontend_path, key);;
Double ;;
~Andrew
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console
2025-01-15 16:27 ` [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console David Woodhouse
@ 2025-01-15 16:49 ` Anthony PERARD
2025-01-15 17:44 ` David Woodhouse
0 siblings, 1 reply; 13+ messages in thread
From: Anthony PERARD @ 2025-01-15 16:49 UTC (permalink / raw)
To: David Woodhouse
Cc: qemu-devel, Roger Pau Monné, Stefano Stabellini,
Paul Durrant, Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
On Wed, Jan 15, 2025 at 04:27:25PM +0000, David Woodhouse wrote:
> diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
> index e61902461b..9e7f6da343 100644
> --- a/hw/char/xen_console.c
> +++ b/hw/char/xen_console.c
> @@ -581,19 +581,27 @@ static void xen_console_device_create(XenBackendInstance *backend,
> output);
> goto fail;
> }
> - } else if (number) {
> - cd = serial_hd(number);
> - if (!cd) {
> - error_prepend(errp, "console: No serial device #%ld found: ",
> - number);
> - goto fail;
> - }
> + } else if (errno != ENOENT) {
> + error_prepend(errp, "console: No valid chardev found: ");
> + goto fail;
> } else {
> - /* No 'output' node on primary console: use null. */
> - cd = qemu_chr_new(label, "null", NULL);
> - if (!cd) {
> - error_setg(errp, "console: failed to create null device");
> - goto fail;
> + if (errp) {
I don't think you need this check, with ERRP_GUARD() macro `errp` is
never NULL.
> + error_free(*errp);
After this, I think you still need
*errp = NULL;
> + }
> + if (number) {
> + cd = serial_hd(number);
> + if (!cd) {
> + error_setg(errp, "console: No serial device #%ld found: ",
That error message doesn't need the ": " at the end anymore.
With those fixed: Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Cheers,
--
Anthony PERARD
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console
2025-01-15 16:49 ` Anthony PERARD
@ 2025-01-15 17:44 ` David Woodhouse
0 siblings, 0 replies; 13+ messages in thread
From: David Woodhouse @ 2025-01-15 17:44 UTC (permalink / raw)
To: Anthony PERARD
Cc: qemu-devel, Roger Pau Monné, Stefano Stabellini,
Paul Durrant, Edgar E. Iglesias, Kevin Wolf, Hanna Reitz,
Marc-André Lureau, Paolo Bonzini, Jason Wang, xen-devel,
qemu-block
[-- Attachment #1: Type: text/plain, Size: 3066 bytes --]
On Wed, 2025-01-15 at 17:49 +0100, Anthony PERARD wrote:
>
> With those fixed: Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
Thanks. I've pushed those changes and am watching the pipeline at
https://gitlab.com/dwmw2/qemu/-/pipelines/1626804720
I'll probably send a pull request tomorrow. The patch now looks like
this:
From 8b44a3e39f36540818d99ef8cf79e64bba1ed9c3 Mon Sep 17 00:00:00 2001
From: David Woodhouse <dwmw@amazon.co.uk>
Date: Wed, 15 Jan 2025 15:46:06 +0000
Subject: [PATCH] hw/xen: Fix errp handling in xen_console
When attempting to read the 'output' node, interpret any error *other*
than ENOENT as a fatal error. For ENOENT, fall back to serial_hd() to
find a character device, or create a null device.
Do not attempt to prepend to errp when serial_hd() fails; the error
isn't relevant (and prior to this change, wasn't set anyway).
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
---
hw/char/xen_console.c | 34 +++++++++++++++++++++-------------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c
index e61902461b..d03c188d1d 100644
--- a/hw/char/xen_console.c
+++ b/hw/char/xen_console.c
@@ -569,7 +569,7 @@ static void xen_console_device_create(XenBackendInstance *backend,
snprintf(label, sizeof(label), "xencons%ld", number);
- output = xs_node_read(xsh, XBT_NULL, NULL, NULL, "%s/%s", fe, "output");
+ output = xs_node_read(xsh, XBT_NULL, NULL, errp, "%s/%s", fe, "output");
if (output) {
/*
* FIXME: sure we want to support implicit
@@ -581,19 +581,27 @@ static void xen_console_device_create(XenBackendInstance *backend,
output);
goto fail;
}
- } else if (number) {
- cd = serial_hd(number);
- if (!cd) {
- error_prepend(errp, "console: No serial device #%ld found: ",
- number);
- goto fail;
- }
+ } else if (errno != ENOENT) {
+ error_prepend(errp, "console: No valid chardev found: ");
+ goto fail;
} else {
- /* No 'output' node on primary console: use null. */
- cd = qemu_chr_new(label, "null", NULL);
- if (!cd) {
- error_setg(errp, "console: failed to create null device");
- goto fail;
+ error_free(*errp);
+ *errp = NULL;
+
+ if (number) {
+ cd = serial_hd(number);
+ if (!cd) {
+ error_setg(errp, "console: No serial device #%ld found",
+ number);
+ goto fail;
+ }
+ } else {
+ /* No 'output' node on primary console: use null. */
+ cd = qemu_chr_new(label, "null", NULL);
+ if (!cd) {
+ error_setg(errp, "console: failed to create null device");
+ goto fail;
+ }
}
}
--
2.47.0
[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5069 bytes --]
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-01-15 17:45 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-15 16:27 [PATCH v3 1/7] xen: error handling and FreeBSD compatibility fixes David Woodhouse
2025-01-15 16:27 ` [PATCH v3 1/7] hw/xen: Add xs_node_read() helper function David Woodhouse
2025-01-15 16:44 ` Anthony PERARD
2025-01-15 16:27 ` [PATCH v3 2/7] xen: do not use '%ms' scanf specifier David Woodhouse
2025-01-15 16:45 ` Anthony PERARD
2025-01-15 16:46 ` Andrew Cooper
2025-01-15 16:27 ` [PATCH v3 3/7] hw/xen: Use xs_node_read() from xs_node_vscanf() David Woodhouse
2025-01-15 16:27 ` [PATCH v3 4/7] hw/xen: Use xs_node_read() from xen_console_get_name() David Woodhouse
2025-01-15 16:27 ` [PATCH v3 5/7] hw/xen: Use xs_node_read() from xen_netdev_get_name() David Woodhouse
2025-01-15 16:27 ` [PATCH v3 6/7] hw/xen: Use xs_node_read() from xenstore_read_str() instead of open-coding it David Woodhouse
2025-01-15 16:27 ` [PATCH v3 7/7] hw/xen: Fix errp handling in xen_console David Woodhouse
2025-01-15 16:49 ` Anthony PERARD
2025-01-15 17:44 ` David Woodhouse
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).