All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] vhost-user-snd: Use virtio_get_config_size()
@ 2025-02-13 13:25 Matias Ezequiel Vara Larsen
  2025-02-13 15:07 ` Philippe Mathieu-Daudé
  2025-02-13 15:31 ` Stefano Garzarella
  0 siblings, 2 replies; 8+ messages in thread
From: Matias Ezequiel Vara Larsen @ 2025-02-13 13:25 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Stefano Garzarella,
	Manos Pitsidianakis, Matias Ezequiel Vara Larsen

Use virtio_get_config_size() rather than sizeof(struct
virtio_snd_config) for the config_size in the vhost-user-snd frontend.
The frontend shall rely on device features for the size of the device
configuration space. This fixes an issue introduced by commit ab0c7fb2
in which the optional field `control` is added to the virtio_snd_config
structure. This breaks vhost-user-device backends that do not implement
the `controls` field.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2805
Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Matias Ezequiel Vara Larsen <mvaralar@redhat.com>
---
 hw/virtio/vhost-user-snd.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/hw/virtio/vhost-user-snd.c b/hw/virtio/vhost-user-snd.c
index 8610370af8..8da4309470 100644
--- a/hw/virtio/vhost-user-snd.c
+++ b/hw/virtio/vhost-user-snd.c
@@ -16,6 +16,18 @@
 #include "standard-headers/linux/virtio_ids.h"
 #include "standard-headers/linux/virtio_snd.h"
 
+static const VirtIOFeature feature_sizes[] = {
+    {.flags = 1ULL << VIRTIO_SND_F_CTLS,
+    .end = endof(struct virtio_snd_config, controls)},
+    {}
+};
+
+static const VirtIOConfigSizeParams cfg_size_params = {
+    .min_size = endof(struct virtio_snd_config, chmaps),
+    .max_size = sizeof(struct virtio_snd_config),
+    .feature_sizes = feature_sizes
+};
+
 static const VMStateDescription vu_snd_vmstate = {
     .name = "vhost-user-snd",
     .unmigratable = 1,
@@ -23,16 +35,20 @@ static const VMStateDescription vu_snd_vmstate = {
 
 static const Property vsnd_properties[] = {
     DEFINE_PROP_CHR("chardev", VHostUserBase, chardev),
+    DEFINE_PROP_BIT64("config-controls", VHostUserBase,
+                      parent_obj.host_features, VIRTIO_SND_F_CTLS, false),
 };
 
 static void vu_snd_base_realize(DeviceState *dev, Error **errp)
 {
     VHostUserBase *vub = VHOST_USER_BASE(dev);
     VHostUserBaseClass *vubs = VHOST_USER_BASE_GET_CLASS(dev);
+    VirtIODevice *vdev = &vub->parent_obj;
 
     vub->virtio_id = VIRTIO_ID_SOUND;
     vub->num_vqs = 4;
-    vub->config_size = sizeof(struct virtio_snd_config);
+    vub->config_size = virtio_get_config_size(&cfg_size_params,
+                                              vdev->host_features);
     vub->vq_size = 64;
 
     vubs->parent_realize(dev, errp);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-02-14 17:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-13 13:25 [PATCH] vhost-user-snd: Use virtio_get_config_size() Matias Ezequiel Vara Larsen
2025-02-13 15:07 ` Philippe Mathieu-Daudé
2025-02-14 16:52   ` Matias Ezequiel Vara Larsen
2025-02-13 15:31 ` Stefano Garzarella
2025-02-13 15:43   ` Stefano Garzarella
2025-02-13 16:22     ` Stefano Garzarella
2025-02-14 16:56       ` Matias Ezequiel Vara Larsen
2025-02-14 16:59   ` Matias Ezequiel Vara Larsen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.