From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381195; cv=none; d=zohomail.com; s=zohoarc; b=hs9QYiGKUM+4ZBMIrkRE+b05BR/TUFKoYYt8nN/KqfLI5OiZC+MgKR5gKZghq6f0nL0slnMV6+dcfblGGIpH4P3jtbK8axhc55zgKeNqv80J9JT8VfKfCG5Rhzj+bpyGe0YRdK7xhyywcPlpLU/SJ7yN2CZ3Ur4w2dPnhjOtfzI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381195; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=oelfPYYh+OH703FYf3y6VSGwdXxY+Ax1Woe8rIFaGcQ=; b=LJyvs5m9VGY1vKgmd5qsT/k2j2qMFeJHylBta4etHNnh4qYnsfwJgEhhXRcmAKf3mzRmhX9W9BemTeokN69bO4bT7wnqiNSR6J9WXntxQD9YSjOBilLl7+NAQDEQOuuNllzjqjK/stWjwh6zzWNaTVOj764Xxf3wyxPUCqk0TmI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381195449464.4778010533371; Thu, 25 Jun 2026 02:53:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglf-0005mi-M0; Thu, 25 Jun 2026 05:53:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcglW-0005lA-Cf for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:52:58 -0400 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglT-0003jY-Me for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:52:58 -0400 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-4903d730b1fso22050965e9.2 for ; Thu, 25 Jun 2026 02:52:55 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.52.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:52:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381174; x=1782985974; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oelfPYYh+OH703FYf3y6VSGwdXxY+Ax1Woe8rIFaGcQ=; b=VFupz1B6PEO968cykLTJNqEtqvh4Yfu7gzWRA8MhE6mBUwv1J3hVv1arLSv95bUXkr Z7g4JDG6p0tp+rYjk6JbpURphjFcemMcMZA9O62GGkon7Kb5/7OpvSOc2ppVdpksMXch g86aqWSg97jpMiQNtGK614WITjzHxFctCDlR8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381174; x=1782985974; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=oelfPYYh+OH703FYf3y6VSGwdXxY+Ax1Woe8rIFaGcQ=; b=Z8vVdMlRhRwUdXeJiYUXOGd2hZaVEejoH/E4xAsvQhJlRUSbG3xzRozaha2PnZPvdo jgHZs4LseW+TQZ4ExrvpfzjnLPFxK0wC1uR9sfP79LQET4XgVI6KN0BPl2vMlBbqnm0C KZNXiDlA/nam3fUqVFRi+u3pGdSM4QWNg63kfxXX2oEe+jem7n+HWyhf7g6QgzeFtCP+ y8Yn2VLmS/bJgWtK+9HaMCawK+P7R8/wcXflLy3vAqLN0pElTI3IdIIASaQbulljV2Bo DVLLp1RN9ug2GAb33MWaY9dcftc3NmbtqDoX25VTsRArxjD/F2bVifSPc/TZRScj7REI onaQ== X-Gm-Message-State: AOJu0YxqMDLK/jck5fRGYNEVnabralGh9Oq4pOL/1zocq8tKzIj6732F wTioJGxHMbzM7WKM/OfmB9636aYWaFAg3Bw5ugoU2pbT8y005iOo7Gt2j0KIZ7GdN0AlG9KidwE KDZo0JW8Uzg== X-Gm-Gg: AfdE7clwglcZk78K8KCBCL9BA4x6DoJbDJ/hCZ2CemBWkIgF+y8RHoPHnhBRv1DOmIl ciMZi6kkU6aYZJCbhUOcNwmut3iXyAuDszog85eW+MzNPb+ZCFCEkWH9CUC6IpG8o1of90t7/Hr YJol1hkZx4yk05kIZ3wzgzCAD3xY7v8E6iwm5Toq/ZpKyyA/ZyssHga1ZFR1ghhFJlcH0iLcTgW Mpeuq654XFMLUio2+MRQmVMvg/OXbhM+8JM/wKPsY5E60Hb7xsjxpSzZ2Fagv996sbGmntVDIA8 IxZmGVJdCG6+paV+NqRP4eYWDNz26PpYhHziOh9hREZL+skPMBIBtTtVmldPNoc4tFszlZ2Fu8R 1PJQl+ZsOoKB+h0TV5jtWCoHaenSadz4EMnJEij4OFxWh6MmEOQhZv8ZvOmLKjQN8y64IFYCEyr 9EIyd6S4292NAkfQLpX2B5lWjLg57btAilNesVcqR9yXoYQDKAmQyEHX53Rfpwfv1sQXqQqAzyW JC8u9myhu1n X-Received: by 2002:a05:600c:8b0d:b0:492:4b68:c80b with SMTP id 5b1f17b1804b1-4926683235emr24350555e9.1.1782381174002; Thu, 25 Jun 2026 02:52:54 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 1/9] hw/audio/virtio-sound: remove command and stream mutexes Date: Thu, 25 Jun 2026 11:52:41 +0200 Message-ID: <20260625095250.65073-2-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::330; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x330.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381196952158500 From: Volker R=C3=BCmelin All code in virtio-snd.c runs with the BQL held. Remove the command queue mutex and the stream queue mutexes. The qatomic functions are also not needed. Signed-off-by: Volker R=C3=BCmelin [AM: there were too many conflicts, I did `git checkout --ours -- <.>` and then reimplemented the patch idea /AM] Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/audio/virtio-snd.c | 248 +++++++++++++++------------------- include/hw/audio/virtio-snd.h | 3 - 2 files changed, 110 insertions(+), 141 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index fb5cff38660..6eb31e2838e 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -19,7 +19,6 @@ #include "qemu/iov.h" #include "qemu/log.h" #include "qemu/error-report.h" -#include "qemu/lockable.h" #include "system/runstate.h" #include "trace.h" #include "qapi/error.h" @@ -442,7 +441,6 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, = uint32_t stream_id) stream->id =3D stream_id; stream->s =3D s; stream->latency_bytes =3D 0; - qemu_mutex_init(&stream->queue_mutex); QSIMPLEQ_INIT(&stream->queue); =20 /* @@ -568,9 +566,7 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSoun= d *s, =20 stream =3D virtio_snd_pcm_get_stream(s, stream_id); if (stream) { - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - stream->active =3D start; - } + stream->active =3D start; if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { audio_be_set_active_out(s->audio_be, stream->voice.out, start); } else { @@ -594,10 +590,8 @@ static size_t virtio_snd_pcm_get_io_msgs_count(VirtIOS= oundPCMStream *stream) VirtIOSoundPCMBuffer *buffer, *next; size_t count =3D 0; =20 - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - QSIMPLEQ_FOREACH_SAFE(buffer, &stream->queue, entry, next) { - count +=3D 1; - } + QSIMPLEQ_FOREACH_SAFE(buffer, &stream->queue, entry, next) { + count +=3D 1; } return count; } @@ -739,23 +733,15 @@ static void virtio_snd_process_cmdq(VirtIOSound *s) { virtio_snd_ctrl_command *cmd; =20 - if (unlikely(qatomic_read(&s->processing_cmdq))) { - return; - } - - WITH_QEMU_LOCK_GUARD(&s->cmdq_mutex) { - qatomic_set(&s->processing_cmdq, true); - while (!QTAILQ_EMPTY(&s->cmdq)) { - cmd =3D QTAILQ_FIRST(&s->cmdq); + while (!QTAILQ_EMPTY(&s->cmdq)) { + cmd =3D QTAILQ_FIRST(&s->cmdq); =20 - /* process command */ - process_cmd(s, cmd); + /* process command */ + process_cmd(s, cmd); =20 - QTAILQ_REMOVE(&s->cmdq, cmd, next); + QTAILQ_REMOVE(&s->cmdq, cmd, next); =20 - virtio_snd_ctrl_cmd_free(cmd); - } - qatomic_set(&s->processing_cmdq, false); + virtio_snd_ctrl_cmd_free(cmd); } } =20 @@ -892,19 +878,17 @@ static void virtio_snd_handle_tx_xfer(VirtIODevice *v= dev, VirtQueue *vq) goto tx_err; } =20 - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - size =3D iov_size(elem->out_sg, elem->out_num) - msg_sz; + size =3D iov_size(elem->out_sg, elem->out_num) - msg_sz; =20 - buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); - buffer->elem =3D elem; - buffer->populated =3D false; - buffer->vq =3D vq; - buffer->size =3D size; - buffer->offset =3D 0; - stream->latency_bytes +=3D size; + buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); + buffer->elem =3D elem; + buffer->populated =3D false; + buffer->vq =3D vq; + buffer->size =3D size; + buffer->offset =3D 0; + stream->latency_bytes +=3D size; =20 - QSIMPLEQ_INSERT_TAIL(&stream->queue, buffer, entry); - } + QSIMPLEQ_INSERT_TAIL(&stream->queue, buffer, entry); continue; =20 tx_err: @@ -973,16 +957,15 @@ static void virtio_snd_handle_rx_xfer(VirtIODevice *v= dev, VirtQueue *vq) if (stream =3D=3D NULL || stream->info.direction !=3D VIRTIO_SND_D= _INPUT) { goto rx_err; } - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - size =3D iov_size(elem->in_sg, elem->in_num) - - sizeof(virtio_snd_pcm_status); - buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); - buffer->elem =3D elem; - buffer->vq =3D vq; - buffer->size =3D 0; - buffer->offset =3D 0; - QSIMPLEQ_INSERT_TAIL(&stream->queue, buffer, entry); - } + + size =3D iov_size(elem->in_sg, elem->in_num) - + sizeof(virtio_snd_pcm_status); + buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); + buffer->elem =3D elem; + buffer->vq =3D vq; + buffer->size =3D 0; + buffer->offset =3D 0; + QSIMPLEQ_INSERT_TAIL(&stream->queue, buffer, entry); continue; =20 rx_err: @@ -1086,7 +1069,6 @@ static void virtio_snd_realize(DeviceState *dev, Erro= r **errp) virtio_add_queue(vdev, 64, virtio_snd_handle_tx_xfer); vsnd->queues[VIRTIO_SND_VQ_RX] =3D virtio_add_queue(vdev, 64, virtio_snd_handle_rx_xfer); - qemu_mutex_init(&vsnd->cmdq_mutex); QTAILQ_INIT(&vsnd->cmdq); QSIMPLEQ_INIT(&vsnd->invalid); =20 @@ -1154,52 +1136,50 @@ static void virtio_snd_pcm_out_cb(void *data, int a= vailable) VirtIOSoundPCMBuffer *buffer; size_t size; =20 - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - while (!QSIMPLEQ_EMPTY(&stream->queue)) { - buffer =3D QSIMPLEQ_FIRST(&stream->queue); - if (!virtio_queue_ready(buffer->vq)) { - return; + while (!QSIMPLEQ_EMPTY(&stream->queue)) { + buffer =3D QSIMPLEQ_FIRST(&stream->queue); + if (!virtio_queue_ready(buffer->vq)) { + return; + } + if (!stream->active) { + /* Stream has stopped, so do not perform audio_be_write. */ + return_tx_buffer(stream, buffer); + continue; + } + if (!buffer->populated) { + iov_to_buf(buffer->elem->out_sg, + buffer->elem->out_num, + sizeof(virtio_snd_pcm_xfer), + buffer->data, + buffer->size); + buffer->populated =3D true; + } + for (;;) { + size =3D audio_be_write(stream->s->audio_be, + stream->voice.out, + buffer->data + buffer->offset, + MIN(buffer->size, available)); + assert(size <=3D MIN(buffer->size, available)); + if (size =3D=3D 0) { + /* break out of both loops */ + available =3D 0; + break; } - if (!stream->active) { - /* Stream has stopped, so do not perform audio_be_write. */ + buffer->size -=3D size; + buffer->offset +=3D size; + available -=3D size; + update_latency(stream, size); + if (buffer->size < 1) { return_tx_buffer(stream, buffer); - continue; - } - if (!buffer->populated) { - iov_to_buf(buffer->elem->out_sg, - buffer->elem->out_num, - sizeof(virtio_snd_pcm_xfer), - buffer->data, - buffer->size); - buffer->populated =3D true; - } - for (;;) { - size =3D audio_be_write(stream->s->audio_be, - stream->voice.out, - buffer->data + buffer->offset, - MIN(buffer->size, available)); - assert(size <=3D MIN(buffer->size, available)); - if (size =3D=3D 0) { - /* break out of both loops */ - available =3D 0; - break; - } - buffer->size -=3D size; - buffer->offset +=3D size; - available -=3D size; - update_latency(stream, size); - if (buffer->size < 1) { - return_tx_buffer(stream, buffer); - break; - } - if (!available) { - break; - } + break; } if (!available) { break; } } + if (!available) { + break; + } } } =20 @@ -1250,55 +1230,53 @@ static void virtio_snd_pcm_in_cb(void *data, int av= ailable) VirtIOSoundPCMBuffer *buffer; size_t size, max_size, to_read; =20 - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - while (!QSIMPLEQ_EMPTY(&stream->queue)) { - buffer =3D QSIMPLEQ_FIRST(&stream->queue); - if (!virtio_queue_ready(buffer->vq)) { - return; - } - if (!stream->active) { - /* Stream has stopped, so do not perform audio_be_read. */ - return_rx_buffer(stream, buffer); - continue; - } + while (!QSIMPLEQ_EMPTY(&stream->queue)) { + buffer =3D QSIMPLEQ_FIRST(&stream->queue); + if (!virtio_queue_ready(buffer->vq)) { + return; + } + if (!stream->active) { + /* Stream has stopped, so do not perform audio_be_read. */ + return_rx_buffer(stream, buffer); + continue; + } + + max_size =3D iov_size(buffer->elem->in_sg, buffer->elem->in_num); + if (max_size <=3D sizeof(virtio_snd_pcm_status)) { + return_rx_buffer(stream, buffer); + continue; + } + max_size -=3D sizeof(virtio_snd_pcm_status); =20 - max_size =3D iov_size(buffer->elem->in_sg, buffer->elem->in_nu= m); - if (max_size <=3D sizeof(virtio_snd_pcm_status)) { + for (;;) { + if (buffer->size >=3D max_size) { return_rx_buffer(stream, buffer); - continue; + break; } - max_size -=3D sizeof(virtio_snd_pcm_status); - - for (;;) { - if (buffer->size >=3D max_size) { - return_rx_buffer(stream, buffer); - break; - } - to_read =3D stream->params.period_bytes - buffer->size; - to_read =3D MIN(to_read, available); - to_read =3D MIN(to_read, max_size - buffer->size); - size =3D audio_be_read(stream->s->audio_be, - stream->voice.in, - buffer->data + buffer->size, - to_read); - if (!size) { - available =3D 0; - break; - } - buffer->size +=3D size; - available -=3D size; - if (buffer->size >=3D stream->params.period_bytes) { - return_rx_buffer(stream, buffer); - break; - } - if (!available) { - break; - } + to_read =3D stream->params.period_bytes - buffer->size; + to_read =3D MIN(to_read, available); + to_read =3D MIN(to_read, max_size - buffer->size); + size =3D audio_be_read(stream->s->audio_be, + stream->voice.in, + buffer->data + buffer->size, + to_read); + if (!size) { + available =3D 0; + break; + } + buffer->size +=3D size; + available -=3D size; + if (buffer->size >=3D stream->params.period_bytes) { + return_rx_buffer(stream, buffer); + break; } if (!available) { break; } } + if (!available) { + break; + } } } =20 @@ -1315,11 +1293,9 @@ static inline void virtio_snd_pcm_flush(VirtIOSoundP= CMStream *stream) (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) ? return_tx_bu= ffer : return_rx_buffer; =20 - WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) { - while (!QSIMPLEQ_EMPTY(&stream->queue)) { - buffer =3D QSIMPLEQ_FIRST(&stream->queue); - cb(stream, buffer); - } + while (!QSIMPLEQ_EMPTY(&stream->queue)) { + buffer =3D QSIMPLEQ_FIRST(&stream->queue); + cb(stream, buffer); } } =20 @@ -1338,14 +1314,12 @@ static void virtio_snd_unrealize(DeviceState *dev) if (stream) { virtio_snd_process_cmdq(stream->s); virtio_snd_pcm_close(stream); - qemu_mutex_destroy(&stream->queue_mutex); g_free(stream); } } g_free(vsnd->pcm.streams); } g_free(vsnd->pcm.pcm_params); - qemu_mutex_destroy(&vsnd->cmdq_mutex); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_EVENT]); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_TX]); @@ -1366,12 +1340,10 @@ static void virtio_snd_reset(VirtIODevice *vdev) */ g_assert(QSIMPLEQ_EMPTY(&vsnd->invalid)); =20 - WITH_QEMU_LOCK_GUARD(&vsnd->cmdq_mutex) { - while (!QTAILQ_EMPTY(&vsnd->cmdq)) { - cmd =3D QTAILQ_FIRST(&vsnd->cmdq); - QTAILQ_REMOVE(&vsnd->cmdq, cmd, next); - virtio_snd_ctrl_cmd_free(cmd); - } + while (!QTAILQ_EMPTY(&vsnd->cmdq)) { + cmd =3D QTAILQ_FIRST(&vsnd->cmdq); + QTAILQ_REMOVE(&vsnd->cmdq, cmd, next); + virtio_snd_ctrl_cmd_free(cmd); } } =20 diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index e28f1be5db9..fce7d1feea2 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -146,7 +146,6 @@ struct VirtIOSoundPCMStream { SWVoiceIn *in; SWVoiceOut *out; } voice; - QemuMutex queue_mutex; bool active; uint32_t latency_bytes; QSIMPLEQ_HEAD(, VirtIOSoundPCMBuffer) queue; @@ -218,9 +217,7 @@ struct VirtIOSound { AudioBackend *audio_be; VMChangeStateEntry *vmstate; virtio_snd_config snd_conf; - QemuMutex cmdq_mutex; QTAILQ_HEAD(, virtio_snd_ctrl_command) cmdq; - bool processing_cmdq; /* * Convenience queue to keep track of invalid tx/rx queue messages ins= ide * the tx/rx callbacks. --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381267; cv=none; d=zohomail.com; s=zohoarc; b=YnXmpu5hxnZex8GHyN+b3ROt34Hk+x0illDu7AUa9oFBvXnronsYFgshTn9yYizYR9DWwH0RVJtIepP7TZw8t1+qT/l/ilXz5n7eM/0POTT4z+hROTcLgnIPALhfCo6wF/H8flRwIcn1t5H9W40QcFQJqUAYHsZNMTlLGbUZ1k8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381267; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=TJj4Ri/er6WCzbSYJh3lKMBqyusayhQK3/yghefxeh4=; b=BctD2P+RVnBaDwtawBCyTz2kMmsI1HUSY4fwcw1E0BA1h86xalnKtP4nabZh+lg0QZN4bfjvFvTZnbdXz1PMSIWzaudzYkL0lNz/V5cUzWfAtXAHsNkg0AdDe9J3TitmtWPmutaJ6VtRZ7CCEzOt3Z0CQmqhcbFgtlW9fWIVBRY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381267292434.7237279634626; Thu, 25 Jun 2026 02:54:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglY-0005lt-Nf; Thu, 25 Jun 2026 05:53:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcglW-0005l9-8B for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:52:58 -0400 Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglU-0003jd-JP for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:52:58 -0400 Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-490b3637b90so13478795e9.3 for ; Thu, 25 Jun 2026 02:52:56 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.52.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:52:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381175; x=1782985975; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TJj4Ri/er6WCzbSYJh3lKMBqyusayhQK3/yghefxeh4=; b=cMFIQVCRFZW7VAoXaBUxeyiRkxpcIvD4XBT+hkTjYxfLDMLUY3P+IinCBPesc+lpV2 y1YpeFAiS8HtHdVpzf48EwL2F66doe6EkbjL6KW5TCtul3nuiiGaFDvejeQApvsXVcCP 49UOY90ZyAZsPZxsk3AtHvhbV2e278sG2QD+0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381175; x=1782985975; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=TJj4Ri/er6WCzbSYJh3lKMBqyusayhQK3/yghefxeh4=; b=TjtbwZFzU6TjJy0A0ip4Jcq/pQgKhsujafICx2e/WJEd0kzDUCuyF9t1xbM685hNfU kvZbE2DdQ4Rkn2m3n5yogE2KrMmDbTHTvHZF7i8ItQxwZa4tgEoOacODRmqhxEv+Vvs5 kRsRPzYiHvCvKPTp0eIepVaC9pOf7mmWO9QMIRB9RqYRy042Uc9smlfkOSinx6QlU05g 3DPVTxRpBA3jAqcZqDXZ2maI7CZpa8kjvo8rG5tqAUYoHTzlx1fHNgA6mJ0dEMtJHl0q bmTsHp3JrKauO2pXGrdsJNT/nkBszcmDKOq9oZDIWcmiI0+0ev9yKQuL9QKcvyYfXAUM o5Bg== X-Gm-Message-State: AOJu0YwkbVU+c7nxQK7wMK85QmynOC1DIOhzna7lbFEw+4v/CE7IiU6d j9K7wy96qGbud2wkJ46JgG60GMP/omfZkBEi8ow6B3QBsO13tdVWkSKyg83b5LOXqbrwKtB3+7J y1+7H3iIBkQ== X-Gm-Gg: AfdE7clyZAwN5GhUIN0qYI+aGZnLw07LHT5+Svtdpuy4sfcc0LHjwUgWLNSFidpTEvr /Tos6y44h/8QC+nQefBcdWz8aFc3h1HJTRqREBDkkDJNGjXjErsL0F/y0WfQoDm9TlTX4QQ8XZL Cs+00ldbMf3PJyYXWux5+4k8OAdim73vw7N4rRcpoir+B2J4+GMe1QXh6D7S/EhEb3msIB2PBJe SHitcYysik0l5f6W8qp1pk0qnwvlZCX2d4MP9M8qF41ddcCjduw78l4qKDUEYlutO/Gv2dMOYXu 4z+MRSvcyMXbLCNIntKQXWQKYId7pU8aiwvdlgqcFzVz0ONFNwCyyVqJFNWkB5CYcLtcN6cpW3e TAU03Y+XVrGMXacvG8cJ9vs2Bj9+SZU5f4ofZ9H2UtfyrFDWZNpzhljdJE9dBPuG/4SngnitE3T pO91Zceh1hj2E1jlwYffZFrAWXvBk9+CcG5c2Gl6bwKm/DXLp70atbpHjDpkjhthP9698/wZEA6 Z5g4chkl/E84U/XrlkwGmM= X-Received: by 2002:a05:600c:4353:b0:492:1eed:3e67 with SMTP id 5b1f17b1804b1-49266893383mr14956425e9.26.1782381175109; Thu, 25 Jun 2026 02:52:55 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 2/9] hw/audio/virtio-sound: allocate an array of streams Date: Thu, 25 Jun 2026 11:52:42 +0200 Message-ID: <20260625095250.65073-3-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32c; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x32c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381268717158500 From: Volker R=C3=BCmelin It is much easier to migrate an array of structs than individual structs that are accessed via a pointer to a pointer to an array of pointers to struct. For this reason, allocate an array of streams in virtio_snd_realize() and initialise all stream variables that are constant at runtime immediately after allocation. This makes it easier to remove the virtio_snd_set_pcm_params() and virtio_snd_pcm_prepare() calls in the realisation phase and to migrate the audio streams of the virtio sound device after the next few patches. Signed-off-by: Volker R=C3=BCmelin [AM: there were too many conflicts, I did `git checkout --ours -- <.>` and then reimplemented the patch idea /AM] Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/audio/virtio-snd.c | 35 ++++++++++++++++++++++------------- include/hw/audio/virtio-snd.h | 1 + 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 6eb31e2838e..ebf2ec4b3f6 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -436,12 +436,9 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s,= uint32_t stream_id) =20 stream =3D virtio_snd_pcm_get_stream(s, stream_id); if (stream =3D=3D NULL) { - stream =3D g_new0(VirtIOSoundPCMStream, 1); + stream =3D &s->streams[stream_id]; stream->active =3D false; - stream->id =3D stream_id; - stream->s =3D s; stream->latency_bytes =3D 0; - QSIMPLEQ_INIT(&stream->queue); =20 /* * stream_id >=3D s->snd_conf.streams was checked before so this is @@ -451,14 +448,6 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s,= uint32_t stream_id) } =20 virtio_snd_get_qemu_audsettings(&as, params); - stream->info.direction =3D stream_id < s->snd_conf.streams / 2 + - (s->snd_conf.streams & 1) ? VIRTIO_SND_D_OUTPUT : VIRTIO_SND_D_INP= UT; - stream->info.hdr.hda_fn_nid =3D VIRTIO_SOUND_HDA_FN_NID; - stream->info.features =3D 0; - stream->info.channels_min =3D 1; - stream->info.channels_max =3D as.nchannels; - stream->info.formats =3D supported_formats; - stream->info.rates =3D supported_rates; stream->params =3D *params; =20 stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; @@ -1046,6 +1035,25 @@ static void virtio_snd_realize(DeviceState *dev, Err= or **errp) vsnd->vmstate =3D qemu_add_vm_change_state_handler(virtio_snd_vm_state_change, vsnd); =20 + vsnd->streams =3D g_new0(VirtIOSoundPCMStream, vsnd->snd_conf.streams); + + for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { + VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; + + stream->id =3D i; + stream->s =3D vsnd; + QSIMPLEQ_INIT(&stream->queue); + stream->info.hdr.hda_fn_nid =3D VIRTIO_SOUND_HDA_FN_NID; + stream->info.features =3D 0; + stream->info.formats =3D supported_formats; + stream->info.rates =3D supported_rates; + stream->info.direction =3D + i < vsnd->snd_conf.streams / 2 + (vsnd->snd_conf.streams & 1) + ? VIRTIO_SND_D_OUTPUT : VIRTIO_SND_D_INPUT; + stream->info.channels_min =3D 1; + stream->info.channels_max =3D 2; + } + vsnd->pcm.streams =3D g_new0(VirtIOSoundPCMStream *, vsnd->snd_conf.streams); vsnd->pcm.pcm_params =3D @@ -1314,12 +1322,13 @@ static void virtio_snd_unrealize(DeviceState *dev) if (stream) { virtio_snd_process_cmdq(stream->s); virtio_snd_pcm_close(stream); - g_free(stream); } } g_free(vsnd->pcm.streams); } g_free(vsnd->pcm.pcm_params); + g_free(vsnd->streams); + vsnd->streams =3D NULL; virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_EVENT]); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_TX]); diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index fce7d1feea2..d65e6ba85be 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -214,6 +214,7 @@ struct VirtIOSound { VirtQueue *queues[VIRTIO_SND_VQ_MAX]; uint64_t features; VirtIOSoundPCM pcm; + VirtIOSoundPCMStream *streams; AudioBackend *audio_be; VMChangeStateEntry *vmstate; virtio_snd_config snd_conf; --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381261; cv=none; d=zohomail.com; s=zohoarc; b=chk6HHS+uFVTHSroMrqVpwU/54dKJFB6zRpZ+e96tsXHiRbeq9kzVob9gHaAy9No9F/9kAbVBb+3b9h340dW/mVyHJf077sJ6QjXkV5TXMJYsPI7pUS+EmzPmwmC3SRJRt4OdgmUO3hG61y+tGi3YvCEPpvF1VNB7QNkcNxFrZA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381261; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yFafHQUd4rrDPA5LCXYhKe5X31gRWu/+Xf2MdNeQ34U=; b=dkSL7FqryK6uGaDsmf68J4UjTqAhxPUGSwNDw316eCCDA4cP1KAwn0SyCJ1JQlIQ3mkG+DsqQTG1X7zmuHZEGex0dp+ZjInz3gW60cxO+kFonk8u+cPPNHPZhvx2/3Qws9Rc+h3x41vc2GX0+ssElBgIHoNWDUK20PNTPrdji+I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381261810911.130117190223; Thu, 25 Jun 2026 02:54:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcgln-0005qg-Lg; Thu, 25 Jun 2026 05:53:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcglX-0005lR-AZ for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:00 -0400 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglV-0003jl-HO for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:52:59 -0400 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-49241896317so9242135e9.3 for ; Thu, 25 Jun 2026 02:52:57 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.52.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:52:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381176; x=1782985976; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yFafHQUd4rrDPA5LCXYhKe5X31gRWu/+Xf2MdNeQ34U=; b=gHhz5vwb6gfnYJB9az4yjrgEHez6jQOax4LA//3ovdSA9+AzR9S9mWfpnhtzEUKbzW NN2QR+X/MO2HxhTzchTBK9wVhu5elicT4Bv0etWepA8bn7HDDTlRVnw3vVRU/H2VQSya afV269ll1str8LnEv2yiuNQG/Vv0qM5CUABFE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381176; x=1782985976; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yFafHQUd4rrDPA5LCXYhKe5X31gRWu/+Xf2MdNeQ34U=; b=L9DmuXQ89AGPq5QXmg/v08WWsxWYDOhNPJ+GdQDHEcJ7wBKwQuYwuU+tYI8WZGIMEG HbsdYPzRR9CXVow9hSwqtQIRUryHaTIaMVo1yVglfZQgecYj3pbhNnFIhA9cUYXM/E3t n+Hq5UWiloNRIr8j5vUV9trt1WV8qDynm0u4v857UPKfM27stOQJtGzMbscHb0Gb7pCC r5mGvmVbB6Ng6oBr0prx7dfC5a//XIrvyh90a4MVMaj20b5JNhAkQAMhOH+ZsW9q3mx1 NQymh4AjQfX3JVmWxcxvzQiUgYJtsmetTcg4PTsIGQ8Yt6UpPjVpMECSZGX8MM/KIWP8 APbA== X-Gm-Message-State: AOJu0YyWUzDyZjBNXdQCk6LMuS42JYKLYS2NtE17EGFy19amI+JvNFT9 Qa8//SJrO2FSVkc7CySRTmwah0E/aDkBYlxgH9Fw15YnNkcn7EuA/nd9Lp75wJRuJDTTmq3vDb7 qSrsANIMSRQ== X-Gm-Gg: AfdE7cnG1De8lCTqQ5RL4U+DEAf2l090EvFaL8mLe47MDasZXZMGlA7N8vI9LFKVnbw oKjJm47wU4dZi9ASWSTlJ2yM+TOeNG1uAjudYvX2vrfeEzpfKrAcroS3ENeY4KV1QBWjcm8aDek vqsGPEJ+EKfFwaj/4ijKHbogIa1ClZkpClLZ+uzeCwg5ur/kb+wJZe5bdiCsjOdIdJsD2RW4fOz NSUygQhtTzFyrtqk+jBVEpFhogRm4bR9INC30V8GT+fjOfuL3CUfwi5sqJDt3E34zjVFb0LcjCI 5V3gjIdazJFmuwkl1kSCiU+HbtPH9vUqNF1ezcNtz7Jrgp81RGcqFhYgNnN+NeBLUlYNZqgXLFk qNib9xS9rWgPMTJzxIs6UfHDEPlvT38ARhUJSp8hHoRt1p3oVWchRRFHeSeN4gurcWmhZih51y3 0DxOOJck3rSEXccFTI+avm1QiPKizmgxOKkfXih5DSmLaW6SXiothdhxCQ9l3qfD//Jnpdw+jcC 7TTVHB6xj9p X-Received: by 2002:a05:600c:c3dc:10b0:492:3e69:62df with SMTP id 5b1f17b1804b1-4926685a7a9mr17698915e9.15.1782381176205; Thu, 25 Jun 2026 02:52:56 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 3/9] hw/audio/virtio-sound: free all stream buffers on reset Date: Thu, 25 Jun 2026 11:52:43 +0200 Message-ID: <20260625095250.65073-4-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::330; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x330.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381262875158500 From: Volker R=C3=BCmelin All remaining stream buffers in the stream queues must be freed after a reset. This is the initial state of the virtio-sound device. Signed-off-by: Volker R=C3=BCmelin [AM: trivial variable rename s -> vsnd] Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/audio/virtio-snd.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index ebf2ec4b3f6..7687261192d 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -1341,6 +1341,7 @@ static void virtio_snd_reset(VirtIODevice *vdev) { VirtIOSound *vsnd =3D VIRTIO_SND(vdev); virtio_snd_ctrl_command *cmd; + uint32_t i; =20 /* * Sanity check that the invalid buffer message queue is emptied at th= e end @@ -1354,6 +1355,16 @@ static void virtio_snd_reset(VirtIODevice *vdev) QTAILQ_REMOVE(&vsnd->cmdq, cmd, next); virtio_snd_ctrl_cmd_free(cmd); } + + for (i =3D 0; i < vsnd->snd_conf.streams; i++) { + VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; + VirtIOSoundPCMBuffer *buffer; + + while ((buffer =3D QSIMPLEQ_FIRST(&stream->queue))) { + QSIMPLEQ_REMOVE_HEAD(&stream->queue, entry); + virtio_snd_pcm_buffer_free(buffer); + } + } } =20 static void virtio_snd_class_init(ObjectClass *klass, const void *data) --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381248; cv=none; d=zohomail.com; s=zohoarc; b=R1krKdrB09iPQuGth6R3rmRDKWKO5b8lGYW9yAVYI17c9fLJnm/zRdDuF6PQfsHyzz4SEqVuJ8J1KxDlSv9geAY8PXN71rMu+8sb2miIrNxBPVMLn7WxGfkmRMhB89dNA8M+wYKmdz8BMEMfwZEiecUvSdJfqhyzXMSWOvNZsJk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381248; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=gXkTltMaq7lALkG1TXv2ug72HZtl+VlrvnvFl8WY/bE=; b=bssHKlH9N/j3SsMMFOCbu2rNGDYfFxQfxOaATqoIQ1Gg12CCwb7pPywK/waS9JT8Zjo4L0IcoHQGqOdMWhVrf0+YiPgJW4UhIyl0htrzKzLAcsDMgkobSYV1KcPkFUPbTbTlVzyTN0Bwr4yo00ufGRO5mZNWroFqNvmWXx1+jiI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381248443741.9735016734429; Thu, 25 Jun 2026 02:54:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglk-0005nH-9H; Thu, 25 Jun 2026 05:53:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcglY-0005lu-S4 for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:01 -0400 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglX-0003k0-5t for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:00 -0400 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-49249707788so10634795e9.2 for ; Thu, 25 Jun 2026 02:52:58 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.52.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:52:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381178; x=1782985978; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gXkTltMaq7lALkG1TXv2ug72HZtl+VlrvnvFl8WY/bE=; b=UcAJK77U5zF2QBeZjKEEkSH+CMYCVytkqLoh+twaCTi4MGeaO2dibZ+7eBpNu1Jb/0 xDgR0gOaYNtFr0SDcIdqkQgRhFHV85V/GW5YhryJ6KO3dn+rnbmm9UxOCdtrO1QiXtDj +P5USd22MgvU+7lF6CGwyF4VI58ZjKXyUXvAM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381178; x=1782985978; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gXkTltMaq7lALkG1TXv2ug72HZtl+VlrvnvFl8WY/bE=; b=OR9s9wj3uRvV8L7Xpz65JUu1JyrHZ4+Obcgf6BsZDT7BV7W2uMjL1DsJGtO73bSaMn OJ+O5134q4NAPGjvrKTL7pkBTP0pAzsGz9+w8GBduGZafUV6XGHUHeaiKhnAPBfMNQtm qSP1SvxLq/xOcMHop7/XUiDpI2XivFTIFJpDKLqqSjHl2n3kYQX+aXbqpy6JUPVS/VgS NaibtaklrOXgn1pkzqoAD+QeMS9z3wZE4/EG539BLku86pJB1ftJpfDARRTtkn3MyjwQ QK39yGEtHqbASiY5vf89iUCg3PN00sWj+80zWdEnts6QzUPW/Ld+U0qfy76BGli6KHnb UzZQ== X-Gm-Message-State: AOJu0YyFwkBw7Nmr3iRxJbi7sgTtmo40/yGYU/vhRn1DjG1sM57mlLcs uJgjMMUgHak4kGc2e+zyioF77lBR2I9Z1RL+EHiVGL0aEr81toB6zRygEZVUqu5e9yoIbNv6i9h 64Cj8e2Z5gA== X-Gm-Gg: AfdE7cln7cFRTfjFHUIrsDFcuY3io9YpJ+Xa+1yjfFq1AUHt7FVNlOnrSsRgrbg4DIF Wb57cp0Tas5Hdf5rVkmdiSZALLizJH/iTrpI0ZhmmgUP6Cn/Tz4ryek1i7c7BCrzYA0qT+JT4nB avq4HLhdEx9VA0cJxzeypyesKlsy6kmBnp8qMbTqXTaO3J8hyT+FEg+Hdy+2TcC2qyuwwoKX99i QSzlI3upocR+jf+G0gCg7lsJ4VCmq3qr9ppQMWtsvydY5qdyTbni1f0ktorYNBMpPQ50kWrxApU S+7CIO52NgIS0vPrRj8pnjjX5mDxEKRs+OSqmQ7Y433eJzMqe04MYL6+XU18LWD/JddnsYDa+CM 2sRnXkhrr24BEX0C4XhvmoEVcLD/2SHT4aF252gPAIw/hkT9Yl+Y9j9QPX2KdonTXfr3qzxffo2 Hh+7y3GzelgYl+P2GCdn+RbjKwfaHab28cJNsT1A+sR9WHLw5TLdmgueH4yCKSjSTDKifFHMOtJ 9w5IYQrUkCP X-Received: by 2002:a05:600c:46d5:b0:492:324d:e93f with SMTP id 5b1f17b1804b1-492668aa926mr19806145e9.36.1782381177494; Thu, 25 Jun 2026 02:52:57 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 4/9] hw/audio/virtio-sound: split out virtio_snd_pcm_start_stop() Date: Thu, 25 Jun 2026 11:52:44 +0200 Message-ID: <20260625095250.65073-5-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32f; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x32f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381250683158500 From: Volker R=C3=BCmelin Split out virtio_snd_pcm_start_stop(). This is a preparation for the next patch so that it doesn't become too big. Signed-off-by: Volker R=C3=BCmelin [AM: there were too many conflicts, I did `git checkout --ours -- <.>` and then reimplemented the patch idea /AM] Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/audio/trace-events | 3 ++- hw/audio/virtio-snd.c | 57 ++++++++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/hw/audio/trace-events b/hw/audio/trace-events index 30f59215453..75d1fb37bd9 100644 --- a/hw/audio/trace-events +++ b/hw/audio/trace-events @@ -53,7 +53,8 @@ virtio_snd_unrealize(void *snd) "snd %p: unrealize" virtio_snd_handle_pcm_set_params(uint32_t stream) "VIRTIO_SND_PCM_SET_PARA= MS called for stream %"PRIu32 virtio_snd_handle_ctrl(void *vdev, void *vq) "snd %p: handle ctrl event fo= r queue %p" virtio_snd_handle_pcm_info(uint32_t stream) "VIRTIO_SND_R_PCM_INFO called = for stream %"PRIu32 -virtio_snd_handle_pcm_start_stop(const char *code, uint32_t stream) "%s ca= lled for stream %"PRIu32 +virtio_snd_handle_pcm_start(uint32_t stream) "VIRTIO_SND_R_PCM_START calle= d for stream %"PRIu32 +virtio_snd_handle_pcm_stop(uint32_t stream) "VIRTIO_SND_R_PCM_STOP called = for stream %"PRIu32 virtio_snd_handle_pcm_release(uint32_t stream) "VIRTIO_SND_PCM_RELEASE cal= led for stream %"PRIu32 virtio_snd_handle_code(uint32_t val, const char *code) "ctrl code msg val = =3D %"PRIu32" =3D=3D %s" virtio_snd_handle_chmap_info(void) "VIRTIO_SND_CHMAP_INFO called" diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 7687261192d..80dc13318af 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -521,7 +521,42 @@ static void virtio_snd_handle_pcm_prepare(VirtIOSound = *s, } =20 /* - * Handles VIRTIO_SND_R_PCM_START. + * Starts/Stops a VirtIOSound card stream. + * Returns the response status code. (VIRTIO_SND_S_*). + * + * @s: VirtIOSound device + * @stream_id: stream id + * @start: whether to start or stop the stream + */ +static uint32_t virtio_snd_pcm_start_stop(VirtIOSound *s, + uint32_t stream_id, + bool start) +{ + VirtIOSoundPCMStream *stream; + + stream =3D virtio_snd_pcm_get_stream(s, stream_id); + if (!stream) { + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } + + if (start) { + trace_virtio_snd_handle_pcm_start(stream_id); + } else { + trace_virtio_snd_handle_pcm_stop(stream_id); + } + + stream->active =3D start; + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + audio_be_set_active_out(s->audio_be, stream->voice.out, start); + } else { + audio_be_set_active_in(s->audio_be, stream->voice.in, start); + } + + return cpu_to_le32(VIRTIO_SND_S_OK); +} + +/* + * Handles VIRTIO_SND_R_PCM_START and VIRTIO_SND_R_PCM_STOP. * * @s: VirtIOSound device * @cmd: The request command queue element from VirtIOSound cmdq field @@ -531,7 +566,6 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSoun= d *s, virtio_snd_ctrl_command *cmd, bool start) { - VirtIOSoundPCMStream *stream; virtio_snd_pcm_hdr req; uint32_t stream_id; size_t msg_sz =3D iov_to_buf(cmd->elem->out_sg, @@ -549,24 +583,7 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSou= nd *s, } =20 stream_id =3D le32_to_cpu(req.stream_id); - cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_OK); - trace_virtio_snd_handle_pcm_start_stop(start ? "VIRTIO_SND_R_PCM_START= " : - "VIRTIO_SND_R_PCM_STOP", stream_id); - - stream =3D virtio_snd_pcm_get_stream(s, stream_id); - if (stream) { - stream->active =3D start; - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - audio_be_set_active_out(s->audio_be, stream->voice.out, start); - } else { - audio_be_set_active_in(s->audio_be, stream->voice.in, start); - } - } else { - error_report("Invalid stream id: %"PRIu32, stream_id); - cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_BAD_MSG); - return; - } - stream->active =3D start; + cmd->resp.code =3D virtio_snd_pcm_start_stop(s, stream_id, start); } =20 /* --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381207; cv=none; d=zohomail.com; s=zohoarc; b=Pu1kEcZAviiwKl/7dWsHD0d3W4l/KuW1tN7VAkHQl4ZNONc6l8mlgcXCePPHXq09hyGMfbPNvCTDAUiwNS7rv5HDDNqEu5goboikhW5Mw0y3kHDWgF5LCXt7IScTlti0El8nD8EdRaF2QFw/Led+L77IT31/AC9W/eYcX95DUFM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381207; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lri0bRdBhkCLGxACsdkqhrYXwIEgpqDLyxURVvr3nz8=; b=AUp0dmSCU68nIdss1T1pN2vZ+t9g41IhpH51hlDFNiZ1/jT3tBgQQst17Nptrw7XLhuSesDzH1uAO9CmJ3KmtS3PysbKI6OGs/hISffLY9AucNzR6VBCeV6hSGvVsywa82JfgdOsLlV5rB5aIOs0SpSLIGzjwym2EHHffBY/dNk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381207062997.6028439121274; Thu, 25 Jun 2026 02:53:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglj-0005n0-VD; Thu, 25 Jun 2026 05:53:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcgla-0005mG-Us for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:03 -0400 Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglY-0003kI-DO for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:02 -0400 Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-4903d730b1fso22051955e9.2 for ; Thu, 25 Jun 2026 02:53:00 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.52.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:52:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381179; x=1782985979; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lri0bRdBhkCLGxACsdkqhrYXwIEgpqDLyxURVvr3nz8=; b=aCVreMjXKNjVyBaXMKGwlDn9HLkr2V6eLofhQGqvRvdBgX93Nd/puTGCXyeyrG2VqE dyx/U14o0XL1OzlbQ9fm1nfTHN1fbiUeEjbgP3g4VAy/eBC7OLK28k+7IVkpZlbh89VJ QrV2XsQlbYltOnpgvMz7Jq4ekwZy11W+FEN8U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381179; x=1782985979; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lri0bRdBhkCLGxACsdkqhrYXwIEgpqDLyxURVvr3nz8=; b=SScAggmK+z7Hpp36Xfox7huMofyU/cRpvNI38NJXsBY6+KXHqp8VVG8CWfqijZ67Wz l/4aKISxC0DgNHVc6XltODOmGyQbiGDbvsdr1x6MBM5xranZ1EZ0byFXXJ7y/90pMRPq Tc2aDlfSi9gw428+78LThn/u5gefgo0OwXWjrVW6Uo8jdb8iviFDKQ03ebsux+4N3dYE BqUotbd9KQhL/66nOi2mppFMF70LpWOr+UIy5ap+R41P9lvlD6ea4dmXdJPAVmU8YRDa mlYVBL2DSJa3ZH246X8L0MHdN5P3kIPjEj0pXKRjVqRzu9saU561w24HBCuYK1uYNSVT e8aQ== X-Gm-Message-State: AOJu0YzCFWYvaIFFF2P4boNlBJuQ5GcuAubhTeFUKUagW7cnvETgPrvR nSByZCNzDkgoXzXsXvyb5m+mGxTU/GBfbMqXr1hK+PfS7vlMhnkEVq+QjsEcgXZ+68AVEKmJhXx XlE6z7ykSfw== X-Gm-Gg: AfdE7cnwkBCAk6nX7BbD/II1olmbcbudiV9gru/bUIE2T8eBYMtntYOw+3KL1xl/c7R hv0FigWq8mTvqcTLUPNiDAU5bHQORtxzZ7hIwLRKZ8Q8jVHSgZ9RgNZQYfm2w+TfBZ156hU68Se zNkH63w64peXlxYo362hXScAiGLTeo9t9pZyXJRkiDjE6Iurv60dlECukaqIWOHSwGAHFaTpOPd jCxbNa5YLZr8oZ1cIO1Mt0cUpWD0SfosHPovTViJ464UdOzfv3Ip+CketjyIU9KQz2yL1qJOJTk DgKOylz9G+Z6rtlJvoCyvxNxEnOuik2T6L6w4jWc+3F3fE1vVXT8kt+jCq3IgmI2SUeZss00zAD jcFZT5eQVGDIky5FsRDIjJuvQs1mEZu3i3keIp0L1IpVtDvmzEypaAqhUQ9fbRU9GrqVZuBBUDt 6OO12YZBcWMueyxo1esX9KMK2zXAQYV5fEPhYvWLAsVf+BUvY3UVAPHeAoT0Y9LcnSSTGCIL8/t RrMz4KRdLUm X-Received: by 2002:a05:600c:34c2:b0:490:d946:47cf with SMTP id 5b1f17b1804b1-49266832378mr23614735e9.4.1782381178782; Thu, 25 Jun 2026 02:52:58 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 5/9] hw/audio/virtio-sound: add stream state variable Date: Thu, 25 Jun 2026 11:52:45 +0200 Message-ID: <20260625095250.65073-6-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32c; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x32c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381210925158500 From: Volker R=C3=BCmelin So far, only rudimentary checks have been made to ensure that the guest only performs state transitions permitted in virtio-v1.2-csd01 5.14.6.6.1 PCM Command Lifecycle. Add a state variable per audio stream and check all state transitions. Because only permitted state transitions are possible, only one copy of the audio stream parameters is required and these do not need to be initialised with default values. The state variable will also make it easier to restore the audio stream after migration. Signed-off-by: Volker R=C3=BCmelin [AM: there were too many conflicts, I did `git checkout --ours -- <.>` and then reimplemented the patch idea /AM] Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 196 +++++++++++++++++++--------------- include/hw/audio/virtio-snd.h | 18 +--- 2 files changed, 109 insertions(+), 105 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 80dc13318af..388a302255a 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -30,11 +30,30 @@ #define VIRTIO_SOUND_CHMAP_DEFAULT 0 #define VIRTIO_SOUND_HDA_FN_NID 0 =20 +#define VSND_PCMSTREAM_STATE_F_PARAMS_SET 0x10000 +#define VSND_PCMSTREAM_STATE_F_PREPARED 0x20000 +#define VSND_PCMSTREAM_STATE_F_ACTIVE 0x40000 + +#define VSND_PCMSTREAM_STATE_UNINITIALIZED 0 +#define VSND_PCMSTREAM_STATE_PARAMS_SET (1 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET) +#define VSND_PCMSTREAM_STATE_PREPARED (2 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET \ + | VSND_PCMSTREAM_STATE_F_PREPAR= ED) +#define VSND_PCMSTREAM_STATE_STARTED (4 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET \ + | VSND_PCMSTREAM_STATE_F_PREPAR= ED \ + | VSND_PCMSTREAM_STATE_F_ACTIVE) +#define VSND_PCMSTREAM_STATE_STOPPED (6 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET \ + | VSND_PCMSTREAM_STATE_F_PREPAR= ED) +#define VSND_PCMSTREAM_STATE_RELEASED (7 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET) + static void virtio_snd_pcm_out_cb(void *data, int available); static void virtio_snd_process_cmdq(VirtIOSound *s); static void virtio_snd_pcm_flush(VirtIOSoundPCMStream *stream); static void virtio_snd_pcm_in_cb(void *data, int available); -static void virtio_snd_unrealize(DeviceState *dev); =20 static uint32_t supported_formats =3D BIT(VIRTIO_SND_PCM_FMT_S8) | BIT(VIRTIO_SND_PCM_FMT_U8) @@ -129,7 +148,7 @@ static VirtIOSoundPCMStream *virtio_snd_pcm_get_stream(= VirtIOSound *s, uint32_t stream_id) { return stream_id >=3D s->snd_conf.streams ? NULL : - s->pcm.streams[stream_id]; + &s->streams[stream_id]; } =20 /* @@ -141,8 +160,8 @@ static VirtIOSoundPCMStream *virtio_snd_pcm_get_stream(= VirtIOSound *s, static virtio_snd_pcm_set_params *virtio_snd_pcm_get_params(VirtIOSound *s, uint32_t strea= m_id) { - return stream_id >=3D s->snd_conf.streams ? NULL - : &s->pcm.pcm_params[stream_id]; + return stream_id >=3D s->snd_conf.streams ? NULL : + &s->streams[stream_id].params; } =20 /* @@ -245,11 +264,10 @@ static void virtio_snd_handle_pcm_info(VirtIOSound *s, =20 /* * Set the given stream params. - * Called by both virtio_snd_handle_pcm_set_params and during device - * initialization. * Returns the response status code. (VIRTIO_SND_S_*). * * @s: VirtIOSound device + * @stream_id: stream id * @params: The PCM params as defined in the virtio specification */ static @@ -257,14 +275,25 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s, uint32_t stream_id, virtio_snd_pcm_set_params *params) { + VirtIOSoundPCMStream *stream; virtio_snd_pcm_set_params *st_params; =20 - if (stream_id >=3D s->snd_conf.streams || s->pcm.pcm_params =3D=3D NUL= L) { + if (stream_id >=3D s->snd_conf.streams) { virtio_error(VIRTIO_DEVICE(s), "Streams have not been initialized.= \n"); return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - st_params =3D virtio_snd_pcm_get_params(s, stream_id); + stream =3D virtio_snd_pcm_get_stream(s, stream_id); + + switch (stream->state) { + case VSND_PCMSTREAM_STATE_UNINITIALIZED: + case VSND_PCMSTREAM_STATE_PARAMS_SET: + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_RELEASED: + break; + default: + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } =20 if (params->channels < 1 || params->channels > AUDIO_MAX_CHANNELS) { error_report("Number of channels is not supported."); @@ -281,6 +310,8 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s, return cpu_to_le32(VIRTIO_SND_S_NOT_SUPP); } =20 + st_params =3D virtio_snd_pcm_get_params(s, stream_id); + st_params->buffer_bytes =3D le32_to_cpu(params->buffer_bytes); st_params->period_bytes =3D le32_to_cpu(params->period_bytes); st_params->features =3D le32_to_cpu(params->features); @@ -289,6 +320,13 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s, st_params->format =3D params->format; st_params->rate =3D params->rate; =20 + if (stream->state & VSND_PCMSTREAM_STATE_F_PREPARED) { + /* implicit VIRTIO_SND_R_PCM_RELEASE */ + virtio_snd_pcm_flush(stream); + } + + stream->state =3D VSND_PCMSTREAM_STATE_PARAMS_SET; + return cpu_to_le32(VIRTIO_SND_S_OK); } =20 @@ -398,15 +436,13 @@ static void virtio_snd_get_qemu_audsettings(audsettin= gs *as, */ static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream) { - if (stream) { - virtio_snd_pcm_flush(stream); - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - audio_be_close_out(stream->s->audio_be, stream->voice.out); - stream->voice.out =3D NULL; - } else if (stream->info.direction =3D=3D VIRTIO_SND_D_INPUT) { - audio_be_close_in(stream->s->audio_be, stream->voice.in); - stream->voice.in =3D NULL; - } + virtio_snd_pcm_flush(stream); + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + audio_be_close_out(stream->s->audio_be, stream->voice.out); + stream->voice.out =3D NULL; + } else if (stream->info.direction =3D=3D VIRTIO_SND_D_INPUT) { + audio_be_close_in(stream->s->audio_be, stream->voice.in); + stream->voice.in =3D NULL; } } =20 @@ -423,32 +459,23 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s= , uint32_t stream_id) virtio_snd_pcm_set_params *params; VirtIOSoundPCMStream *stream; =20 - if (s->pcm.streams =3D=3D NULL || - s->pcm.pcm_params =3D=3D NULL || - stream_id >=3D s->snd_conf.streams) { + stream =3D virtio_snd_pcm_get_stream(s, stream_id); + if (!stream) { return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - params =3D virtio_snd_pcm_get_params(s, stream_id); - if (params =3D=3D NULL) { + switch (stream->state) { + case VSND_PCMSTREAM_STATE_PARAMS_SET: + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_RELEASED: + break; + default: return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - stream =3D virtio_snd_pcm_get_stream(s, stream_id); - if (stream =3D=3D NULL) { - stream =3D &s->streams[stream_id]; - stream->active =3D false; - stream->latency_bytes =3D 0; - - /* - * stream_id >=3D s->snd_conf.streams was checked before so this is - * in-bounds - */ - s->pcm.streams[stream_id] =3D stream; - } + params =3D virtio_snd_pcm_get_params(s, stream_id); =20 virtio_snd_get_qemu_audsettings(&as, params); - stream->params =3D *params; =20 stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; stream->positions[1] =3D VIRTIO_SND_CHMAP_FR; @@ -472,6 +499,8 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, = uint32_t stream_id) audio_be_set_volume_in_lr(s->audio_be, stream->voice.in, 0, 255, 2= 55); } =20 + stream->state =3D VSND_PCMSTREAM_STATE_PREPARED; + return cpu_to_le32(VIRTIO_SND_S_OK); } =20 @@ -540,12 +569,28 @@ static uint32_t virtio_snd_pcm_start_stop(VirtIOSound= *s, } =20 if (start) { + switch (stream->state) { + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_STOPPED: + break; + default: + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } + trace_virtio_snd_handle_pcm_start(stream_id); + stream->state =3D VSND_PCMSTREAM_STATE_STARTED; } else { + switch (stream->state) { + case VSND_PCMSTREAM_STATE_STARTED: + break; + default: + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } + trace_virtio_snd_handle_pcm_stop(stream_id); + stream->state =3D VSND_PCMSTREAM_STATE_STOPPED; } =20 - stream->active =3D start; if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { audio_be_set_active_out(s->audio_be, stream->voice.out, start); } else { @@ -639,6 +684,15 @@ static void virtio_snd_handle_pcm_release(VirtIOSound = *s, return; } =20 + switch (stream->state) { + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_STOPPED: + break; + default: + cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + return; + } + if (virtio_snd_pcm_get_io_msgs_count(stream)) { /* * virtio-v1.2-csd01, 5.14.6.6.5.1, @@ -653,6 +707,8 @@ static void virtio_snd_handle_pcm_release(VirtIOSound *= s, virtio_snd_pcm_flush(stream); } =20 + stream->state =3D VSND_PCMSTREAM_STATE_RELEASED; + cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_OK); } =20 @@ -874,12 +930,11 @@ static void virtio_snd_handle_tx_xfer(VirtIODevice *v= dev, VirtQueue *vq) } stream_id =3D le32_to_cpu(hdr.stream_id); =20 - if (stream_id >=3D vsnd->snd_conf.streams - || vsnd->pcm.streams[stream_id] =3D=3D NULL) { + if (stream_id >=3D vsnd->snd_conf.streams) { goto tx_err; } =20 - stream =3D vsnd->pcm.streams[stream_id]; + stream =3D &vsnd->streams[stream_id]; if (stream->info.direction !=3D VIRTIO_SND_D_OUTPUT) { goto tx_err; } @@ -954,13 +1009,12 @@ static void virtio_snd_handle_rx_xfer(VirtIODevice *= vdev, VirtQueue *vq) } stream_id =3D le32_to_cpu(hdr.stream_id); =20 - if (stream_id >=3D vsnd->snd_conf.streams - || !vsnd->pcm.streams[stream_id]) { + if (stream_id >=3D vsnd->snd_conf.streams) { goto rx_err; } =20 - stream =3D vsnd->pcm.streams[stream_id]; - if (stream =3D=3D NULL || stream->info.direction !=3D VIRTIO_SND_D= _INPUT) { + stream =3D &vsnd->streams[stream_id]; + if (stream->info.direction !=3D VIRTIO_SND_D_INPUT) { goto rx_err; } =20 @@ -1019,8 +1073,6 @@ static void virtio_snd_realize(DeviceState *dev, Erro= r **errp) ERRP_GUARD(); VirtIOSound *vsnd =3D VIRTIO_SND(dev); VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); - virtio_snd_pcm_set_params default_params =3D { 0 }; - uint32_t status; =20 trace_virtio_snd_realize(vsnd); =20 @@ -1058,6 +1110,7 @@ static void virtio_snd_realize(DeviceState *dev, Erro= r **errp) VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; =20 stream->id =3D i; + stream->state =3D VSND_PCMSTREAM_STATE_UNINITIALIZED; stream->s =3D vsnd; QSIMPLEQ_INIT(&stream->queue); stream->info.hdr.hda_fn_nid =3D VIRTIO_SOUND_HDA_FN_NID; @@ -1071,21 +1124,9 @@ static void virtio_snd_realize(DeviceState *dev, Err= or **errp) stream->info.channels_max =3D 2; } =20 - vsnd->pcm.streams =3D - g_new0(VirtIOSoundPCMStream *, vsnd->snd_conf.streams); - vsnd->pcm.pcm_params =3D - g_new0(virtio_snd_pcm_set_params, vsnd->snd_conf.streams); - virtio_init(vdev, VIRTIO_ID_SOUND, sizeof(virtio_snd_config)); virtio_add_feature(&vsnd->features, VIRTIO_F_VERSION_1); =20 - /* set default params for all streams */ - default_params.features =3D 0; - default_params.buffer_bytes =3D cpu_to_le32(8192); - default_params.period_bytes =3D cpu_to_le32(2048); - default_params.channels =3D 2; - default_params.format =3D VIRTIO_SND_PCM_FMT_S16; - default_params.rate =3D VIRTIO_SND_PCM_RATE_48000; vsnd->queues[VIRTIO_SND_VQ_CONTROL] =3D virtio_add_queue(vdev, 64, virtio_snd_handle_ctrl); vsnd->queues[VIRTIO_SND_VQ_EVENT] =3D @@ -1096,28 +1137,6 @@ static void virtio_snd_realize(DeviceState *dev, Err= or **errp) virtio_add_queue(vdev, 64, virtio_snd_handle_rx_xfer); QTAILQ_INIT(&vsnd->cmdq); QSIMPLEQ_INIT(&vsnd->invalid); - - for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { - status =3D virtio_snd_set_pcm_params(vsnd, i, &default_params); - if (status !=3D cpu_to_le32(VIRTIO_SND_S_OK)) { - error_setg(errp, - "Can't initialize stream params, device responded w= ith %s.", - print_code(status)); - goto error_cleanup; - } - status =3D virtio_snd_pcm_prepare(vsnd, i); - if (status !=3D cpu_to_le32(VIRTIO_SND_S_OK)) { - error_setg(errp, - "Can't prepare streams, device responded with %s.", - print_code(status)); - goto error_cleanup; - } - } - - return; - -error_cleanup: - virtio_snd_unrealize(dev); } =20 static inline void update_latency(VirtIOSoundPCMStream *s, size_t used) @@ -1166,7 +1185,7 @@ static void virtio_snd_pcm_out_cb(void *data, int ava= ilable) if (!virtio_queue_ready(buffer->vq)) { return; } - if (!stream->active) { + if (!(stream->state & VSND_PCMSTREAM_STATE_F_ACTIVE)) { /* Stream has stopped, so do not perform audio_be_write. */ return_tx_buffer(stream, buffer); continue; @@ -1260,7 +1279,7 @@ static void virtio_snd_pcm_in_cb(void *data, int avai= lable) if (!virtio_queue_ready(buffer->vq)) { return; } - if (!stream->active) { + if (!(stream->state & VSND_PCMSTREAM_STATE_F_ACTIVE)) { /* Stream has stopped, so do not perform audio_be_read. */ return_rx_buffer(stream, buffer); continue; @@ -1333,17 +1352,15 @@ static void virtio_snd_unrealize(DeviceState *dev) qemu_del_vm_change_state_handler(vsnd->vmstate); trace_virtio_snd_unrealize(vsnd); =20 - if (vsnd->pcm.streams) { + if (vsnd->streams) { + virtio_snd_process_cmdq(vsnd); for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { - stream =3D vsnd->pcm.streams[i]; - if (stream) { - virtio_snd_process_cmdq(stream->s); - virtio_snd_pcm_close(stream); + stream =3D &vsnd->streams[i]; + if (stream->state & VSND_PCMSTREAM_STATE_F_PREPARED) { + virtio_snd_pcm_flush(stream); } } - g_free(vsnd->pcm.streams); } - g_free(vsnd->pcm.pcm_params); g_free(vsnd->streams); vsnd->streams =3D NULL; virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]); @@ -1377,6 +1394,9 @@ static void virtio_snd_reset(VirtIODevice *vdev) VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; VirtIOSoundPCMBuffer *buffer; =20 + virtio_snd_pcm_close(stream); + stream->state =3D VSND_PCMSTREAM_STATE_UNINITIALIZED; + while ((buffer =3D QSIMPLEQ_FIRST(&stream->queue))) { QSIMPLEQ_REMOVE_HEAD(&stream->queue, entry); virtio_snd_pcm_buffer_free(buffer); diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index d65e6ba85be..28d0322b979 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -75,8 +75,6 @@ typedef struct VirtIOSoundPCMStream VirtIOSoundPCMStream; =20 typedef struct virtio_snd_ctrl_command virtio_snd_ctrl_command; =20 -typedef struct VirtIOSoundPCM VirtIOSoundPCM; - typedef struct VirtIOSoundPCMBuffer VirtIOSoundPCMBuffer; =20 /* @@ -121,32 +119,19 @@ struct VirtIOSoundPCMBuffer { uint8_t data[]; }; =20 -struct VirtIOSoundPCM { - /* - * PCM parameters are a separate field instead of a VirtIOSoundPCMStre= am - * field, because the operation of PCM control requests is first - * VIRTIO_SND_R_PCM_SET_PARAMS and then VIRTIO_SND_R_PCM_PREPARE; this - * means that some times we get parameters without having an allocated - * stream yet. - */ - virtio_snd_pcm_set_params *pcm_params; - VirtIOSoundPCMStream **streams; -}; - struct VirtIOSoundPCMStream { virtio_snd_pcm_info info; virtio_snd_pcm_set_params params; uint32_t id; + uint32_t state; /* channel position values (VIRTIO_SND_CHMAP_XXX) */ uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; VirtIOSound *s; - bool flushing; audsettings as; union { SWVoiceIn *in; SWVoiceOut *out; } voice; - bool active; uint32_t latency_bytes; QSIMPLEQ_HEAD(, VirtIOSoundPCMBuffer) queue; }; @@ -213,7 +198,6 @@ struct VirtIOSound { =20 VirtQueue *queues[VIRTIO_SND_VQ_MAX]; uint64_t features; - VirtIOSoundPCM pcm; VirtIOSoundPCMStream *streams; AudioBackend *audio_be; VMChangeStateEntry *vmstate; --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381275; cv=none; d=zohomail.com; s=zohoarc; b=lpdiA6vvTekm5CEAXE/xbkgiAI25p5kRNL20vfqWGoVNAE1g76KFkvXFYg00zhS51yoAFFaWQNyssbQQJ9U+Ga0nzPlyvQKfM7rCcg/Mrn0gDcSRVlru87WDkCm14EIs7jQ7P2i6OOt4Xum7+VyVh9F/sZ2QcA60wuEY1rhB0zU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381275; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=IKuIg4zbqYwV4S76dTptYDjrz/DIacx24m9jlVXUL40=; b=PWCxi6gkhj1xQtLojb4jpmGJYfC56NyjU4fInc/R2ocs6QSlvg75XCekbAdtCko2tgfXhNqi34Aa5JfaD6wDOHAHPbMaR4zG2VArF7qxSOdvpCoiq4mHwmS2gLtDekYaU4TQjJYFi/KWUymy2vZoIop54LPzG2zXu1LzAyOIuyA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381275243325.3427859601734; Thu, 25 Jun 2026 02:54:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcgll-0005ns-KF; Thu, 25 Jun 2026 05:53:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcglb-0005mI-VE for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:05 -0400 Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglZ-0003ka-TV for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:03 -0400 Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so20013785e9.1 for ; Thu, 25 Jun 2026 02:53:01 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.52.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:52:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381180; x=1782985980; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IKuIg4zbqYwV4S76dTptYDjrz/DIacx24m9jlVXUL40=; b=hSYqJdIpVZehUI0jc5EcuPxAImDERsC+tkJzCh6g91xcrvAZMfpg/kK9Tswu+jeB6f /8dGVQ/EshygzAAkXj15LQnT4KO7h0QULOVRMsM1Gi4+WzrPELKcAKlwYF6QEskbag1T hN5eeR4UdEtqAX2z7IGtBnF30IlEjv8JdNoIU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381180; x=1782985980; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IKuIg4zbqYwV4S76dTptYDjrz/DIacx24m9jlVXUL40=; b=cwIkIY5Z/uZEhU9c6XmG4YjVyq+Ulf/bodMcW4ApMnaPpY17CaJvXyMaVIDMFOpTEH JYcCyikHHEx0cykvkDEca5yQS68dQ1qMAobbm9FYv/9dPUldBH44GWi1csweQKFvapsG GWrywByx6aXWzWQUp4cx/djfaFydnYjbk0GGSjQcCMCB4MT/DrTO90eqIocKk3wVoV4/ r9k9z6vPTx7c+q0JibONz0KUimO6gTCFu/Y07wWaJr87KB6Zvo+w5uNaSakIVrzD8Sl8 vYHLoOhVex2tI0s/aTCLEwuW+BDZN73IIIpf3Qm060p4pt/55PZVKFSxXs6LAai9qpJc Z9YQ== X-Gm-Message-State: AOJu0YzK3A0HhYzW1tQuUMXU9k2N/KldpRVGVjab/rItadMbfBWChVrb VUXvPuFAajkTOcvg2XoxgcTpjAEwoKNGzpmIOmDQR0iKwdnieMAspd74V2bNLzzVO441TlpM1hp di2WqptNABw== X-Gm-Gg: AfdE7clSskxHtR6A8FJJUXRjEJMUOqN5Y2CXJmpCkGFCL/CqPxq8Ydyd8QhkP9YgPmb 9UqIFd3Xx+Sqsg7GDqLxxAzY4R9os9OIyJB7eYuX14bMWy4bnzX1avySqUIASWoHb9YkOHaQ4by 0qac3gIRMUD18FljVpGyYfDlCYtGw0myTGbZMN+YqZqLuM/OAbjBWBnzKrSjCWzbIif17AO3IAw RUaCWSa13M+zIFAdQ6I30N/1Tx4FUktghruG9dqw9XymDP3DtSUhSEJHX5Ykf15rzjJCWYzz9E/ uP1eZ+W6oGw5F6RChuvtq9XUajjr5UeTfEPs14KD4AiN4OeghNkc6cb/3K+xkr/xbI0eqpp9j+w 2kZ60n7+bY2DRvHLpa12GQ+tqYGDhABJoizwDdmqN5FpeZgAMWM44aU3kFd8pu0x06o8kqVMq3w D8bJTFZOc9U+K+dQ1nKDeRTy4gv55DuKX6UBMW4P5JFtJIDkzhaSR+2h2ICvc/YD3EgJB3WHAJT yqo7aENdSc2ICNvzirJkt8= X-Received: by 2002:a05:600c:4e4b:b0:490:b724:5085 with SMTP id 5b1f17b1804b1-4926689ab05mr23788205e9.33.1782381180409; Thu, 25 Jun 2026 02:53:00 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 6/9] hw/audio/virtio-sound: introduce virtio_snd_pcm_open() Date: Thu, 25 Jun 2026 11:52:46 +0200 Message-ID: <20260625095250.65073-7-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32c; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x32c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381276740158500 From: Volker R=C3=BCmelin Split out the function virtio_snd_pcm_open() from virtio_snd_pcm_prepare(). A later patch also needs the new function. There is no functional change. Signed-off-by: Volker R=C3=BCmelin [AM: trivial rebase changes] Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/audio/virtio-snd.c | 60 ++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 388a302255a..48a6ca9f09c 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -429,6 +429,38 @@ static void virtio_snd_get_qemu_audsettings(audsetting= s *as, as->big_endian =3D false; /* Conforming to VIRTIO 1.0: always little e= ndian. */ } =20 +/* + * Open a stream. + * + * @stream: VirtIOSoundPCMStream *stream + */ +static void virtio_snd_pcm_open(VirtIOSoundPCMStream *stream) +{ + virtio_snd_get_qemu_audsettings(&stream->as, &stream->params); + stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; + stream->positions[1] =3D VIRTIO_SND_CHMAP_FR; + + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + stream->voice.out =3D audio_be_open_out(stream->s->audio_be, + stream->voice.out, + "virtio-sound.out", + stream, + virtio_snd_pcm_out_cb, + &stream->as); + audio_be_set_volume_out_lr(stream->s->audio_be, + stream->voice.out, 0, 255, 255); + } else { + stream->voice.in =3D audio_be_open_in(stream->s->audio_be, + stream->voice.in, + "virtio-sound.in", + stream, + virtio_snd_pcm_in_cb, + &stream->as); + audio_be_set_volume_in_lr(stream->s->audio_be, + stream->voice.in, 0, 255, 255); + } +} + /* * Close a stream and free all its resources. * @@ -455,8 +487,6 @@ static void virtio_snd_pcm_close(VirtIOSoundPCMStream *= stream) */ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id) { - audsettings as; - virtio_snd_pcm_set_params *params; VirtIOSoundPCMStream *stream; =20 stream =3D virtio_snd_pcm_get_stream(s, stream_id); @@ -473,31 +503,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s,= uint32_t stream_id) return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - params =3D virtio_snd_pcm_get_params(s, stream_id); - - virtio_snd_get_qemu_audsettings(&as, params); - - stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; - stream->positions[1] =3D VIRTIO_SND_CHMAP_FR; - stream->as =3D as; - - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - stream->voice.out =3D audio_be_open_out(s->audio_be, - stream->voice.out, - "virtio-sound.out", - stream, - virtio_snd_pcm_out_cb, - &as); - audio_be_set_volume_out_lr(s->audio_be, stream->voice.out, 0, 255,= 255); - } else { - stream->voice.in =3D audio_be_open_in(s->audio_be, - stream->voice.in, - "virtio-sound.in", - stream, - virtio_snd_pcm_in_cb, - &as); - audio_be_set_volume_in_lr(s->audio_be, stream->voice.in, 0, 255, 2= 55); - } + virtio_snd_pcm_open(stream); =20 stream->state =3D VSND_PCMSTREAM_STATE_PREPARED; =20 --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381213; cv=none; d=zohomail.com; s=zohoarc; b=WB+OKmOuyZ2XREAGQRYs3H2SMrBHVZQEukCWuydHvVCpul1ZsyhMi4RtMTsEnKMzSgUcuJo5IiEEcXOxuK2buLROXqt7VBpz09QXdqrfhT313LfhBqWsPVz0+OXcmlNZY/MySFGPIXZbgHQQHz4dJ7ueHGPoUEGBaPxdr7n3kb4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381213; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=+QU+62G2kpYIQKz8C0MkahtdjizfxeeapbTqWi0XDWA=; b=elZxpCdvHHcqHUVVky+fgCArbdJDt6mk9ZN5tIGqRJq44Ri0nObz513XKmfYAbChtM30gmdxWqCXZRmHdLg5ZLYHIU7UmW4rkNRW2sz1BgphOPQM73WYYkt9GeXMPt63r0mtCAgTvcqg/q0wBP/Zng4fdJrN5CXnbLMNy7nFC1Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381213112382.87720655037424; Thu, 25 Jun 2026 02:53:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglm-0005oD-9T; Thu, 25 Jun 2026 05:53:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcgld-0005mN-86 for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:05 -0400 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglb-0003ko-Ms for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:04 -0400 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-4924f8db066so11687375e9.2 for ; Thu, 25 Jun 2026 02:53:03 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.53.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:53:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381182; x=1782985982; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+QU+62G2kpYIQKz8C0MkahtdjizfxeeapbTqWi0XDWA=; b=VP0Z3XIlpfQkMWByWv/a4m3/H0i8DjauxVXL2VSVFyM3nbZpQ9sdWB0/jt4qTo0fWe iAMHD7HbzoMW1S+mPgdPl46znE3Dkkew+7KcmRyEwgRL9+sAfifT6OKcgcEDLv071mVy 12RhU7W23bD8ene/LK68ThSCi591ZRzbiv8Uw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381182; x=1782985982; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+QU+62G2kpYIQKz8C0MkahtdjizfxeeapbTqWi0XDWA=; b=NBU59jJj1kFmezdrlBl/TtaZjZK+iK7weSA3dlf9KG83QHH88wnwLhIdKBn1/lyBRp g97kY6WI4Yse1r+8JFP/smHDdrKrk17BSs0TmPuDnpNVstkhkc2iQSoT1jLYsVlrWpVh VLbjxHPXS0xInLoYrn2wxm88Ts7lqFpcFuPBqrx/7QxUVsF1xiuwA1X8rEawkjoGkmza QmzUN1T/h0b6bLdsovRN7GE9zPfWv74jo+KIIgikXuTkdsaDu9Mvwnv3tkFovFw7qmsc xz4u3VSzrzTKxqseuMyAmHzCxTCNfGxHc/Nm4rGvO6sQ4yLbfa1so5JgZUqnWBc40yh7 mVcg== X-Gm-Message-State: AOJu0YzmaZwbM5mBRFiNoOF89uAhcl3qem7u7Ge6dJfR0+3Yim3VTKfT aUDt7kZmb47Ed0nV0l1w3Ckdl9fM0bNzdYwnWJ436Ag4fkLxcOoaTG15j4soWh/C+x8EQP4RJTI C//YSrUrALQ== X-Gm-Gg: AfdE7ckNoJCuJkpp1/OcWWSFxOrCSxenWUV/X0VekaTWJDQDbbN8fHyWIY/5AxJWNEl O3hgRC7b/S1cH0fqDmwKv6uplIci/JqKHuigKtydGx7KS+FuWi8TE8fvXBS6RDczjfL6vkQDlf3 yWL/ABoZ1A6hFOL4lnroui8XI835cIG/hqdvsHbfgF9rylGJLzIr+ooDxI6z9S2x2vNBs6hA2Pc gD4OsvnUxE+8LvOWeugMyGLPhppgl8CQUqcRfp6NrYQsFCoNCb3PmxhV8UEc6Fb4KiuWTQjP2ef cAZ/HhMrDLU0wRYu81f2wPWjky+uII6M5lqYjfDYKLomHJOoEoq1qCRvasTpjoSPKg/eQu3XdEb 2nEqMOd+qLYu3+mwqM+nXYoH3Fvv6OCEKmBxwRkm9d91TS19tbyjk83isS7f960oGLdG8FzBrfn rEngSpUPBrlgVk/IvkM8tzCe/Nchz84e6YAE2ijOYJw58QWzUvaZN1lVKrrW9jc0uqQgRr3xuSq DK/DwkbrU8K X-Received: by 2002:a05:600c:609a:b0:492:322c:1dc3 with SMTP id 5b1f17b1804b1-49266876a7emr21017705e9.16.1782381181908; Thu, 25 Jun 2026 02:53:01 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 7/9] hw/audio/virtio-sound: introduce virtio_snd_set_active() Date: Thu, 25 Jun 2026 11:52:47 +0200 Message-ID: <20260625095250.65073-8-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::331; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x331.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381214446158500 From: Volker R=C3=BCmelin Split out the function virtio_snd_pcm_set_active() from virtio_snd_pcm_start_stop(). A later patch also needs this new funcion. There is no functional change. Signed-off-by: Volker R=C3=BCmelin [AM: trivial rebase changes] Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/audio/virtio-snd.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 48a6ca9f09c..53f9066ab24 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -461,6 +461,21 @@ static void virtio_snd_pcm_open(VirtIOSoundPCMStream *= stream) } } =20 +/* + * Activate/deactivate a stream. + * + * @stream: VirtIOSoundPCMStream *stream + * @active: whether to activate or deactivate the stream + */ +static void virtio_snd_pcm_set_active(VirtIOSoundPCMStream *stream, bool a= ctive) +{ + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + audio_be_set_active_out(stream->s->audio_be, stream->voice.out, ac= tive); + } else { + audio_be_set_active_in(stream->s->audio_be, stream->voice.in, acti= ve); + } +} + /* * Close a stream and free all its resources. * @@ -597,11 +612,7 @@ static uint32_t virtio_snd_pcm_start_stop(VirtIOSound = *s, stream->state =3D VSND_PCMSTREAM_STATE_STOPPED; } =20 - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - audio_be_set_active_out(s->audio_be, stream->voice.out, start); - } else { - audio_be_set_active_in(s->audio_be, stream->voice.in, start); - } + virtio_snd_pcm_set_active(stream, start); =20 return cpu_to_le32(VIRTIO_SND_S_OK); } --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381248; cv=none; d=zohomail.com; s=zohoarc; b=FN4hrhzIbZprH1n74ehi+JF/G8JpxJFP7K5xx8TWHdu7cCAckn6Jinn4p0kz9yfecOYvmB3r20a6Zbi1UTxwGu32Ku3abSp7jLm4atKkpSVlLl48JCqRIMv5NjzUVC7woCes8yR9Lhp6KqD4PMD8SVxaEoWHS8VBNUiCriyK3Gg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381248; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=oOx2qm+R206+UVXi/f01/lgWrnrK6jGBH1GZz/aoU+w=; b=dA51SOBD9VpdS+zZiIVUiYe+qSF1yxfGBQ9bs4fhl2aZDSdS0lp2eQJTDMZqrO5bisryuZnvpi3HrBaq5vk6uG0w92KNyP2Ba3OCyKnM9PNaZFbTb0up0z5D/eBGXU2BjpULw6OCvL8xbPZ2KECRjoZ7yK1jAYay7qKSnfotzw4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381248854987.3872759513125; Thu, 25 Jun 2026 02:54:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglm-0005pr-Ty; Thu, 25 Jun 2026 05:53:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcgle-0005mj-PW for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:07 -0400 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcglc-0003l5-VI for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:06 -0400 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-490b3637b90so13479635e9.3 for ; Thu, 25 Jun 2026 02:53:04 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.53.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:53:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381183; x=1782985983; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oOx2qm+R206+UVXi/f01/lgWrnrK6jGBH1GZz/aoU+w=; b=IwO2YSM201HHjun0k+Xxac3t/GcCckW1qsidUHgJbXcqSgdMbPtpNEzqpl2sEAtacq oyg7lAeX/QGk7nBTUbMhNIZ3r3YSB4l72/MF6lPsan1H/tuEbShOAC5KUsE1fiU37Vws 7sTdW/HdzGjV95M0J4YGa0V5oKIvuxPoZhMDs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381183; x=1782985983; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=oOx2qm+R206+UVXi/f01/lgWrnrK6jGBH1GZz/aoU+w=; b=QnIN1OW/QeGDt+Ar4lHg+BBOfxLeM6JxN8CnOMnwa+Us6QfjXQmchgv3Jwyhz/c2nq +U6cTLm0V0gRQWy6KAgTDX53n4T1F5+IKk5C+R0hID4n64eHYVEW0cBlSDhzb5ZWQs1i tKTWDz/OA4dOwQY/eWi8+/kfBU6gjR0Vljp9jZtwlb6n/HcXjnMBUTzgquJTtpBHbEJs YUkFSrc9Zkn0u9xdzsJKrRjgkeooco5o28NKrYaCokMiJUH1ctMDepGeU42Dbh+c4Yqn 6YveOPWyuYIBsQja/uLgpRggvQRonWv2yXB8ICxGn7eIDmSvcq3lKyT4Ff5Agr4m1+U0 sXnQ== X-Gm-Message-State: AOJu0Yz7dYCseLDmJIkROawqg23cUOFlF404/QQ/hYYC38roWzsX9r93 4yjcRe69Ul4/KrHITUY3XFazAc76Qfn11oQrpt0kWGx/nI5nOY1qg4dJJb6FJsR1wcznkRL55mN WwkuEUV8wAQ== X-Gm-Gg: AfdE7ckVN34DIyYRNsQwKgbFzlaVA8Ik5G3pTVDaKVm+vKR5S8Bwr3VCRROXpNq2O3y 89qYe653DJhKljr7RFysJgwRIqVwGPAEs05qa9F7LpZc+YVWEKdAy0bXkJUmkOdnaM2JNUkn850 HITwvQKrnT/T0Qz6d1KWNEwaR9DMgXVMzk3XAeBArBZWzdOqxTt29H42ft+EpBDvzFbxMGLwg7h f7dOUKs0rxb1GAwhVcwERKPMaFDEpdeyalzoKVZ7A6HZ4EpcpphDgYSSzUfImP2oAHH8VNejyYx j+yJru+2MU9plssQi0HMYAoyEH6WjYNY9um/6YeRfgSzeay4FC2qDRZxHC6EioLREOgvmiGM/0a BKL0hy1VNz39Yt33O9KIjdDfZ/E++r5XrK1hpSNrV367vmMqUNmo81d5RVX97mtd8SNBCCV6sqx vFyRrbXZX0AccqGDYxSn1loD+D7fwqGWxIWaxX4G5Ykqt9JYMo0ZWVXvYj6Qqv+H47+eL+LbHPG KXQFK2kEC1L X-Received: by 2002:a05:600c:4353:b0:492:1eed:3e67 with SMTP id 5b1f17b1804b1-49266893383mr14961165e9.26.1782381183509; Thu, 25 Jun 2026 02:53:03 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 8/9] hw/audio/virtio-sound: add missing vmstate fields Date: Thu, 25 Jun 2026 11:52:48 +0200 Message-ID: <20260625095250.65073-9-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32f; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x32f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381250735158500 From: Volker R=C3=BCmelin The virtio-sound device is currently not migratable. Add the missing VMSTATE fields, enable migration and reconnect the audio streams after migration. The queue_inuse[] array variables mimic the inuse variable in struct VirtQueue which is private. They are needed to restart the virtio queues after migration. Signed-off-by: Volker R=C3=BCmelin [AM: trivial rebase changes] Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 83 +++++++++++++++++++++++++++++++---- include/hw/audio/virtio-snd.h | 1 + 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 53f9066ab24..b3de8abcb61 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -24,7 +24,6 @@ #include "qapi/error.h" #include "hw/audio/virtio-snd.h" =20 -#define VIRTIO_SOUND_VM_VERSION 1 #define VIRTIO_SOUND_JACK_DEFAULT 0 #define VIRTIO_SOUND_STREAM_DEFAULT 2 #define VIRTIO_SOUND_CHMAP_DEFAULT 0 @@ -78,17 +77,40 @@ static uint32_t supported_rates =3D BIT(VIRTIO_SND_PCM_= RATE_5512) | BIT(VIRTIO_SND_PCM_RATE_192000) | BIT(VIRTIO_SND_PCM_RATE_384000); =20 +static const VMStateDescription vmstate_virtio_snd_stream =3D { + .name =3D "virtio-sound-stream", + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32(state, VirtIOSoundPCMStream), + VMSTATE_UINT32(info.hdr.hda_fn_nid, VirtIOSoundPCMStream), + VMSTATE_UINT32(info.features, VirtIOSoundPCMStream), + VMSTATE_UINT64(info.formats, VirtIOSoundPCMStream), + VMSTATE_UINT64(info.rates, VirtIOSoundPCMStream), + VMSTATE_UINT8(info.direction, VirtIOSoundPCMStream), + VMSTATE_UINT8(info.channels_min, VirtIOSoundPCMStream), + VMSTATE_UINT8(info.channels_max, VirtIOSoundPCMStream), + VMSTATE_UINT32(params.buffer_bytes, VirtIOSoundPCMStream), + VMSTATE_UINT32(params.period_bytes, VirtIOSoundPCMStream), + VMSTATE_UINT32(params.features, VirtIOSoundPCMStream), + VMSTATE_UINT8(params.channels, VirtIOSoundPCMStream), + VMSTATE_UINT8(params.format, VirtIOSoundPCMStream), + VMSTATE_UINT8(params.rate, VirtIOSoundPCMStream), + VMSTATE_END_OF_LIST() + }, +}; + static const VMStateDescription vmstate_virtio_snd_device =3D { - .name =3D TYPE_VIRTIO_SND, - .version_id =3D VIRTIO_SOUND_VM_VERSION, - .minimum_version_id =3D VIRTIO_SOUND_VM_VERSION, + .name =3D "virtio-sound-device", + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32_ARRAY(queue_inuse, VirtIOSound, VIRTIO_SND_VQ_MAX), + VMSTATE_STRUCT_VARRAY_POINTER_UINT32(streams, VirtIOSound, + snd_conf.streams, + vmstate_virtio_snd_stream, VirtIOSoundPCMStream), + VMSTATE_END_OF_LIST() + }, }; =20 static const VMStateDescription vmstate_virtio_snd =3D { - .name =3D TYPE_VIRTIO_SND, - .unmigratable =3D 1, - .minimum_version_id =3D VIRTIO_SOUND_VM_VERSION, - .version_id =3D VIRTIO_SOUND_VM_VERSION, + .name =3D "virtio-sound", .fields =3D (const VMStateField[]) { VMSTATE_VIRTIO_DEVICE, VMSTATE_END_OF_LIST() @@ -800,6 +822,7 @@ process_cmd(VirtIOSound *s, virtio_snd_ctrl_command *cm= d) sizeof(virtio_snd_hdr)); virtqueue_push(cmd->vq, cmd->elem, sizeof(virtio_snd_hdr) + cmd->payload_size); + s->queue_inuse[VIRTIO_SND_VQ_CONTROL] -=3D 1; virtio_notify(VIRTIO_DEVICE(s), cmd->vq); } =20 @@ -846,6 +869,7 @@ static void virtio_snd_handle_ctrl(VirtIODevice *vdev, = VirtQueue *vq) =20 elem =3D virtqueue_pop(vq, sizeof(VirtQueueElement)); while (elem) { + s->queue_inuse[VIRTIO_SND_VQ_CONTROL] +=3D 1; cmd =3D g_new0(virtio_snd_ctrl_command, 1); cmd->elem =3D elem; cmd->vq =3D vq; @@ -956,6 +980,7 @@ static void virtio_snd_handle_tx_xfer(VirtIODevice *vde= v, VirtQueue *vq) goto tx_err; } =20 + vsnd->queue_inuse[VIRTIO_SND_VQ_TX] +=3D 1; size =3D iov_size(elem->out_sg, elem->out_num) - msg_sz; =20 buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); @@ -1035,6 +1060,7 @@ static void virtio_snd_handle_rx_xfer(VirtIODevice *v= dev, VirtQueue *vq) goto rx_err; } =20 + vsnd->queue_inuse[VIRTIO_SND_VQ_RX] +=3D 1; size =3D iov_size(elem->in_sg, elem->in_num) - sizeof(virtio_snd_pcm_status); buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); @@ -1177,6 +1203,7 @@ static inline void return_tx_buffer(VirtIOSoundPCMStr= eam *stream, virtqueue_push(buffer->vq, buffer->elem, sizeof(virtio_snd_pcm_status)); + stream->s->queue_inuse[VIRTIO_SND_VQ_TX] -=3D 1; virtio_notify(VIRTIO_DEVICE(stream->s), buffer->vq); QSIMPLEQ_REMOVE(&stream->queue, buffer, @@ -1270,6 +1297,7 @@ static inline void return_rx_buffer(VirtIOSoundPCMStr= eam *stream, virtqueue_push(buffer->vq, buffer->elem, sizeof(virtio_snd_pcm_status) + buffer->size); + stream->s->queue_inuse[VIRTIO_SND_VQ_RX] -=3D 1; virtio_notify(VIRTIO_DEVICE(stream->s), buffer->vq); QSIMPLEQ_REMOVE(&stream->queue, buffer, @@ -1387,6 +1415,40 @@ static void virtio_snd_unrealize(DeviceState *dev) virtio_cleanup(vdev); } =20 +static int virtio_snd_post_load(VirtIODevice *vdev) +{ + VirtIOSound *s =3D VIRTIO_SND(vdev); + uint32_t i; + + for (i =3D 0; i < s->snd_conf.streams; i++) { + struct VirtIOSoundPCMStream *stream; + + stream =3D virtio_snd_pcm_get_stream(s, i); + if (stream->state & VSND_PCMSTREAM_STATE_F_PREPARED) { + virtio_snd_pcm_open(stream); + + if (stream->state & VSND_PCMSTREAM_STATE_F_ACTIVE) { + virtio_snd_pcm_set_active(stream, true); + } + } + } + + for (i =3D 0; i < VIRTIO_SND_VQ_MAX; i++) { + if (s->queue_inuse[i]) { + bool rc; + + rc =3D virtqueue_rewind(s->queues[i], s->queue_inuse[i]); + if (!rc) { + error_report( + "virtio-sound: could not rewind %u elements in queue %= u", + s->queue_inuse[i], i); + } + s->queue_inuse[i] =3D 0; + } + } + + return 0; +} =20 static void virtio_snd_reset(VirtIODevice *vdev) { @@ -1419,6 +1481,10 @@ static void virtio_snd_reset(VirtIODevice *vdev) virtio_snd_pcm_buffer_free(buffer); } } + + for (i =3D 0; i < VIRTIO_SND_VQ_MAX; i++) { + vsnd->queue_inuse[i] =3D 0; + } } =20 static void virtio_snd_class_init(ObjectClass *klass, const void *data) @@ -1432,6 +1498,7 @@ static void virtio_snd_class_init(ObjectClass *klass,= const void *data) =20 dc->vmsd =3D &vmstate_virtio_snd; vdc->vmsd =3D &vmstate_virtio_snd_device; + vdc->post_load =3D virtio_snd_post_load; vdc->realize =3D virtio_snd_realize; vdc->unrealize =3D virtio_snd_unrealize; vdc->get_config =3D virtio_snd_get_config; diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index 28d0322b979..523c456436b 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -197,6 +197,7 @@ struct VirtIOSound { VirtIODevice parent_obj; =20 VirtQueue *queues[VIRTIO_SND_VQ_MAX]; + uint32_t queue_inuse[VIRTIO_SND_VQ_MAX]; uint64_t features; VirtIOSoundPCMStream *streams; AudioBackend *audio_be; --=20 2.47.3 From nobody Sun Jul 26 11:50:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1782381263; cv=none; d=zohomail.com; s=zohoarc; b=UY/Ks/kxDmGwIM2utpHNiQFU3AYeXV+sixblRok/Id77znLfO/xEETd5xa6P+r+8uaAWk7b77hJPkqtQJEjix19/LHfgcum/09aps6ihHJevuDWG3//IX3wc6xWQpsqF25+LTGMDPwHSDkMkP+M+EwDEFAJvXQ+3NrXHnAIoC5g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782381263; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Un3eHQApgu4sIeZqrs0kysA5i496iAug3k/3dQTUAwQ=; b=PIWWLUqKm4J3i6x1E3jVSTIPevafJ7qMWApFEEOjk+tYpgI4xLXb4PTTV04q3GevJF/QpvUfW1fEZuZc1OsL3ET1vJ8Bpibbw0aG2IPq4M1lp+hwBwkjhC011xIibhrTUqRWpOKHjREUFP4ZYQaCZSKJpdFIi3cuzx1veNq4tL4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782381263217149.81691823666347; Thu, 25 Jun 2026 02:54:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcglm-0005o1-4O; Thu, 25 Jun 2026 05:53:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wcglg-0005mv-BX for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:09 -0400 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcgle-0003lh-Sh for qemu-devel@nongnu.org; Thu, 25 Jun 2026 05:53:08 -0400 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-490b211ee6aso13029785e9.3 for ; Thu, 25 Jun 2026 02:53:06 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49266102bcfsm53562105e9.15.2026.06.25.02.53.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 02:53:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782381185; x=1782985985; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Un3eHQApgu4sIeZqrs0kysA5i496iAug3k/3dQTUAwQ=; b=LXfv5dggcI1bKcSLF2q89/FbDBSp0NdH7AFicfWfHFldnmr6CdB4DozPvZyzsvV5fO WDCugKwR2V472jjjXpU699BvZKfyjn2ypG24d1ZbYb4xmu68DIY/3pX3NxDG5MYP99dY k4pfIvitEsoEAJvB3L1cHrNBHyMMqhVabHC54= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782381185; x=1782985985; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Un3eHQApgu4sIeZqrs0kysA5i496iAug3k/3dQTUAwQ=; b=sUXyx2mowok2Y3A0+YZpig9lnhhMOYLmSWh9KjIXtlnT3747aj9Dmq19bp6UagfSP3 MZ9GFtBB1F6OqKXUz+AtFJvpKliKOq+QiAhPrDLKYWsOnQbiVpkgsbsMmN+P4hvAm0Wq mfRFkY5gzZQpINs/02zTOGTUC+VbNKtTycIbzE0Id9Grdp41Cer5/m5/9DQwzYoSR3lX shK/I7+8a4wliIdQ4uNAVwDyRsJRN44FyV6N8umkeXemxNSN9qLqfKwjlLRD1LTjlDop Q8lc1rHR4PucYajRnGSjNtGcdxIkyW8jmq5t7Wy2m4jKR5DRgGsYxlMS7wmHkOAx/Oew AUvg== X-Gm-Message-State: AOJu0Ywfv5CCyfanQ9a/qK/l9j237h0tJ3+eZfMlZQEN7W08pVaXWZYh 0S3TS5j2HAH4CERUCZON3AC0lMA3ss1HyhyhLxMkuBPXlFiz+TPzulX+3MRUjmLjUev5MZmvdkE jy6FNqlsbHw== X-Gm-Gg: AfdE7ckFPii5BwcmZKA1j10TbLLBh6EhztMmSJkrFljYfXybphY6A38bQj/7q/BXnqy E5ytL0BKBT28VXG8XGcFDeI/3UCtjgmmdUxD0SEw9XtA/xqGTqTpass05qj/KDhJCwWVtjdrkz7 GWNY4x167HojR22KF4cK/o+Gi3j7z5qv3p2Y4l8fvI4oKQHNUrZKW4oQX7bIUYxP5WxwzmCw0qj Nd5dzjI+D0BlC3YV1dJsHZI8dZ580GVZtW5vVi5BhVP8DqVV3poZYXYjosXhNwHk6HjuiXTuCPD 7o5DQj4P6Yy0jvUae30BqtII9mO7BfXrURspFaZnwV1VZwCIrIeS4p0mWjNwDG9FgZ0dKH6eOO9 LRMRhAY8EvNX4oO/8xf2++BlwafLq3ITde2i24E/YVcBJVDgWOsSUnhJI3NlczxoC5ZZvxDzesB 5ObI2NSPii4aeoJtyGBFLotDUSjbuqEueqF10z7KP1PwSPWNXIfhR8M5rC1jsQhbREA1mm77GhI nBQq9Na6TXlfSgJbcYzg2o= X-Received: by 2002:a05:600c:8b6d:b0:492:367f:8039 with SMTP id 5b1f17b1804b1-4926689a1c4mr27465475e9.33.1782381185524; Thu, 25 Jun 2026 02:53:05 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , Alexander Mikhalitsyn , Manos Pitsidianakis , "Michael S. Tsirkin" , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Alexander Mikhalitsyn Subject: [PATCH v2 9/9] hw/audio/virtio-sound: add placeholder for buffer write position Date: Thu, 25 Jun 2026 11:52:49 +0200 Message-ID: <20260625095250.65073-10-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625095250.65073-1-alexander@mihalicyn.com> References: <20260625095250.65073-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::330; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x330.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782381264642158500 From: Volker R=C3=BCmelin When a running audio stream is migrated, on average half of a recording stream buffer is lost or half of a playback stream buffer is played twice. Add a placeholder for the write position of the current stream buffer to the migrated data. Additional program code is required to resolve the above issues. However, the placeholder makes it possible to add code in a backwards and forwards compatible way. Signed-off-by: Volker R=C3=BCmelin Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 2 ++ include/hw/audio/virtio-snd.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index b3de8abcb61..cdd384cf4a0 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -81,6 +81,7 @@ static const VMStateDescription vmstate_virtio_snd_stream= =3D { .name =3D "virtio-sound-stream", .fields =3D (const VMStateField[]) { VMSTATE_UINT32(state, VirtIOSoundPCMStream), + VMSTATE_UINT32(buf_wpos, VirtIOSoundPCMStream), VMSTATE_UINT32(info.hdr.hda_fn_nid, VirtIOSoundPCMStream), VMSTATE_UINT32(info.features, VirtIOSoundPCMStream), VMSTATE_UINT64(info.formats, VirtIOSoundPCMStream), @@ -1431,6 +1432,7 @@ static int virtio_snd_post_load(VirtIODevice *vdev) virtio_snd_pcm_set_active(stream, true); } } + stream->buf_wpos =3D 0; } =20 for (i =3D 0; i < VIRTIO_SND_VQ_MAX; i++) { diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index 523c456436b..4c688016c25 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -124,6 +124,8 @@ struct VirtIOSoundPCMStream { virtio_snd_pcm_set_params params; uint32_t id; uint32_t state; + /* placeholder: write position in current VirtIOSoundPCMBuffer */ + uint32_t buf_wpos; /* channel position values (VIRTIO_SND_CHMAP_XXX) */ uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; VirtIOSound *s; --=20 2.47.3