From nobody Sun Jul 26 11:50:58 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=1782477378; cv=none; d=zohomail.com; s=zohoarc; b=bG1ABzaHUe2mdRwV6PSYg6Ywcj2nq7B6TEkbg2VcNEwjql1oH6JR7xbgeY2Zdo219KmAFvyAZ1TcZVNPvVI6M4OWuQymJh3hUU+Wc77HQinjfg8cwqCJg94Zu2C7Ojgoyk+m1Pi7VxxFzwp+FqMTUXorimHJR79cobX/ciO7epk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477378; 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=TxKGG99F3kpEiAK6b6KQoztUgSPaiwGgj+Li4S2uywI=; b=kAxQ8cS8IyUh5y63fnxRwkYFTsLp+2mcuTwPRC0w5eDZVikCcTyHg7pm+l1FypmSDN9m0A4ZGoKvxzjvfi8w0dlH0SQKGLeMmKBSIjQ0ky9FN1rixknOO2lgFErhesZGJrzhXf+oYqts3rVsgUorKJhaXbe2dvO9xXte+bqRP1g= 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 1782477378420965.496872596185; Fri, 26 Jun 2026 05:36:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mw-0004fw-4w; Fri, 26 Jun 2026 08:36:06 -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 1wd5mW-0004Tl-T8 for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:43 -0400 Received: from mail-wm1-x333.google.com ([2a00:1450:4864:20::333]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mR-0002vw-PC for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:37 -0400 Received: by mail-wm1-x333.google.com with SMTP id 5b1f17b1804b1-49230a567a9so4472605e9.0 for ; Fri, 26 Jun 2026 05:35:35 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477334; x=1783082134; 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=TxKGG99F3kpEiAK6b6KQoztUgSPaiwGgj+Li4S2uywI=; b=f5//vZrUictvLJipmRaDBghlyminxSSDtHpG798AO3dtKivziuaJEB3FvFVmyJ63ip R9hIgrIyV9puzGNoW1spG2XPQgbrenYTYorVgOGcTskyHK8JnGNAshraBPJBCOG5eGZh OSVdNtiWjulKUB2shpIfipJ9qknmT4yktdPMY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477334; x=1783082134; 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=TxKGG99F3kpEiAK6b6KQoztUgSPaiwGgj+Li4S2uywI=; b=e3kPrXlIAzDpZMmNtk+qFOXFiYAfOs+5hj1OvFSN7sJvPcg+cn/nNe/aZPQAlSN/o5 vp10sKL2CCKJT5b3T8nEhCGyFv36cVRtJ4G5UeBxEDxLwiu4SfSEtDbkRYfmlUsLIQkN rYwMMHLY8CT99UE0jlR/iul/WgBlGt7VyXUXUvxm4uWlSb3RO3dtyhF5Bvk1Tt66gEde 2e6RDsmc4nfthfI9OEqdQePRzAZSETY7bZXjQ3IXcILCZsZ2qx9RQwjquyXNNyWewdrn BxLi1PqAetQo/0SJQwmgT6qiUU3cYCWZluELplEoLi2YBci9GWq03CA1+247KTLFCsZA fDUQ== X-Gm-Message-State: AOJu0YxAedS9qOl+p6QSnXrrMn8ei8LaqU98iL/6OWNr1ZYfU2yAl2bZ Y/UH4bDQkPz49g1tyaotRMIUqZlWXoSsbcptLbh5fAxxEMX7wq+UO5JHCy9FXy3iNs+HN5qihFT QmFrYCe0= X-Gm-Gg: AfdE7cncDZ1GYG/lZB4ojwLtoE8tzZrBCQwx+6C7W/NexMvGoCWMXNfbpG5o44/Ca9c mKBRgDuOlgtjtd0lwYSNnGXRsXtzZOIRiOjYREJqdhM3IlMkDY9eKhhj08qF2X92D8tNtszQlyy F9NyOIjFGZolmwGt0o/NvI1Meqid2kaPGfPrwz87yvlmdrBqDMBKTEqg7eiX785avJA29F01WWg FzD8MbaifM/k871qSKCuYbwkPnafLf/EgvkX4XO8iq/445Cthigv1++u1OfjvH/d7+FBJrCzKbL TTIcQKZWXDwAOYWCcNbsEZ9g15fys8pe4DAc+bSHVDRDNpT7vs2k2kqDlpP7glumw31LJvOajTd jE08q8nESarb2DRTWrhE16rJfDI1NPj2Wck0iSdO4Lk5vxmjGPt1hjLqrMO10JsEBf5ydsXn6IB aSGiJTPm+iXRegUdriPEgrebg+qvl4nFiuLpWEzgtPP0PbyAN8pf33rvawDN5LepmXxAypqd0Yf MenmdUjq5yU X-Received: by 2002:a05:600c:3b9f:b0:492:6d16:6317 with SMTP id 5b1f17b1804b1-4926d166478mr29432165e9.1.1782477334185; Fri, 26 Jun 2026 05:35:34 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 1/9] hw/audio/virtio-sound: remove command and stream mutexes Date: Fri, 26 Jun 2026 14:35:23 +0200 Message-ID: <20260626123531.132078-2-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::333; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x333.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: 1782477380743158500 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 Reviewed-by: Manos Pitsidianakis --- 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:58 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=1782477401; cv=none; d=zohomail.com; s=zohoarc; b=U8fN+cDEAco/2sTuE4/m0eXNq/rgHteoxWNcslWlI2ztJ8ltDSBIFT8cPL8/Sw2ggf/PwCBNp9XXJcXdjANxjiVMG96EWOo9bYqA8HVSp1sUJ+MQpLw+bs7nhqHzWotW7iqJ1YfwLw1XBG28cjf41F8Mvge6Z/mDxOYQlOOiRqk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477401; 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=AW7r2QY0nXmTKyAJnyZvsgmcfNO+aR6jABn9atnw44s=; b=XzPBisEdqTzUkCqNa1rEarpAtggxQlDLsxe3NiFbvWCi9HUMsnrNo+lGbOKIVMoRq8PbW79Sq9gXuMgZL1172XnPnmdRkYnaxMB3Bnz4VEgZD0ClzBGSh4+jSrdDcoAN+2zi9XuYDedGXMk5npOZ4u46GsZC1m51K5HTN3dNsMo= 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 1782477401579155.43602812542883; Fri, 26 Jun 2026 05:36:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mq-0004WS-NS; Fri, 26 Jun 2026 08:36: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 1wd5mW-0004Tk-T0 for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:43 -0400 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mS-0002w8-Uz for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:38 -0400 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-4624a44e152so757737f8f.2 for ; Fri, 26 Jun 2026 05:35:36 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477335; x=1783082135; 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=AW7r2QY0nXmTKyAJnyZvsgmcfNO+aR6jABn9atnw44s=; b=dI9+AleVj/EqMYzXIHX1MJpIzxVRo+SEGd+JeXriBLzhu8RnxGMOj0ctARzk9rqdGI sRN9Xdt3Rov6AxF6i9KQcVz88wO23ZjLiw0xMcXCiNvBtKGHFXPOiN6eNJ/FtJM+XHp4 RUj9q0wjDvW8swfqlV9WnrSeroEWQ4vQtgsA8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477335; x=1783082135; 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=AW7r2QY0nXmTKyAJnyZvsgmcfNO+aR6jABn9atnw44s=; b=P+74nPZiWtTJcrenAwWBdMUQP8PVcZw/6pHdKYUH0ELOCql47givF98bqpnz9vNV1E FOWeNqetrTjFSf0y8lPdycx50b7YBRjNOKAJmMJjCxrifSNuBPv09KEwXvX2sL6Pg7C8 MaZJomWGW0T+i0EaukXPMAUFIuo3Uc4fmTPWTkVaDI5gRgX9f7/PONdwtXoy6Zm2+vNQ 4Jt3ys4fD2e2Rxf7KFFPRg8mYZheO+oyX0LYIUPh+wKT56/Lsa7GabcVu6BEEEJfhSqz 7k5HFF2g6erWB0u0kPy6udX55qjfGgKfkzPbpZ6VolDdwCpPqwVnv//g8PdytAufg1nA KyxA== X-Gm-Message-State: AOJu0YxI521dsWOPcKLOCFk+HbUZgMSdFpDH61BI2fXF9Z9thkDSzEGj 7lmjt2zEhA/cbENznI8OfBTcyeBHWLPCRl2Q6mPbH88I58z+6/+1JsZL3IA3m/NYk9cBsdGaJSg BMP3AGls= X-Gm-Gg: AfdE7clraPMRJgi1fsKStgjQssezRct/RKTvkuW+71Vz6D2h/sQ5ImO5B+39P6Edygu sz36jh6HYIXWtqSJ/e05sXBo8LJq//Pl9W/Q6YOe2XhFN83rCMWVgypt3y37oAapxPrxpZaPhnn 7PD/khPY8VqV2EVO2tavztArdqUpUhC4/axJWEnU1C7QsM6P2TxQbGIZCcAkvQXpqpEseJZDoo+ AgEr7iBltrPHd3GZ57b74D7L3Li4Ras04a1PJOL7HUjPI5V7owC6Wyczfa72XdAvnKi2vEYDj/0 OVDKGOpfy1WjUsjCd1IJ8SfBRaZyNYD4WwQR8LyFLSc5e0WnxlThU8tqWVay3+9af/zQnfq5dC0 jnuwJq5UC9lifIpk559EKUg6L+ke4V/++01hPn2c1mk83QIPEDpxrUL+t5OPQrOO18jXRPD707n JyExqE9NaXkNlYR8Gw326lDm6LX/REhSKS+SXhZ9pas3MeKBk3PeQC0zwFJYlh84DNqMFbxn3aH +JJZVRS8Vd4 X-Received: by 2002:a05:6000:706:b0:46f:558:a43f with SMTP id ffacd0b85a97d-46f0558a904mr3813141f8f.4.1782477335101; Fri, 26 Jun 2026 05:35:35 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 2/9] hw/audio/virtio-sound: allocate an array of streams Date: Fri, 26 Jun 2026 14:35:24 +0200 Message-ID: <20260626123531.132078-3-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::433; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x433.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: 1782477402682158500 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 --- v3: As suggested by Marc-Andr=C3=A9 Lureau: - drop VirtIOSoundPCMStream's id field --- hw/audio/virtio-snd.c | 34 +++++++++++++++++++++------------- include/hw/audio/virtio-snd.h | 2 +- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 6eb31e2838e..859c2770195 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,24 @@ 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->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 +1321,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..41c63b3f23b 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -136,7 +136,6 @@ struct VirtIOSoundPCM { struct VirtIOSoundPCMStream { virtio_snd_pcm_info info; virtio_snd_pcm_set_params params; - uint32_t id; /* channel position values (VIRTIO_SND_CHMAP_XXX) */ uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; VirtIOSound *s; @@ -214,6 +213,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:58 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=1782477417; cv=none; d=zohomail.com; s=zohoarc; b=lMOH90uLX/LLrFOhuWlkqIAgYCTqqcSGKBycSbaNpOUUdH00fnkQDAgGO5cavFUc0tMH078E23QuCBLUGp1UaDmnUZ2v0ZJtIGeVAWN0ULaYDzkDCkzMZUhwYtyzIY8ImM99GZ9EQJ6eIP/5a/uxOekQ8LC+vooj5NC9gLipTV0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477417; 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=vk22Jj3EifnDGUBBY5mcZdeXYuB5UW1kA8dVKyl8j9Y=; b=XqfzgUXwqYovyQda8SH7iO2/9uoGBtW1g5EkfIH+2Uo4hlnYqzvIwUaBsIqMNvv01B78j85DBOV0UAB/YgjmyLix4C94+YW1FOohQJi9c2Khgh1r+pNWWBTP8KML9K5GHcLVQptcAjPELel8c/MFJuli9g6A0tLqIOYmhtNoJQk= 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 178247741718952.03558610896209; Fri, 26 Jun 2026 05:36:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mt-0004Yu-R7; Fri, 26 Jun 2026 08:36:03 -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 1wd5mX-0004To-CL for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:45 -0400 Received: from mail-wr1-x42f.google.com ([2a00:1450:4864:20::42f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mT-0002wA-Lj for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:40 -0400 Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-46caaa805b2so567739f8f.0 for ; Fri, 26 Jun 2026 05:35:37 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477336; x=1783082136; 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=vk22Jj3EifnDGUBBY5mcZdeXYuB5UW1kA8dVKyl8j9Y=; b=ejxJxfHwc0/vcNG3RKgZrduxqCxnH/EUJ7Fpryqr9xV7qPazP3T6MuPvp+9otHxzZK 8ZyzcgGYRI0ucFZjlc2g9c/8KPlZl1sHvNeUs0lV0nLu/L7sct6TLk9R/zGpwSFDdM7a dle+69WfAU7iKUzl0Du4C7ePApMpxqVuC6240= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477336; x=1783082136; 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=vk22Jj3EifnDGUBBY5mcZdeXYuB5UW1kA8dVKyl8j9Y=; b=cIvoqLcPnwjFOT7i3aSCoydOi+EVm6qA7XqL2Ka1oVDvpBelap3XcND6CZAGD/N3f3 Zu5v/4A56SxQYJZ/U/E/+S/nkQSZwncOEuV7zawm980eEiz+Y/xil+HKjbzzYhte/3Xk m0GCOy56txdWSyt2Vq7/xRLRFKPpBP3RnTaiheB8DQqiBngZbzeLH0Au8PH/FFWK4Ypp dOwetMm9n6uTu1JhkosReHXYCzf+GOvr5CzYB3zZaiAbrQ22CO90cx1wYtqRm5Rqn+Ny JCLdBaO/Jz4GH48sGBZavhhKouFb0Z4J4zpZW++u2eU9oSMQ/K+sXKoqqu3oTwj/U6m8 Cpuw== X-Gm-Message-State: AOJu0YyzdKVEaq26n2UQU+SphE6LOsAFlkSUDFZVLaN4WkjIi6n5hSs5 28v26e49/KskTCwrnCHw5Cj+2PKzC/DjKik3HWboXrV/GJT/PwPbpfcoLeKpOvac4nzRbe0HADz 7imqM/qE= X-Gm-Gg: AfdE7ckOZcZw79NHayRUV6aN9pynW8Ap/Rdk7oJBbDKA6tMZ0SLEHb4Tk6ojkJ/yCnU gpaOlmtoP6Fy4j1Mh5ObTZr78JPPTRPLycKJKqru1l5PzvnS+x5dsUVFv3rug1FpBreatBq2DqP jykbekNHZZht7279Do810B+LagTJOA9Y6rhHUMKTvXYPRF49LdPvCejAiGu8JZKIuW9bc0/nLLq xatIY4KuEs2HLi66F7hRiGeXeb5I9xUY1jGkTDwlHn1XkUjEztqd+hBqy77ETZpcptNTmBzlywx sx7cE0qyUn1AiKl+sGEkfUCFnK8gqHvkwt1dyJmdWd8Moy8A42ogwtDM4qNhyB14/HiaVqfCrLW nWTf3R0XjZ39AcSRWp9ROm5YIvcP58ddoNfX2LKALgaavK2lKDZ2zDzW+IMeJZtAjWmjFZXhyM2 ttg2F3rGB6RxFxDIz3Ru3gpx51n0/xtRdeYhmpz2dBcmvqmbQy2eabwLUggPmNuL0kLNJ9/ic5N vJrB5WJxgy2 X-Received: by 2002:a05:6000:460f:b0:45e:eaed:afd2 with SMTP id ffacd0b85a97d-46dbc1bc950mr10686768f8f.0.1782477335972; Fri, 26 Jun 2026 05:35:35 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 3/9] hw/audio/virtio-sound: free all stream buffers on reset Date: Fri, 26 Jun 2026 14:35:25 +0200 Message-ID: <20260626123531.132078-4-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::42f; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x42f.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: 1782477418562158500 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 Reviewed-by: Manos Pitsidianakis --- 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 859c2770195..8f4421ba844 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -1340,6 +1340,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 @@ -1353,6 +1354,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:58 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=1782477389; cv=none; d=zohomail.com; s=zohoarc; b=KdUarMjy6yxIH1PcJVCPCfXDn26nSZZVPA9nXp+JtGFz2Yc8YctDBll/T7oKky9o4NHYNKXs9VFLIAiG3DkzNMONDoP6OsKp/7/M3rCKloJh+KFZgjVPgizZO5gcGkKaAisYT/ZC4DUMsA2mrfONVfIVJ9rJUEpdE7On7KEmTxk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477389; 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=8iZSMtc0RgKNXn8BitINnU0mBhe2/PdpCTuCtrafEh0=; b=IExBxzRKlrRGzHeYjaPx4+48/paVwicX2a9PodKEhc50ygRkZLYjaEB3UvYiJw5t2qTPIuN7O3oIkIfZrGZGOqmmKKUc6iPMCp9DOj9C0cwKaWUWe0JDlMgnRXeqzR6GJjTrfuswAta1xvUd8NTSvlY9dBu07qeDFp73qcrU47o= 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 1782477388973110.28550210242304; Fri, 26 Jun 2026 05:36:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mt-0004ZK-TZ; Fri, 26 Jun 2026 08:36:03 -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 1wd5mZ-0004U0-G5 for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:47 -0400 Received: from mail-wm1-x336.google.com ([2a00:1450:4864:20::336]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mV-0002xi-7h for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:43 -0400 Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-49249707788so7941045e9.2 for ; Fri, 26 Jun 2026 05:35:38 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477337; x=1783082137; 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=8iZSMtc0RgKNXn8BitINnU0mBhe2/PdpCTuCtrafEh0=; b=hGCCgk27PVNscs1ZFTB1B3zU9dq3GRqcUiR2237eEUQZwSBD6UmcgNRbBxVf1Ezk2c gaQhJF3kh2b8T3mzfjY+5ctA+dQufFUBaT4lV3NBMmngJxlB47E+wvuMdlFA4hcXqE7N wibqRXLRsLuTLapDInjnqXBG0zYx58fYr2LQw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477337; x=1783082137; 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=8iZSMtc0RgKNXn8BitINnU0mBhe2/PdpCTuCtrafEh0=; b=DOR+F1soY+99GANKdXLHIDf8DDg+RxKUTC7nlECQBCP5v69ipEptg2df0EVOyDO394 SEOTyDTYUwFUkbISbRBFwrFWcY/KiSBZ7CLVIjot50+La5BOuFGp/SHkufyLg8yMoQiY ERx5CbhV3vGmQJKvy3F7vFEILpiBbKveQPDh3bWPhEU8N2WaUt3F6TMY3rHrzPk7z2cn 9qiRvj2vwmNWn2rJapSq7VM1txLJrwFjI+jL32EVqIBQx5NqCKlZD+3O7NCb3KMQoEvG w1fsQ9iwhgXfd+ogPFHtTFW5VTRIMC+WJ/rb4SgXXERi2BoCtP+vvU6wwsVbR4jeLFg+ eMyQ== X-Gm-Message-State: AOJu0YxVKz8EzeavoyFyeXlb7qEkriRZVh4CHYJK0BvDlZIMdCcmHg7D O3RNNymyHrmArE/CiET76U1EVl/exvRTZpP1McbMn4jhJgC0fi0CXx5AwH0BxvSa7soEaGhj08V SGoZoOsU= X-Gm-Gg: AfdE7ckE2PQlcW64kTnmRSWIs5BOmBIhyata6Ujzx4H1kYRDDGV4kN7t+BrTgPX+w0f GMHfw1hSKQXdGofGZ7Z/6Rm9GSV67mhLPKR8eeoLmj0FHu5mB/UoVUD/ZcG+ct6jvPjite5xp0q XkKwIM6feWF97IyR0bYW/PfCmNewOyyQ5M6BoUX7mhyXz6ii6CPJzYPYYq8r2FL8QlNjwGpuRlS CfrUi/sxUkMg+XLTelffe5h5QXSSKemcnpd7l6cM0hf35EHwjw0QT+kZ//aDLwwo6pK7Ir1NFzC A6tdv0YzNNDeJ/LiUifIMKaGXW5bHTjgab5b+UWdrugUmg9hY0uWG/yq58fR+NlmAiZTVnmI/4Z yQdLN7iBbvTayr2VNsDBuPoZVG3VLXdeoF2j8qYqFqNg9hQoKwpVCwMuhvbAj/1TsgVrS0ai1XJ RHHGwow/CPEGhJW6+rUsE5O105G1tpfWfBuKHlkhZE1hI2a42myUHdoS90pRkDk+XnaFxZYg0jQ GEkmokurngc+XSvNB86FUo= X-Received: by 2002:a05:600c:8211:b0:490:b189:212d with SMTP id 5b1f17b1804b1-4926fc9cc36mr8558515e9.33.1782477336825; Fri, 26 Jun 2026 05:35:36 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 4/9] hw/audio/virtio-sound: split out virtio_snd_pcm_start_stop() Date: Fri, 26 Jun 2026 14:35:26 +0200 Message-ID: <20260626123531.132078-5-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::336; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x336.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: 1782477390671158500 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 --- v3: - resurrected error_report(..) as suggested by Marc-Andr=C3=A9 Lureau --- hw/audio/trace-events | 3 ++- hw/audio/virtio-snd.c | 59 ++++++++++++++++++++++++++++--------------- 2 files changed, 41 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 8f4421ba844..300ba13ffeb 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -521,7 +521,44 @@ 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) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Invalid stream id: %"PRIu32 "\n", __func__, stream_id); + 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 +568,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 +585,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:58 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=1782477410; cv=none; d=zohomail.com; s=zohoarc; b=F253eAJePsSW0vcziVzvQtwtSQ0AFQNm4Cm1LbCbiI44/145cp2BticD8nKUiD42bat4XgY0vdr5h6kky9k7i5LUe04alCZOlN5s+jGp4d0HiHsPP9bzG8L15ukjdgUOKl/VBCDxMHhxd3tmG9LFCY5ujeY1eU9W2DqAJR9/A5o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477410; 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=Q1jSKLcG4jApXNg8KKIBT0qB1+cwBc/ghFxp6ZsFSJQ=; b=SQiwMnVKYvgRuWD4QFPD0+YzUfqttBp1FMuVvPXgDzrGP0F1CKF9mjpQkYo2+116hxBrG0Xb4ZTC1+40ApLF/QG4C2J4fVEJyrf+e+8KexhwYNVwvnhgOavQ9u9E03dIVEHXI5zSTyOm+kUyPHWFCuiJoUHd6StDT9fPrWIiVCk= 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 17824774102551005.6410038865268; Fri, 26 Jun 2026 05:36:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5nJ-00055T-Ln; Fri, 26 Jun 2026 08:36:29 -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 1wd5mb-0004U4-KV for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:50 -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 1wd5mX-0002yr-4b for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:45 -0400 Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-49241a577d8so7079085e9.3 for ; Fri, 26 Jun 2026 05:35:39 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477338; x=1783082138; 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=Q1jSKLcG4jApXNg8KKIBT0qB1+cwBc/ghFxp6ZsFSJQ=; b=S1LZ/lNwiEni2bjL4AXfQnM+S0WWW2gSMULeB/pRbxsAG0Q4DdY6Y9HdWKZdFZlNdJ i++zS31ct+WEb2KABkkzGbdDHi+4SgRwDAaRpn2YhDS6KUfI/hVDV/sEJtevvg00lkvq pyvcLGDGwj2fGBplyThYtqDtYFhVSJyGtO0NA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477338; x=1783082138; 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=Q1jSKLcG4jApXNg8KKIBT0qB1+cwBc/ghFxp6ZsFSJQ=; b=epFSs14S5hGqUHHhLuDwCKW4tmm/EE9AQBTWnQE7WYD9w57JKHZNyLtpsN67a9C7h2 v/y3ie9Fcx44C7zIb7hwNzx8U2SBgLBblK6DO1nn4/Y/+7ioOt6WO9XR0QIISTXQehF8 mQSfL8FR6N/uGskpuNbEQcdhT30ONeesUgh3ZSeRUU66gfPN3vMo8x97XWHQ+UpoUJdq EcB/KmuK1+UGEhXSPR1rvKySvEG/whFH5SgF4hjhPWQO0eeSYpqrCRd2w0KXa/QIP08e AhunAWq+UzXDHe0fAIPHHS+KgfLQrN+QoysztiRPWAlkyakWkUINDQZn8nO66YK3Dzca 26vw== X-Gm-Message-State: AOJu0Yw+M+Xcwq09rUEWA7wTNJ1SXflNEhpq72QjizXW5aRNidBb45+5 QtcpBPdARsnZ99mespY3RkXLc2ZCstwMLXeUfeCqntg0O+noVfZdEPLmEcrllsImx3R50gvPeou 5H9ZJS6k= X-Gm-Gg: AfdE7ckS8QSyWhW1T+KFGzF2aaKQoslEmDIqI3CKpOVsCjqXmZ2paETxyBJi++rmGo0 nAMV6L0h0pFl90HfNQsBfqz426JKr7p+cs2UnRcon1SXDNupCbpXh6L0Z5IIJmsoTNzQpZbJxrF aTQK+H6CBXPzRh+UCSNbChsrZsMGy4eRI1dUBO4eR7StsJbuAW4/YNZniTZLwauJCm53aioGRzd gxPRHQMIEWJmDYXTuR4mSrV8013+JYZlUZwQ47mK75N9mrht4I+0Q7p8T1RZBFlo0I85v3RlbiL NcTVWABltf2f5qA2S2hF2hhGE7hhT6grRwqQvfFrVSOs8Nn6Wmu5DHOqi2oz/eDezHPOGoae1pZ BoMBa6i9labu3zjFYdDfmmcoz01GDlA1UTptDFfrxcDpcsmcnd8dlVuzR2fgD3sa8NArK+R+9W/ e4eB11z157tIbEeDETEpK53H85sm/F2ldLM8qVD+851JgeKDSsOneScgofUv7EqEX7u8u/QU8Rc CDNFDVgAJS1 X-Received: by 2002:a05:600c:3483:b0:490:3f7a:108b with SMTP id 5b1f17b1804b1-492668561d8mr101526865e9.16.1782477337747; Fri, 26 Jun 2026 05:35:37 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 5/9] hw/audio/virtio-sound: add stream state variable Date: Fri, 26 Jun 2026 14:35:27 +0200 Message-ID: <20260626123531.132078-6-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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: 1782477412709158500 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 --- v3: - explicitly call virtio_snd_pcm_close() from unrealize - remove a call to virtio_snd_pcm_flush() from virtio_snd_pcm_close() [ ^ this was my rebase mistake ] --- 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 300ba13ffeb..68d737478f5 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,12 @@ 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; - } + 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 +458,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 +498,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 @@ -542,12 +570,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 { @@ -641,6 +685,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, @@ -655,6 +708,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 @@ -876,12 +931,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; } @@ -956,13 +1010,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 @@ -1021,8 +1074,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 @@ -1059,6 +1110,7 @@ static void virtio_snd_realize(DeviceState *dev, Erro= r **errp) for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; =20 + 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; @@ -1072,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 @@ -1097,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) @@ -1167,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; @@ -1261,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; @@ -1334,17 +1352,16 @@ 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); } + virtio_snd_pcm_close(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]); @@ -1378,6 +1395,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 41c63b3f23b..72ef34e0976 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,31 +119,18 @@ 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 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; }; @@ -212,7 +197,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:58 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=1782477415; cv=none; d=zohomail.com; s=zohoarc; b=K38xhHpOHkMD5g3IedxOsVLWt/w+s+HlnFCtiaIFnaxGZTXtPWd/5pjS8s7UZvNiXSNBQawPcBMEK9A0RqO8U5qc8roNaB4SDZKAAL372MXiZQi3sc/Q7P6M10B0Qr+ymSXfM8jzVnLs3mqvcO9aTbr/4YX+nE4Gf4zE/GX+sxw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477415; 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=KFd85FRhGIbup+/VfXI75bIlDOMkEy7XmtIzQK1BDKE=; b=bxoLwC8kWJVHbd1P1t3R+kDuwy8ZV7KlnMF48iYJruNJjLtycyUAG9WIKNag2T5pcDg4l2Os6o6v3EoArskjEwp1+v9qo2vaJiWW0+fnSfneOEH6BmCP2GtHKXc0bWyCXD+QCGaWkPNQcffX51cUO/4mgTv6ddtYUEt/fMqdISw= 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 1782477415280993.9951637571061; Fri, 26 Jun 2026 05:36:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mu-0004bP-HZ; Fri, 26 Jun 2026 08:36:04 -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 1wd5mb-0004U5-T8 for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:50 -0400 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mY-0002zP-Vg for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:45 -0400 Received: by mail-wr1-x434.google.com with SMTP id ffacd0b85a97d-46f34d8f888so554193f8f.2 for ; Fri, 26 Jun 2026 05:35:39 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477339; x=1783082139; 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=KFd85FRhGIbup+/VfXI75bIlDOMkEy7XmtIzQK1BDKE=; b=E2LCRvo/bNznbq5ZpUvsxY8RvZy3EFD8v4+lqpJM6TfyuuJ9IpxrcLac49dKEOM5j+ 4MRjHsqQSIAmUfcmyPCUdCNB0GMGRIRDB8Hq0OVv/HVVBY5wDNENAnGh/GFSn1Thwy0c tb2Bi6MR/Ak6FNCTPbQYj7oPkJhU+rWp4C4qM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477339; x=1783082139; 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=KFd85FRhGIbup+/VfXI75bIlDOMkEy7XmtIzQK1BDKE=; b=S9+Zfl5h014Gx1L5Va9UX6nAKQyo9ZYwO2AK8w10caBL2e2Fh8dI214YQvr+eBKrQa mmX/9COtfHesQcLlbmPL6ol8U7VmhOhrxiAA4yefrWUgTinA+/FeRc3D5akoGjcx2Bue tRaw0ZOBOW5ks+88IbzpNv4aVU78c/ljSdTPhllzxHVnLmUQExc9wJPhwl/MJjFniz78 63Mwl/AC/M5sX1ZkHOuqVjNtagx9pXsUhE1tOR5n7he0d2lG4hIO/qEln/WG7ChGWI52 RoOuulxMiPEkvbS9MEhhdfGS7ocnU1KaRnUdfHV+qmK6ryLD15M4Fj9BeQVdpvXUpLy/ UrbA== X-Gm-Message-State: AOJu0YwMYdt7pJSJX+1qg/flSuQWUSZUlqXJtgFb3M8eH4nuyZL30gRU i8uk6Npqd9xpDBhQwq1TW+jl0lrnBy/iqRQNhPyKXqb8BGBJlpEd5p66R5cih6qwLsryo7Ntgj1 yUIluGpg= X-Gm-Gg: AfdE7clF1l2oPLTHtSYw0VO/Q701W95YPLo9w1g0g3i0uibeTd8JQT57uiwP+Q7Yl/c zNubu7C3Vyk2b/hpu65786qpJSbxH4Ze+QMTwVbzOprOSPVhdvcEeYLYIlnMl2tTW8IrhEUeMzW 54GgbJ8pS496HXZTLKbfvQ+isIOoRtW0vd7cJIUqPB7o85SIzoowCiFUkaY6bf1nk5ilNcnK1nm ETLdJJydsTSyz/QlK4o6Epu4chkQ9v+OVt+qA5y8LAy6feXxVoZSz99bJnlDwCvjhn7+1UYsW1O LrYMfcGOTJS7CHgO5UnEglCYRIxm2lxrOX/g2df+Czvl49n/+dkofJjRv8a3awd9Qx4cI04q8di biQtjhIXrkTpYktBYxeiUCYe5yGu+5ZP3rtsBgN23lHNYKZJlCUhlBszHFJNoNNVCowTb+UStR1 oVKuVe43bVMKAwaiiUTd9hh5g9Oxrb8113/sfnPS5od9IS1EI5Gr7eT1NIjeUOh2Cf4/mZ1TGWl CMIPdhyk+5j X-Received: by 2002:a5d:5846:0:b0:460:2eee:4e21 with SMTP id ffacd0b85a97d-46dbfca2c90mr10486647f8f.17.1782477338560; Fri, 26 Jun 2026 05:35:38 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 6/9] hw/audio/virtio-sound: introduce virtio_snd_pcm_open() Date: Fri, 26 Jun 2026 14:35:28 +0200 Message-ID: <20260626123531.132078-7-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::434; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x434.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: 1782477416551158500 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 Reviewed-by: Manos Pitsidianakis --- 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 68d737478f5..d5242a5c761 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. * @@ -454,8 +486,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); @@ -472,31 +502,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:58 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=1782477404; cv=none; d=zohomail.com; s=zohoarc; b=ZVzv3GsfrK+BejU4gwHXVzJVUEvJJ6jzvgEC/oqUomuvkA6b7OcO1w4GAs7bIGwx9yvt6dKztbrbRw6U0ap9DfWQHbm30ca9QFeR6xVSUFveqXFrmQX7VhD7yfRxfdQAlAO5HYHs9QxHz4ToCEVl18khEwpksyvVlIFpVaK7dJ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477404; 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=OlnxYRyUlKwu9KkyaE+v4ep93iJxMvBgMn51OmmZMww=; b=PkXR3YGvP1eY9HxBk+UZq0JyYIVa5V07UFfOcIXpB4XXn0CP4/+KnDoG+bppFebtUsGES5qYMK7592oYPk/VdgEKtamO3A923tz7yyC9llf5ACQTaWF8FxJi3VyTgOAIwGPbkKhJqobcEuEnoxf9FCIU1CkSPLrqVIrb9kRBE3c= 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 1782477404670427.9474493431994; Fri, 26 Jun 2026 05:36:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mv-0004d7-7W; Fri, 26 Jun 2026 08:36:05 -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 1wd5ma-0004U1-LI for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:50 -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 1wd5mX-0002zi-5F for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:44 -0400 Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-490b613a17bso8764415e9.3 for ; Fri, 26 Jun 2026 05:35:40 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477339; x=1783082139; 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=OlnxYRyUlKwu9KkyaE+v4ep93iJxMvBgMn51OmmZMww=; b=UBNK7UmNFxWoEc4zLr2DENvqzHl8ai1AGHlfvHReNlhtVRpowWR4IGo3oHJbntfcXj g61NSY02HYtroQ9n3vLSdT7GcSxwHpiJeSAVPapbFeEJbbtCGUXv4EL+3GtMb9p8ugSb FPEY5Oi7+uTHqYYC8sQFERKpegZEwLKhNmcoQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477339; x=1783082139; 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=OlnxYRyUlKwu9KkyaE+v4ep93iJxMvBgMn51OmmZMww=; b=ULOsmlAgzt/NdS1hYTfKO73YlYNuBR6BusWXGZ2ALo2zzbGgVPSPz0A6d5fj0RcNuK xUGiLJf4N8o5+mZjJkhqB2186F4+W3f26n747UuBQnMFEyMEksnf1P+YVPJmTJk111u9 FStsOkB66JwVF8UqJwTgWh0DqeK6ulJQWQsW51pSyfrSL4I9chN4hHZYSuLZLF4QY0E5 WP4oN/ltgY/Sz2DBeP2QTzdH9c0GNQzf6UoyMh/HWiwb+doLdiE6W3pVUOc5oVg0yC8B TiUwGX1tO3unQ2DKxiamdInIjVwnrP7OHLEPyM8CwRzLrT76bLRhojkRT79asWuD1q7W P4nA== X-Gm-Message-State: AOJu0YyKTW4wLrBHRgHRioQ7ZFPs7ooRUxIy68dNBfBElvT76KL4fuOo WYxDZaeYXGxONGgE6Gs24dtulsR3aNkIB/qOx9M7m8Y06/QB2rll3IDyu9w8UuUwUmJ7/TZgYBY xE5XMwzs= X-Gm-Gg: AfdE7cnbUTRVsGhBZdqBMHCk+B4Hp7zIhV3GjjJhaI3iFYYXb3pf27GwQTB+xaP4eIm xwN6tVkM1pzJzIUJoBKV0uldwLXBZpbzJDDeJP7/fjC/7MNzLzDpBeOi2BAdg1iUu4kAae3bZ5Q RMayYTZz7zPcjNdj+0ZNtEn9NGkGgfLfMC6A3Fy47lwxOZQddsT4u6tsm4WY6kwCQcjR6kU7iu8 /TJ22aZIK8jFEo8noXv0gGpcE/6TqnPmPzmPSvJ9G/zxdgK6p4mIHo7aP8o/t+NfM69iUl6YfyT YOqT7TdCPpOfjx528tcSkYh9BQ4jVJs290ceYC4/JT0TCSHbHihdd6NDxNHOlE0UiL9JkhjHXGJ 56aex1APcYRpMXBsrYzQX/do1RKuvSO4xInWL9z63pAJyGCkVUmbW2i7+SUQy+zgQ1YzghNM6QC 0hL06UQBiHgUK4dUspylfFDe3cYOfhM/xIsmVLr+RYXJsVOdW5feS9Oyp4zlnEbrfsdhSL1bouk u+IFEmVk+lf X-Received: by 2002:a05:600c:1d9a:b0:492:6df7:942a with SMTP id 5b1f17b1804b1-4926fc3a62cmr10449145e9.11.1782477339355; Fri, 26 Jun 2026 05:35:39 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 7/9] hw/audio/virtio-sound: introduce virtio_snd_set_active() Date: Fri, 26 Jun 2026 14:35:29 +0200 Message-ID: <20260626123531.132078-8-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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: 1782477406463158500 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 d5242a5c761..c9c93bd090a 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. * @@ -598,11 +613,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:58 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=1782477390; cv=none; d=zohomail.com; s=zohoarc; b=MmxJzx4c9JpD7Y/wG3tHrr73qXos5br3P7kBO5jvCms2++lv5U6eZ4/L/FnjOlDDXIzjxPq7rbHlHV5JhlxCLp8qmOvDLf+WKRCAy6w4OsSB10WR8g2wf6dm8cUKTHYR4dBBR7VDANXyW963FkkgJOmlakAlpvd9HDDL7pji1mA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477390; 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=VDGlfrEOqkPZgC6vgh9JUvXYzJlsK5MIqvHrcnbGKMM=; b=RiCsju/4vh3jQoNbGV3hJTHyte941YbxcpUrn68zmYrGvXbKtUMf/hQ86tSF3ztfymJ1GeI3thcjD9ApvSfhA1I5xM9lidqh8LU61eLP/l4M1D7KAyYWj/2X4JOskKTiwVvLFYOQhUww5g7v+FLqMGyJBr0swb7PIKnYjpPyrmc= 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 1782477390807849.8732278573617; Fri, 26 Jun 2026 05:36:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5nG-0004oE-FX; Fri, 26 Jun 2026 08:36:26 -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 1wd5mb-0004U3-Kc for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:50 -0400 Received: from mail-wr1-x42e.google.com ([2a00:1450:4864:20::42e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mZ-0002zy-21 for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:45 -0400 Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-4633193af19so547470f8f.2 for ; Fri, 26 Jun 2026 05:35:41 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477340; x=1783082140; 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=VDGlfrEOqkPZgC6vgh9JUvXYzJlsK5MIqvHrcnbGKMM=; b=O76th5PeVTusjTi14kdZCwGCaa0uy8rcp0HknNMmORkLcYHsMXWnAwG1eRZB75KiOb VNTnjWv0BKyUg8uDwpXZ/Weu9HXmLT791+0Ro80fk2lvPwnCqdWnN954Jou840lh+oP2 KjpGruMY1kCg70zxFIkGwS/I+IszKsAMae28s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477340; x=1783082140; 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=VDGlfrEOqkPZgC6vgh9JUvXYzJlsK5MIqvHrcnbGKMM=; b=PoWwDjyVW7pn61uz3M6itbUhNOcViA3boTfr2pFdHYq3tU7OV8VsVnRKKFMPH30/DL 0UAtuzCKJaQWcW8q3FNzuSa2LijzMQRmiRKWkcfSFvoYt57yFOs4MBXfrdo7hveALXr5 z3zoaL5SzmN8u1OByYpbrqsnuMptaRaeXBEL8ZBgSPqoTq34OuSD9QbedZyzn05WP2KJ flqkLHKfPDcgZrFwKEPGLgM7JNJcws5CEkHqteK4ojcwJfp/mJxfID0a8iG9CQmd1YIW MXamzd4hEbzabDJf29YTZENdJ9CItpXbiE0TahM+5XZ3Y/XlUMwp0+T07T+tR1t6z7w+ eWyw== X-Gm-Message-State: AOJu0YzSMabDpXaQOTYPkj2YzuTPSK88WEBFs0wweswuCwkoSOAv8vqM xKHLcdjq9dwyQxqu8lggLtiXu/8G6s8MDLC3Nqi+L3zMl45hzfDsf1SpqbiUMs9JQBEE/QmLJzw 9nJm3jL8= X-Gm-Gg: AfdE7cnb2qkXdX+i6K+aYRP8isNvTEgSqjBOzJ5mkNj38q+9/oX3nM/qwrVYWfj1TLO Udl3ugIqOoEcwnEY1MjqOGgNRAzlyxP7kLpBjL01VDMj9evfTv5UJ/kEAH7SVqMWN2KCrobsbv1 tSlkrIvyZUNcghDbwbjpjIp/yoINV3MKG/oJlEN+Ds3P8tIJUf3FTfCSainbnWRJW/rTz7zbJwK SxViB3QRyp0KfAuBiht8SswbksfcakKEFBq33DVzbNJ/4jnQbtOsRRrVaC/6rBBzkuDHd6ZVhw5 ahDpaiSwA8fIig/QGn+dNblkjxiqRkkS4K33RnHchAf0o2+bxlfs1g64LiU0Eq6YFK16dIFWyG7 MjZ2j69NbXShHI3vMvae6eePoSUDSC7yCxmTjED+cw8Tl5BqDkXm1dSnSORrjYWMLu6dXvQgDRV e2rZZQqoNWJsQvmB/p1WCHevNOWEsvvD/0C9bxABiJ6sENeiI23p/g9BhwYDv0gLckDGWNbcrfi WfvJLn/gxGO X-Received: by 2002:a05:6000:29d6:b0:45e:779a:302c with SMTP id ffacd0b85a97d-46fb87d2ec5mr637540f8f.29.1782477340182; Fri, 26 Jun 2026 05:35:40 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 8/9] hw/audio/virtio-sound: remove channel positions field from VirtIOSoundPCMStream Date: Fri, 26 Jun 2026 14:35:30 +0200 Message-ID: <20260626123531.132078-9-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::42e; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x42e.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: 1782477392683158500 From: Alexander Mikhalitsyn This field seems to be useless currently, as we don't implement VIRTIO_SND_R_CHMAP_INFO. Suggested-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Manos Pitsidianakis Reviewed-by: Marc-Andr=C3=A9 Lureau --- v3: - this patch was added --- hw/audio/virtio-snd.c | 2 -- include/hw/audio/virtio-snd.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index c9c93bd090a..81ba1e1a277 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -437,8 +437,6 @@ static void virtio_snd_get_qemu_audsettings(audsettings= *as, 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; =20 if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { stream->voice.out =3D audio_be_open_out(stream->s->audio_be, diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index 72ef34e0976..85d5d7c8619 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -123,8 +123,6 @@ struct VirtIOSoundPCMStream { virtio_snd_pcm_info info; virtio_snd_pcm_set_params params; uint32_t state; - /* channel position values (VIRTIO_SND_CHMAP_XXX) */ - uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; VirtIOSound *s; audsettings as; union { --=20 2.47.3 From nobody Sun Jul 26 11:50:58 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=1782477389; cv=none; d=zohomail.com; s=zohoarc; b=LC/Mw8ds98rLB8ZbbixHF5O2RbC+CuTUqbtvpQP7paVHBzPVDXjtYcXfzomwzSwjqM4yL6qO82SFdj0vr1was8leZVom06+nBxz2nBDe8eC2bFByNr1ee8qQJkBzkdck0l+f8rtaDEH5u13I5vSE4Ws/PtO26AHzuzozalaejEc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782477389; 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=pNVus+BalkmCoTPkNk7eFs2k8kuZ2QplCRnW+ImiFis=; b=ApBj/A7UeqEtaYaYUofLYpvwsFoKjV444YT8lBpnJdCyAjN7ZFXImwPhihAsp+EMfoi9z6FKwqZ4qS/72iPZYRQ3Mr8hs3IVWVTTSJlp6bB3IoveNZJc2DgS81v5ut1avJf1WGkrCr6cnp4Tsx/HjJNnJLvmyb4theVH7IA+xN8= 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 1782477389386480.6458708121128; Fri, 26 Jun 2026 05:36:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wd5mx-0004js-GM; Fri, 26 Jun 2026 08:36: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 1wd5mb-0004U2-59 for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:50 -0400 Received: from mail-wr1-x42b.google.com ([2a00:1450:4864:20::42b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wd5mZ-00030N-0Q for qemu-devel@nongnu.org; Fri, 26 Jun 2026 08:35:44 -0400 Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-4626fdc829aso556387f8f.3 for ; Fri, 26 Jun 2026 05:35:42 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a7200aa896c1ac04cb1b2.dip0.t-ipconnect.de. [2003:cf:574a:7200:aa89:6c1a:c04c:b1b2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46efd7ee1c7sm7373757f8f.14.2026.06.26.05.35.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 05:35:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782477341; x=1783082141; 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=pNVus+BalkmCoTPkNk7eFs2k8kuZ2QplCRnW+ImiFis=; b=EyFQOqqLDcM7UPwtqFIinTt9cbNiSDOMI0DmL9T5PlTlfZj9Vg2G/SKKM0LoEuPSKa d4IrrPKkiA3+PwPUhaQP+3MPdiTB5L07WBHfZzE0WTc5wpIiRmCidnqN3tFElyyVWN/O EcGhpRTSsPIXMdbUmFZEa+5oFEty59aIPdQn4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782477341; x=1783082141; 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=pNVus+BalkmCoTPkNk7eFs2k8kuZ2QplCRnW+ImiFis=; b=U8NrpY0vc0s0M/SSUSSmdCBHMFq30LatG53GCiHfKkvt0r1jjYqoQehgc0IFSbI8w8 dvZ8RGX+bdKbl6DNQT3SGeGhn9Ge1XmyE0Nc/WOnMd/OjF2rXLl0+2D2BApRWAOXegvP MtbybUg2SzI3HiO75St0l8YSZpH8D3TZClFiz5aay7ja7W1/VzRJvSH5TyApKvGPV6lF DRAoyGKxxiYqJHBofh4NC+ZUvb1XyWQGVso9iCdX45X4nB0MTSm1BRBeK4kJx9lYc1lh eufor/mSr+BbNJnr5PY/bODEY89PijBgiOv7OLyoiEBZQ/3l1C5NI7B/dPNsXqVmB1X2 /4dQ== X-Gm-Message-State: AOJu0YzEYDKuR/5oozZOsKj3hNAYQOjqVzTwO1LkLcXII5WtPJaVLiJg ONkaKQAMgE4WZak97wlgHpR+dmsOLraGTqhPL4jckCWvkKPfoQLAJHTh/YuE5UEecN4m3lcGIBr qMyKW7r4= X-Gm-Gg: AfdE7cnUZhpl2wr3BvFaw/iihZKKFOM6xYaO2LNy5yEi9dlTnmVh4Efv+NKw0gsSdnK QUJOhHX+OuhLhEsVe9xxWLhaSsOj84SS5tJWqGnT8uE4tY1EmLZBqWUMfXWStW8b+u1ITN99VeB 8+Wh4RfiBQYo+MkybXWMgJ9GqUaA3xb8c/fbtqU4ka+LIebYKHTQ4ZNvv4QLfdH8oNUh/IveP/M 6zrqqZraCrH7k1gqNr0yGsAR9x1Jv/FS9cRF26ekiJwoGwp30HYk8pL5HMFmDhuifCWEm+OysjD krRkdC7JXNkjwVvtLnJGp6gRm4BbYRZHVvogfjQhLE997GnWTODFVZ+WIleDO2mguI6Rm2UdvnQ 9QbTgCn0hSyq4+IUZKkdEGsNC7+fBJa9fdLyoof+5oqksUvlbdjjoDY1N85sNcP+eki+aVo2O9o EvkGXJJ/hhE8/XzxemW8opQLHIVEeQ8KjHTgOk34pnDZefsqhhc3t9fIjBxsRJ+XCyOlfkWBbgM W9YryRMpUDR X-Received: by 2002:a05:6000:29d2:b0:46d:d5da:f0aa with SMTP id ffacd0b85a97d-46dd5daf1ffmr8044719f8f.45.1782477341080; Fri, 26 Jun 2026 05:35:41 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Volker=20R=C3=BCmelin?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Manos Pitsidianakis , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , Gerd Hoffmann , Alexander Mikhalitsyn , "Michael S. Tsirkin" , Alexander Mikhalitsyn Subject: [PATCH v3 9/9] hw/audio/virtio-sound: add missing vmstate fields Date: Fri, 26 Jun 2026 14:35:31 +0200 Message-ID: <20260626123531.132078-10-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260626123531.132078-1-alexander@mihalicyn.com> References: <20260626123531.132078-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::42b; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x42b.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: 1782477390709158500 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 Reviewed-by: Marc-Andr=C3=A9 Lureau --- v3: - added latency_bytes field to VMStateDescription As suggested by Marc-Andr=C3=A9 Lureau: - removed the "rc" variable from virtio_snd_post_load() - dropped info field from VMStateDescription, because it can't be modified by guest and initialized only from realize - added minimum_version_id/version_id so we can extend VMStateDescription without breaking compatibility in the future --- hw/audio/virtio-snd.c | 80 +++++++++++++++++++++++++++++++---- include/hw/audio/virtio-snd.h | 1 + 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 81ba1e1a277..7af0b63c03b 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", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32(state, 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_UINT32(latency_bytes, 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", + .version_id =3D 1, + .minimum_version_id =3D 1, + .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", + .version_id =3D 1, + .minimum_version_id =3D 1, .fields =3D (const VMStateField[]) { VMSTATE_VIRTIO_DEVICE, VMSTATE_END_OF_LIST() @@ -799,6 +821,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 @@ -845,6 +868,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; @@ -955,6 +979,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); @@ -1034,6 +1059,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); @@ -1175,6 +1201,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, @@ -1268,6 +1295,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, @@ -1386,6 +1414,37 @@ 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]) { + if (!virtqueue_rewind(s->queues[i], s->queue_inuse[i])) { + error_report( + "virtio-snd: 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) { @@ -1418,6 +1477,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) @@ -1431,6 +1494,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 85d5d7c8619..384d2868c19 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -194,6 +194,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