Commit 9a0f03f815 for qemu.org

commit 9a0f03f81575168283e56dab51bc0f0a13894092
Author: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Date:   Tue Nov 10 12:20:09 2026 +0200

    virtio-snd: period_bytes divides buffer_bytes

    Add a check for the VIRTIO spec statement:

      5.14.6.6.3.2 Driver Requirements: Stream Parameters

          period_bytes MUST be a divider buffer_bytes, i.e. buffer_bytes % period_bytes == 0.

    Reviewed-by: Jim MacArthur <jim.macarthur@linaro.org>
    Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c
index a6036d5b75..1cbc4da752 100644
--- a/hw/audio/virtio-snd.c
+++ b/hw/audio/virtio-snd.c
@@ -380,6 +380,17 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s,
         return cpu_to_le32(VIRTIO_SND_S_BAD_MSG);
     }

+    if (le32_to_cpu(params->buffer_bytes)
+        % le32_to_cpu(params->period_bytes) != 0) {
+        error_report("%s: 5.14.6.6.3.2 period_bytes MUST be a divider of "
+                     "buffer_bytes, i.e. buffer_bytes %% period_bytes == 0. "
+                     "Got buffer_bytes = %"PRIu32", period_bytes = %"PRIu32,
+                     VIRTIO_DEVICE(s)->name,
+                     le32_to_cpu(params->buffer_bytes),
+                     le32_to_cpu(params->period_bytes));
+        return cpu_to_le32(VIRTIO_SND_S_BAD_MSG);
+    }
+
     st_params = virtio_snd_pcm_get_params(s, stream_id);

     st_params->buffer_bytes = le32_to_cpu(params->buffer_bytes);