Unrelated to this patch, but since we are talking about
VIRTIO_SND_F_CTLS, I think it would be good to send a patch to Linux to
make it clear that `controls` depends on VIRTIO_SND_F_CTLS.

For example in linux/include/uapi/linux/virtio_blk.h we have:

struct virtio_blk_config {
        /* The capacity (in 512-byte sectors). */
        __virtio64 capacity;
        /* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */
        __virtio32 size_max;
        /* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */
        __virtio32 seg_max;
        ....

So I suggest something like this:

diff --git a/include/uapi/linux/virtio_snd.h b/include/uapi/linux/virtio_snd.h
index 5f4100c2cf04..a4cfb9f6561a 100644
--- a/include/uapi/linux/virtio_snd.h
+++ b/include/uapi/linux/virtio_snd.h
@@ -25,7 +25,7 @@ struct virtio_snd_config {
        __le32 streams;
        /* # of available channel maps */
        __le32 chmaps;
-       /* # of available control elements */
+       /* # of available control elements (if VIRTIO_SND_F_CTLS) */
        __le32 controls;
 };

Thanks,
Stefano


On Thu, 13 Feb 2025 at 16:31, Stefano Garzarella <sgarz...@redhat.com> wrote:
>
> For the title, what about this?
>
>    vhost-user-snd: fix incorrect config_size computation
>
> Or something like that, just to make clear that we are fixing a
> real issue.
>
> On Thu, Feb 13, 2025 at 02:25:13PM +0100, Matias Ezequiel Vara Larsen
> wrote:
> >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
>
> When we refer to a commit it's a good practice to put both the sha1, but
> also the title, like this:
> This fixes an issue introduced by commit ab0c7fb22b ("linux-headers:
> update to current kvm/next") ...
>
> >in which the optional field `control` is added to the virtio_snd_config
>
> s/control/controls
>
> I would also specify here that the presence of `controls` in the config
> space depends on VIRTIO_SND_F_CTLS, citing the specification:
>
> 5.14.4 Device Configuration Layout
>   ...
>   controls
>      (driver-read-only) indicates a total number of all available control
>      elements if VIRTIO_SND_F_CTLS has been negotiated.
>
> >structure. This breaks vhost-user-device backends that do not implement
> >the `controls` field.
> >
>
> I'd suggest to add the fixes tag:
>
> Fixes: ab0c7fb22b ("linux-headers: update to current kvm/next")
>
> And maybe also:
>
> Cc: qemu-sta...@nongnu.org
>
> >Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2805
> >Suggested-by: Stefano Garzarella <sgarz...@redhat.com>
> >Signed-off-by: Matias Ezequiel Vara Larsen <mvara...@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,
>
> In almost all other virtio/vhost-user devices, the property name does
> not have the prefix `config-`, but usually the thing after F_, in this
> case CTLS is cryptic, so IMO just `controls` should be fine.
>
> The only example I found is `config-wce` for vhost-user-blk, but in that
> case the feature is actually called VIRTIO_BLK_F_CONFIG_WCE.
>
> Thanks,
> Stefano
>
> >+                      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
> >


Reply via email to