From nobody Sun Jul 26 11:50:46 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=1782375059; cv=none; d=zohomail.com; s=zohoarc; b=C0j1a4OezcWguqPwsO2O1y7dRSWEpwfVd0n0/Mk+wA0WVlbNoSvn88sHnfYT4SBj1DhNv4lYZeEyipVWX1D2CmgbrKcYACmVuqr18SUZzQesnnNeC1iyiVg6C/sZkfzBAPqjkRbVhWAWoDRhp5yJZvHgzenvyUDmd7m2GWegRKQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782375059; 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=DLpHpa8OOkxWsW+hSrZ1Wzi0IhXXcT3liS5njp6hzZ8=; b=KSK/VuhvXwwg3kypiozoMlr2/lx0HBt+VVDN9G6Mx55bOl48byq8z+bvWYJ0JfXcPejz1JNLkEX2bb1YfDlWu/aiM89TN0fr7fpWw2uc7sC8hswh1dGAt63twYW+d9dtWdA4Lu7y/FvEe5qR/UUMFqXG8SbJ5l+30/ipwde/z1A= 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 1782375059388493.3341487594405; Thu, 25 Jun 2026 01:10:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9I-0001ed-Mu; Thu, 25 Jun 2026 04:09:24 -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 1wcf9D-0001e3-1n for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:19 -0400 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcf9A-0007sw-LV for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:18 -0400 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so19146695e9.1 for ; Thu, 25 Jun 2026 01:09:14 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374954; x=1782979754; 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=DLpHpa8OOkxWsW+hSrZ1Wzi0IhXXcT3liS5njp6hzZ8=; b=UKQ6DhnFVfXk4V8g259opg6TBAS8Y+5CgXuQ2cRB/uqGEo+4tbQVQ9wiLP8d+m+80/ wvtmXQxpwDpf769JXnlSbOUhti9gaEgyBJYAltRjEIrMkElXxrR0ErKpFFHxmNludfNL kioSq/6g4currBoxq3AoRgzRHEZWN76q95uGE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374954; x=1782979754; 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=DLpHpa8OOkxWsW+hSrZ1Wzi0IhXXcT3liS5njp6hzZ8=; b=k8+MGkuHWbM5y5feEMVNAvhmXGbM1NrQR+okhekzSRXnUmnCfgkhWrFORJNxzJXz8q hRytVHGz80STs+sRbprZjsiZt8fBnrP6ZRiJngTx963By7yF1WtlpgccPsCqfpp3IgHz tpD4sqFmuFeTn7PiDXe6vrwbAg8jhLbSYJVT0j+QcjVUCL3kVhnU4pPVzzBsAgO8ynVJ 48C5mecQ9FKsPuZx7hpthWWo8NwYSkvf2On2wRwwPh9k6zFUFODPdkb8cZtWilXIegxS phQ3MD4pqno06VMCCECgYFg24Ra6iRmVlYaFOgJ0LZMikF0jOltudtm1VsLdyW4+aWx4 BrsQ== X-Gm-Message-State: AOJu0YxcQPQg7TYiEH8Rif4ZEsqZrhzIFlckeSTUkqIMrEt0ZzgqRfsV PZ6NpgxPupSVvclHILM8uQGqCTfPLSPu+Vs0kagVBVvnM7I9wGWbKimYO2nnN4aYBtw+zSfih5G v+RIs5a3kzg== X-Gm-Gg: AfdE7cmlGaOCtyL7zxLmDLC+ie8k8/e3FD62KqCF9TMnq02S4WAAS9jKLw2zQXEn1iy 28DVJ/y19X0qdzYYY1XzUSdIxHBJC5w7TVc925OB5awm2GkDnAnEjz+4zTfzWJL2VW6/nRUw2/+ OBrIGS4eHuejmU8HAK0O4aPROjik1UdFXQDctkGgRXyiNdXTunlfnnOmdxcg+e+ajRy+Ff1ANz0 HOxBGHXFtU4HFS9xisN7fieS0Tiypu/YeqdnC9e+SGvGtUQNp19POc5nqFldPIUm5ZOSPq4klSX Kl6q1S9A2pOMvTH/umlS1UO0e5+I4HcYwVXXVwzvJ6EVDLZEjeep/eJh/7OxBoet8fgdxLo4QfB 2yzf4k2jZW6DSqz3PCZKi8t6KNXedWpJekPz2vUpW0ew7CRpV/MPzPNg2wDcE1No+7YptnG9Kx2 0L1gcB2q2AdmSY0BS/RpDlUaDBklfAnCaFBZyTiNe243BdWbg2/JQLaXhnMPgxTeY2YFTGGUZpK BjqQSA8eoy3 X-Received: by 2002:a05:600c:8b53:b0:490:9d1b:f086 with SMTP id 5b1f17b1804b1-49266864977mr18344415e9.14.1782374953271; Thu, 25 Jun 2026 01:09:13 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 1/9] hw/audio/virtio-sound: remove command and stream mutexes Date: Thu, 25 Jun 2026 10:09:02 +0200 Message-ID: <20260625080910.30569-2-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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::334; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x334.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: 1782375059904158500 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 Signed-off-by: Alexander Mikhalitsyn --- 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:46 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=1782375038; cv=none; d=zohomail.com; s=zohoarc; b=EG0rM8FODJ/NGWpIII+042meA2928GKggimw2aqHFmJ7TjBLTXEB3Ys7zrR5uqmw6lcpg9biNFfPNbFjjfkHAeRQl2q2DgfqGCLxUN+d+5dcy4NWW8+e1xSisk6eo4M7ryPv5sLKnNdk0aHd/7zeicHDbNlK3T9nrzW7gWznOZ0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782375038; 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=bLJxlS0/VNCvUknk3SrcUo8jmkLA2OeYVti9LC75F2g=; b=H27DD7gVBY23C+roZF1DT8ePIi+MbvZ01PiBiM06bKeU9aY9vA4Mp72irT11yeeD+gq5cs5bC6kg7bRj5L0qvaAcxFhJ69NVTMhv2SNgSODldzVoZzkvhLawzf+p8h5R6n2mhg5Y+uqxWnf8lLhQgujMqzib/Mn4PJynkaSi34M= 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 1782375038717736.0202327756407; Thu, 25 Jun 2026 01:10:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9M-0001j7-Q1; Thu, 25 Jun 2026 04:09:28 -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 1wcf9D-0001eC-UV for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:20 -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 1wcf9A-0007t1-Tw for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:19 -0400 Received: by mail-wm1-x333.google.com with SMTP id 5b1f17b1804b1-4926046fbc5so7635285e9.0 for ; Thu, 25 Jun 2026 01:09:15 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374954; x=1782979754; 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=bLJxlS0/VNCvUknk3SrcUo8jmkLA2OeYVti9LC75F2g=; b=O4tYK74UEaI/mlAB/dTFVVVzAvl7l9EgMZuSI/SK4jWFT9HMJQVy9HqSx0cO0VBaEd LJyHJAvQKxI13KC3NlfPz/xSLS0uBK6TL5MstjMkC0Xq3HSAIUIk52NkIpXG8RR5Imdo UGCZHUdIAQEOGVzRJF7th5eDzZLu0RyavtjYw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374954; x=1782979754; 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=bLJxlS0/VNCvUknk3SrcUo8jmkLA2OeYVti9LC75F2g=; b=N7wcDMAprqDqnmndflEBb75wGf8aLFk6LnjbTo/U49FFtdZvMAlo3rW4Y0xcLqkuRU PuwSRVL6mvVWxAZQpmW8jPTip5GfflZLraL5J87YKBLQFscq2Rdg9mxEk/xaGxSfgY49 UU9LsoQb2p5F/tZe50kFwMqaOoktE2ghkTXYdM20NYgF8xIaH9XXEJzbys8YUxMqEN81 OFUY9xGXVMOIDBM9w2Tl+P59+HGWXWefCvJzLKfuzyG4mgFlz1G2HEX+IKG7abgW4NrK PK59savN05x7nvVMPZK/+P+0VE4ETqH2Q0hUMP8jZ4Ubg8q7wjvnP0nvEJsxDc15sPmm WCNw== X-Gm-Message-State: AOJu0Yyogv/kDA7V+DRF8mLRzm904hEcC00YVuOJRsJOGmAY2B9MhJrv 5dP32rIVbIUxPteuiFznyZqMv6wNUOqRZiLbhsZnc4+704ujluPh7CpVZWpgc3TjaU27uEeIFc6 1BVNYQSoD9A== X-Gm-Gg: AfdE7cmPb0LfDs3LZjYD/R+/RU4H6H+C0ojx5wBPnx/w9h1mPVmX76t7LvsrjzGXk6U NqjP7EHQLts5I4CJFHRKnid02r+8IfEiCQqKV+T3Kn0HX0Nb7iJX4RUq2tv82S78dkUzGAB3CW1 Lz8EtWIZe8kE6L/h6AK0T41r4/e8MURKxr4D9ParQew/rmNnk0aP2an1rglQPfcHIrFL/xH+WEq 7SyaWlQKwYKmU/3W2MsKKqbJN1V8W7KOs8UUD8nomANJ1YGLG6I/vPOuCNpyn5+rNN1/9KoD4zm yuIA30FyQENheWful08/in22kzcezawoneXAUU+RwdF5lSVok0fh8oI1/5MZOBJLKHoQj5MV3xn LcD6kq8lj2p6WA6lAGyDP/9wN/B1WnUzsktKJTFrB4MkeC+ZyagRG0GScdJwvuO6vnEL2Pfef6a 2NxGapl/ar9ncniJFJXoXqSHNeh5dtdm9ww6lOKsr9qlY12rJQVNJWx8u7++jd6KQKikqb4QL4Z FR0t0xKbE2y X-Received: by 2002:a05:600c:4fc2:b0:48a:53cb:8604 with SMTP id 5b1f17b1804b1-49266423f79mr16515045e9.14.1782374954472; Thu, 25 Jun 2026 01:09:14 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 2/9] hw/audio/virtio-sound: allocate an array of streams Date: Thu, 25 Jun 2026 10:09:03 +0200 Message-ID: <20260625080910.30569-3-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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: 1782375039782158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 35 ++++++++++++++++++++++------------- include/hw/audio/virtio-snd.h | 1 + 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 6eb31e2838e..ebf2ec4b3f6 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -436,12 +436,9 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s,= uint32_t stream_id) =20 stream =3D virtio_snd_pcm_get_stream(s, stream_id); if (stream =3D=3D NULL) { - stream =3D g_new0(VirtIOSoundPCMStream, 1); + stream =3D &s->streams[stream_id]; stream->active =3D false; - stream->id =3D stream_id; - stream->s =3D s; stream->latency_bytes =3D 0; - QSIMPLEQ_INIT(&stream->queue); =20 /* * stream_id >=3D s->snd_conf.streams was checked before so this is @@ -451,14 +448,6 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s,= uint32_t stream_id) } =20 virtio_snd_get_qemu_audsettings(&as, params); - stream->info.direction =3D stream_id < s->snd_conf.streams / 2 + - (s->snd_conf.streams & 1) ? VIRTIO_SND_D_OUTPUT : VIRTIO_SND_D_INP= UT; - stream->info.hdr.hda_fn_nid =3D VIRTIO_SOUND_HDA_FN_NID; - stream->info.features =3D 0; - stream->info.channels_min =3D 1; - stream->info.channels_max =3D as.nchannels; - stream->info.formats =3D supported_formats; - stream->info.rates =3D supported_rates; stream->params =3D *params; =20 stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; @@ -1046,6 +1035,25 @@ static void virtio_snd_realize(DeviceState *dev, Err= or **errp) vsnd->vmstate =3D qemu_add_vm_change_state_handler(virtio_snd_vm_state_change, vsnd); =20 + vsnd->streams =3D g_new0(VirtIOSoundPCMStream, vsnd->snd_conf.streams); + + for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { + VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; + + stream->id =3D i; + stream->s =3D vsnd; + QSIMPLEQ_INIT(&stream->queue); + stream->info.hdr.hda_fn_nid =3D VIRTIO_SOUND_HDA_FN_NID; + stream->info.features =3D 0; + stream->info.formats =3D supported_formats; + stream->info.rates =3D supported_rates; + stream->info.direction =3D + i < vsnd->snd_conf.streams / 2 + (vsnd->snd_conf.streams & 1) + ? VIRTIO_SND_D_OUTPUT : VIRTIO_SND_D_INPUT; + stream->info.channels_min =3D 1; + stream->info.channels_max =3D 2; + } + vsnd->pcm.streams =3D g_new0(VirtIOSoundPCMStream *, vsnd->snd_conf.streams); vsnd->pcm.pcm_params =3D @@ -1314,12 +1322,13 @@ static void virtio_snd_unrealize(DeviceState *dev) if (stream) { virtio_snd_process_cmdq(stream->s); virtio_snd_pcm_close(stream); - g_free(stream); } } g_free(vsnd->pcm.streams); } g_free(vsnd->pcm.pcm_params); + g_free(vsnd->streams); + vsnd->streams =3D NULL; virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_EVENT]); virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_TX]); diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index fce7d1feea2..d65e6ba85be 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -214,6 +214,7 @@ struct VirtIOSound { VirtQueue *queues[VIRTIO_SND_VQ_MAX]; uint64_t features; VirtIOSoundPCM pcm; + VirtIOSoundPCMStream *streams; AudioBackend *audio_be; VMChangeStateEntry *vmstate; virtio_snd_config snd_conf; --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782375004; cv=none; d=zohomail.com; s=zohoarc; b=SutblNs0jqXVMuE8vbRp6Qn4nxmwY5Oo1Zt2zt04uOP86MD+RBY8U/ej0f+9F0dh30wChywwR914vlfRRg/sxOF9GHPoEe8asd2IVgf4roJ/TQh9jiGsd3JaNz0Wu/9YOxNCs67eA5Fcutkvm6HwTPvPpiODM06AOaQBG+UjybY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782375004; 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=t9V/M8CX+OrnyuBfipEW1rSJ951L/45RTb80YytIYUU=; b=DTk9Q57EZzcYZdlb5NBcWkeBVDUwNUOs9HLcgrzi3jKYLEl7sIUX3y7R3/pShqB4Svd2B0gFLo3VAbS1RQN4tyPdWGPif5AqD43T5gfG4MXggDq5MyNr/XlOq5CPQzwlyJe244/7lQRjph9HX4NviraySc2Ufq3JQ0UrO5n67ng= 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 17823750042991017.0596494611472; Thu, 25 Jun 2026 01:10:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9O-0001oh-3m; Thu, 25 Jun 2026 04:09:30 -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 1wcf9D-0001eA-Pg for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:20 -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 1wcf9B-0007tG-3E for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:19 -0400 Received: by mail-wr1-x434.google.com with SMTP id ffacd0b85a97d-4629051c9d1so1288805f8f.2 for ; Thu, 25 Jun 2026 01:09:16 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374956; x=1782979756; 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=t9V/M8CX+OrnyuBfipEW1rSJ951L/45RTb80YytIYUU=; b=KUlC6uNMq2MA1wEDC+D+BeDFucc6gLhD5vYINpb+9cD7gRL2sWa811SfqgJFknAd8V 4+QkHHLVWvGgzYMZqVXkLCFTG0EAyx8xxgEXWTrW9QBP/FTjXWRCMVEMimiH59rXhgE2 rHGIS7WfgOiE3n3IZgxKkvkQtROy42jPsihX4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374956; x=1782979756; 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=t9V/M8CX+OrnyuBfipEW1rSJ951L/45RTb80YytIYUU=; b=dory66F1WoUO/uI1nQ5jkp9xNhQINK/EL06+SmTaUIviAaapYi2lbVrTJiMJf/4eQl csIsR0bugb9v3nIIyCXH4qnIBEOcXEpAKBrVNNwKoaabfashKUHU8b0JRYA7d81rNdFO EiqPAwy9SIQHxOSvHpOVKbm+RGEJvat+2KIF45fXjxZJVPN8yioRdR9XGP9IlbI4urKm OX8hXaG5tfDD4cdX7EvLrClSggnvYiOA9BczElu5OYMlaVSytrV+nS3P3c4ffGXm2bN6 SiRMP7Fl+j123DDO5nfluTyR38B8EZS0xEbQJOHr2zB26+gxwf0FUjpcQ9oz0ZX+BJVg 9V3A== X-Gm-Message-State: AOJu0YxynnaIPedYiSZ576u6Por1HoRqMcC9s6IYTR+F3GJY9voQQmOk LqSj+txXlq+C/qrqCfRh1OpCRA4/SnMjtzUSjzIGrR6pS2/uiAVpVfXC43pQ/xUT2pq5TSMnumw eZyhOmqz0ag== X-Gm-Gg: AfdE7clYRBSXfGfyblF6F68YuPxtcv6mHP118PXLClpdTLqU/q3tCdiWyfQDTJCLwVA EyP6321Tgqv6foN6ZTtmm6fc1ndsbL4+nvKRBQYp4PG/nby8AIRfBSSyFyRkXQ8fhUumhhZn+XR nqkO8lumTGxJqVQNttRdu0dwBWgAptmVj/upBvvEjDUJyYy9NIRSDILAHWjXkfA0nFiaLUXKO0X DWPUx5xi6HFzQz0FjeGatvxxOr8EomjMy7qAtN1eua0gvCymkvPtAUOL0oN1ECxnY02O5C7s+6c gpdnWnHChiLHHn7569XF8nvxfhuv5SZYdb2uejgI4NkXMk3EhA+0x8kXNpEXRvnruFYuGMzdKbG eDCxFH4uD7nQ5IbH7WjY6M9I5yuGtTUNss0QkgvRGH0EY4/raP7Rqcqso53+8OOrKYgUV8RfSZz vjHvYGUcJTwL7MsK9vLffFU7rFoOIXS0ubx9/bwrSpetTN0Z4VM2WStFH0d7+5rANxrCKGbRlM5 J4/Atsoo2YT X-Received: by 2002:a05:6000:2c0e:b0:43f:e2b7:7160 with SMTP id ffacd0b85a97d-46dbed35f0amr2047308f8f.4.1782374955561; Thu, 25 Jun 2026 01:09:15 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 3/9] hw/audio/virtio-sound: free all stream buffers on reset Date: Thu, 25 Jun 2026 10:09:04 +0200 Message-ID: <20260625080910.30569-4-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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: 1782375005506158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index ebf2ec4b3f6..7687261192d 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -1341,6 +1341,7 @@ static void virtio_snd_reset(VirtIODevice *vdev) { VirtIOSound *vsnd =3D VIRTIO_SND(vdev); virtio_snd_ctrl_command *cmd; + uint32_t i; =20 /* * Sanity check that the invalid buffer message queue is emptied at th= e end @@ -1354,6 +1355,16 @@ static void virtio_snd_reset(VirtIODevice *vdev) QTAILQ_REMOVE(&vsnd->cmdq, cmd, next); virtio_snd_ctrl_cmd_free(cmd); } + + for (i =3D 0; i < vsnd->snd_conf.streams; i++) { + VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; + VirtIOSoundPCMBuffer *buffer; + + while ((buffer =3D QSIMPLEQ_FIRST(&stream->queue))) { + QSIMPLEQ_REMOVE_HEAD(&stream->queue, entry); + virtio_snd_pcm_buffer_free(buffer); + } + } } =20 static void virtio_snd_class_init(ObjectClass *klass, const void *data) --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782375026; cv=none; d=zohomail.com; s=zohoarc; b=aExt4HukGq1O/qSga98xQT4OgLKKcmis1FwnMZ/z8bq/VW+U/qeFpZCJW7FJ5morno08Koth1PVYtZkiMdefZoYUhqW8cwhsT6Y3C3y9s6HiTqMxX49iCtC/CvHpC/sUUVdrxN4NSKmqfQzzoqqxQQGuGkbEnWpRvqG5yosK4rQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782375026; 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=d/H9uvczVpJc8OvqtpTYZitKsAwfCq5q6IkCevVlJBc=; b=EJSWletyEyF/Eh2nctYZQmxJARs1xjkCmtULd8pxKBVQY/NfK9Y5VptD/s38GeU/W0MTmnHs1it4dg3hPSY3vNpxDCy6r0/THSb6yGVe/Dd6No9fi4ZLHB+5N9/90Y6xfhg7Cis5TF/m0WLzoTB1ICnCyk9XsG31K7bHSou7mQ0= 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 1782375026315299.1781069463102; Thu, 25 Jun 2026 01:10:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9K-0001hR-N3; Thu, 25 Jun 2026 04:09: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 1wcf9E-0001eD-F6 for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:20 -0400 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcf9C-0007tZ-Kc for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:20 -0400 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-490cdae130cso10798155e9.0 for ; Thu, 25 Jun 2026 01:09:18 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374957; x=1782979757; 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=d/H9uvczVpJc8OvqtpTYZitKsAwfCq5q6IkCevVlJBc=; b=bOnhxUBfcYEB+jZT9XtrpnkBJ+KHEF9UF+knh1Mr6wnlfnMswGo+p/nRggrOnjGf2w 4k6LIjgxxYz1g7xYNeGN947Qoqkv0fZ0HP2eokLb0zu/rJSCNmgolgDzcqmAOfTGKi+u 8PqehWZTOijcuTCwlPwNuLkMABZ2BKYSGPFxw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374957; x=1782979757; 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=d/H9uvczVpJc8OvqtpTYZitKsAwfCq5q6IkCevVlJBc=; b=iwvwY2DUF8qL1mcCPRrLXELIKLZXt3IKwyIy7Y6gG4XytW4cuEozZ5l5vm7rzFBgDf t4j9CeNb5J/Nqi4C7PjxUUAFcGgIS9wRWQWUfsh5TWzE1hY4koJb72hMaTqudf3TGRXK +54gqJMCzwrq+tc6jIIbjx+R5rJNVe+UEUHyOm00W5RDYGmYP+lm94ekkN3N//5NI84I AuuJ/RNLyRvJVUYZySjca8LsIxAOtwJzWct4ii+zdleXHAsAJVNYPWL3luDC4c5aqxhf GJTRBPUswDM9SDhEk3daC5FDJKnlsDoI32aG4I37pIowkucoFbG/7/m9fj0QyfGrQ6kI Y3Aw== X-Gm-Message-State: AOJu0YxA6uyqtsOIzcw9gTM8gNLR6BIQTS8xUrAtFMzlzS8yeUTNSO1F wPVyBnALzC++7vbO1/0+kNB8uQJyTvcNHV2vYuE9WinfT6u745t9M/XtsNwus1XPVuFu2x8DTR6 7BU8qXBAlOw== X-Gm-Gg: AfdE7clv/fGlWfFqd4/O+gObV6xtcJ3PmVXqSIXeRrkZNtLZe13n5X5xZuQAGGpHwz8 etnorpqDgTaM4kxKu2/mGWM7qZliU5K24BM2PqbI8d+AL2af0uwNDxY3YNXmWZnjivTklO6Et09 +F+vih1W5BhEOTaKuBfrsFsAmBrhdmeTIfZEIe/cn9OcuDn1AoCaCV6mW7w6zQ0AnE93te1Y/rC iE2ZeGITtDV4ZKsykMHSi5uvg6WbE//suORID87YPpeP/zgSK7Rbm4KrWzUi1rnqyt8tqLVyXaL bsN49hmpAS3nJBWM4cUbH1eQZPKXNUZR5+zVN7j/iknWB9JMFRdXy7LJoDCcHbDaU2FHzs/i4X9 nSFTokB0oW+f8ymjf+dI6t3FkVp8VvkMz9TNFRpSgF5PkN823kh/jkRu4kScLgL6EUUzsiGd0Bw LpCj1NK7Ja6q0Cyt2Abjxje5AUtLDmz3F46QY14QIcLv2SA2bpa8yfrwC3FG/Fi74W+UqCL5oJC /N81MVgaP4w X-Received: by 2002:a05:600c:6215:b0:492:348:ba08 with SMTP id 5b1f17b1804b1-4926686259cmr17287135e9.16.1782374956756; Thu, 25 Jun 2026 01:09:16 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 4/9] hw/audio/virtio-sound: split out virtio_snd_pcm_start_stop() Date: Thu, 25 Jun 2026 10:09:05 +0200 Message-ID: <20260625080910.30569-5-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-1-alexander@mihalicyn.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::331; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x331.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1782375028655158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/trace-events | 3 ++- hw/audio/virtio-snd.c | 57 ++++++++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/hw/audio/trace-events b/hw/audio/trace-events index 30f59215453..75d1fb37bd9 100644 --- a/hw/audio/trace-events +++ b/hw/audio/trace-events @@ -53,7 +53,8 @@ virtio_snd_unrealize(void *snd) "snd %p: unrealize" virtio_snd_handle_pcm_set_params(uint32_t stream) "VIRTIO_SND_PCM_SET_PARA= MS called for stream %"PRIu32 virtio_snd_handle_ctrl(void *vdev, void *vq) "snd %p: handle ctrl event fo= r queue %p" virtio_snd_handle_pcm_info(uint32_t stream) "VIRTIO_SND_R_PCM_INFO called = for stream %"PRIu32 -virtio_snd_handle_pcm_start_stop(const char *code, uint32_t stream) "%s ca= lled for stream %"PRIu32 +virtio_snd_handle_pcm_start(uint32_t stream) "VIRTIO_SND_R_PCM_START calle= d for stream %"PRIu32 +virtio_snd_handle_pcm_stop(uint32_t stream) "VIRTIO_SND_R_PCM_STOP called = for stream %"PRIu32 virtio_snd_handle_pcm_release(uint32_t stream) "VIRTIO_SND_PCM_RELEASE cal= led for stream %"PRIu32 virtio_snd_handle_code(uint32_t val, const char *code) "ctrl code msg val = =3D %"PRIu32" =3D=3D %s" virtio_snd_handle_chmap_info(void) "VIRTIO_SND_CHMAP_INFO called" diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 7687261192d..80dc13318af 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -521,7 +521,42 @@ static void virtio_snd_handle_pcm_prepare(VirtIOSound = *s, } =20 /* - * Handles VIRTIO_SND_R_PCM_START. + * Starts/Stops a VirtIOSound card stream. + * Returns the response status code. (VIRTIO_SND_S_*). + * + * @s: VirtIOSound device + * @stream_id: stream id + * @start: whether to start or stop the stream + */ +static uint32_t virtio_snd_pcm_start_stop(VirtIOSound *s, + uint32_t stream_id, + bool start) +{ + VirtIOSoundPCMStream *stream; + + stream =3D virtio_snd_pcm_get_stream(s, stream_id); + if (!stream) { + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } + + if (start) { + trace_virtio_snd_handle_pcm_start(stream_id); + } else { + trace_virtio_snd_handle_pcm_stop(stream_id); + } + + stream->active =3D start; + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + audio_be_set_active_out(s->audio_be, stream->voice.out, start); + } else { + audio_be_set_active_in(s->audio_be, stream->voice.in, start); + } + + return cpu_to_le32(VIRTIO_SND_S_OK); +} + +/* + * Handles VIRTIO_SND_R_PCM_START and VIRTIO_SND_R_PCM_STOP. * * @s: VirtIOSound device * @cmd: The request command queue element from VirtIOSound cmdq field @@ -531,7 +566,6 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSoun= d *s, virtio_snd_ctrl_command *cmd, bool start) { - VirtIOSoundPCMStream *stream; virtio_snd_pcm_hdr req; uint32_t stream_id; size_t msg_sz =3D iov_to_buf(cmd->elem->out_sg, @@ -549,24 +583,7 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSou= nd *s, } =20 stream_id =3D le32_to_cpu(req.stream_id); - cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_OK); - trace_virtio_snd_handle_pcm_start_stop(start ? "VIRTIO_SND_R_PCM_START= " : - "VIRTIO_SND_R_PCM_STOP", stream_id); - - stream =3D virtio_snd_pcm_get_stream(s, stream_id); - if (stream) { - stream->active =3D start; - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - audio_be_set_active_out(s->audio_be, stream->voice.out, start); - } else { - audio_be_set_active_in(s->audio_be, stream->voice.in, start); - } - } else { - error_report("Invalid stream id: %"PRIu32, stream_id); - cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_BAD_MSG); - return; - } - stream->active =3D start; + cmd->resp.code =3D virtio_snd_pcm_start_stop(s, stream_id, start); } =20 /* --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782374989; cv=none; d=zohomail.com; s=zohoarc; b=At7m0plszF69JTSDioLLvIkgBeBW9U/reTmR6MTF86e8+Fj2nbJ6cb0N+QO8eZYY2455nB/V1N1E250znorXH5Dcib/+7dlGkSLSevmHUSYj4TL56Ajk51qGS0Iy7gqEPN0+KC0miQYZb2/5vvaPe2T6oaubhcazErBqcE0R3kY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782374989; 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=d0XZfkWh0v2OLL/CX8rekkDci79Kie+RBNBIVOnupCM=; b=ERGjlmjY7IYjUcWudT6Gg2V4H33SQNAJ5cLpfFdhUaIoAVBOT2ZnJVliiUV+2N1qnu87OzSP5F5kk4H2ZcC6gl3rnHk+Ue1KprNSB01nCwdcGM8ojp3NYcMLMJ4xlfvQDWB+w8QdgxTSSyhSsO2r++sghuakOfnfBTOC2MAMf8o= 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 1782374989700484.2679535589523; Thu, 25 Jun 2026 01:09:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9N-0001lg-CZ; Thu, 25 Jun 2026 04:09: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 1wcf9G-0001eo-2E for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:22 -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 1wcf9D-0007tn-Ce for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:21 -0400 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-45fd461e4a5so1566049f8f.0 for ; Thu, 25 Jun 2026 01:09:19 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374958; x=1782979758; 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=d0XZfkWh0v2OLL/CX8rekkDci79Kie+RBNBIVOnupCM=; b=jOMc1HYLFcnk4IZT6sT/uPaPhU/NbZbQhGPZnmtMZrj84xHmztaEyzMJvb1xesU4U9 XiiZy95qRZRKz6a+GBAQO7702w0ouxwVTK9gThLjWyTY/NpAfcyjxOi9dX0mNy82sQwq Q0snn6N5zH55a8GEUUw0KosWeo20eslhNwNwA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374958; x=1782979758; 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=d0XZfkWh0v2OLL/CX8rekkDci79Kie+RBNBIVOnupCM=; b=fASSC0ZYpSJsaEHhS+Nww2oxTcNvUYHzv2Eyl3oHbJLWRI0iIejJehrwLWmqgcyZ1e BRU7174nSdQ5Uv4c6Osv2Rok9XFhyiQmiDpTXSiF23W/f51pkcVBJ3VDybABa+LTAJnS FbqMRY5iGs5OeCuTSdqBxhuv4gE8I+IVRgCJ8TbIGUAb3TXZNsoDRQtSMm311iJA7M5c XCSp5+tvm++PIkQUrcNDoyR7ZZf1OngVt993skUfGZI0bFKHRJRWzLTtzQnVvqRUgxv1 HUXbKg6rlRKDBslC9aPFfPrPDtXXUpqqUwljPX0Zt64XcK82lTrToW0ZkY3vxH6yo/tu mQXQ== X-Gm-Message-State: AOJu0YwS5FWQxDxvRI0psFl4rYoBd7aMGeRijF9Mph5rEoasIMkoQEoG OYT53cniEGW0Y3Pf9p7sA6/T0dneO73sLGwCOqVmLzurZlXGvuadnrmRgn88ul8390TegtLAZ7P cm1f7pJuiAQ== X-Gm-Gg: AfdE7clWvHKGFZE1fXSCz97ZoJYDcdbk+4aiCh72YnP28vwxpNgPkKB3gtCDmjkyOiF WftQo6RDtHkjoqIWkil03hX60xJaxxKzLy8xeolCNrheKRxoApsbj3idPifNf5d4tji1Yh4QIGj 7Qviw/ckrJs606TCxHAmx1KmmpUOsBPCmfLCXTaj3DjB6ZfQqul+imsj0+JqOlXe/e/qtJ9A8S5 pLPbjyhPo3cC+otbdNTEL3mKDksw2bomqTZ8tOgVobCnfXi9D6GY36bMpoBeKsEvirLkqOmUSmb BFWHOo/m+60yS5JK9LORiApa/dnDg3H1o+a6aIzNM50Dttsdvke7iwRmcukvOk79wFu+sX4bgiG 9u9nyZQ1dBsLAj5rxHaDbx2nFPbUsLDj57tbNcJ1zXBuc0LBXk9cyVXzfVOU4Nd53P6fH8wqQMW sPymjf3FClrZNwVkcsiRFAuFu6pGLLCxWTlk4T6u5r4PFob+lFkovPA2u8tgbzB4aWmnlOhPR3f VixXIYIrRJU X-Received: by 2002:a05:6000:200f:b0:46d:fd70:c90a with SMTP id ffacd0b85a97d-46dfd70c913mr1241912f8f.47.1782374957824; Thu, 25 Jun 2026 01:09:17 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 5/9] hw/audio/virtio-sound: add stream state variable Date: Thu, 25 Jun 2026 10:09:06 +0200 Message-ID: <20260625080910.30569-6-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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: 1782374992073158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 196 +++++++++++++++++++--------------- include/hw/audio/virtio-snd.h | 18 +--- 2 files changed, 109 insertions(+), 105 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 80dc13318af..388a302255a 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -30,11 +30,30 @@ #define VIRTIO_SOUND_CHMAP_DEFAULT 0 #define VIRTIO_SOUND_HDA_FN_NID 0 =20 +#define VSND_PCMSTREAM_STATE_F_PARAMS_SET 0x10000 +#define VSND_PCMSTREAM_STATE_F_PREPARED 0x20000 +#define VSND_PCMSTREAM_STATE_F_ACTIVE 0x40000 + +#define VSND_PCMSTREAM_STATE_UNINITIALIZED 0 +#define VSND_PCMSTREAM_STATE_PARAMS_SET (1 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET) +#define VSND_PCMSTREAM_STATE_PREPARED (2 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET \ + | VSND_PCMSTREAM_STATE_F_PREPAR= ED) +#define VSND_PCMSTREAM_STATE_STARTED (4 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET \ + | VSND_PCMSTREAM_STATE_F_PREPAR= ED \ + | VSND_PCMSTREAM_STATE_F_ACTIVE) +#define VSND_PCMSTREAM_STATE_STOPPED (6 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET \ + | VSND_PCMSTREAM_STATE_F_PREPAR= ED) +#define VSND_PCMSTREAM_STATE_RELEASED (7 \ + | VSND_PCMSTREAM_STATE_F_PARAMS= _SET) + static void virtio_snd_pcm_out_cb(void *data, int available); static void virtio_snd_process_cmdq(VirtIOSound *s); static void virtio_snd_pcm_flush(VirtIOSoundPCMStream *stream); static void virtio_snd_pcm_in_cb(void *data, int available); -static void virtio_snd_unrealize(DeviceState *dev); =20 static uint32_t supported_formats =3D BIT(VIRTIO_SND_PCM_FMT_S8) | BIT(VIRTIO_SND_PCM_FMT_U8) @@ -129,7 +148,7 @@ static VirtIOSoundPCMStream *virtio_snd_pcm_get_stream(= VirtIOSound *s, uint32_t stream_id) { return stream_id >=3D s->snd_conf.streams ? NULL : - s->pcm.streams[stream_id]; + &s->streams[stream_id]; } =20 /* @@ -141,8 +160,8 @@ static VirtIOSoundPCMStream *virtio_snd_pcm_get_stream(= VirtIOSound *s, static virtio_snd_pcm_set_params *virtio_snd_pcm_get_params(VirtIOSound *s, uint32_t strea= m_id) { - return stream_id >=3D s->snd_conf.streams ? NULL - : &s->pcm.pcm_params[stream_id]; + return stream_id >=3D s->snd_conf.streams ? NULL : + &s->streams[stream_id].params; } =20 /* @@ -245,11 +264,10 @@ static void virtio_snd_handle_pcm_info(VirtIOSound *s, =20 /* * Set the given stream params. - * Called by both virtio_snd_handle_pcm_set_params and during device - * initialization. * Returns the response status code. (VIRTIO_SND_S_*). * * @s: VirtIOSound device + * @stream_id: stream id * @params: The PCM params as defined in the virtio specification */ static @@ -257,14 +275,25 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s, uint32_t stream_id, virtio_snd_pcm_set_params *params) { + VirtIOSoundPCMStream *stream; virtio_snd_pcm_set_params *st_params; =20 - if (stream_id >=3D s->snd_conf.streams || s->pcm.pcm_params =3D=3D NUL= L) { + if (stream_id >=3D s->snd_conf.streams) { virtio_error(VIRTIO_DEVICE(s), "Streams have not been initialized.= \n"); return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - st_params =3D virtio_snd_pcm_get_params(s, stream_id); + stream =3D virtio_snd_pcm_get_stream(s, stream_id); + + switch (stream->state) { + case VSND_PCMSTREAM_STATE_UNINITIALIZED: + case VSND_PCMSTREAM_STATE_PARAMS_SET: + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_RELEASED: + break; + default: + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } =20 if (params->channels < 1 || params->channels > AUDIO_MAX_CHANNELS) { error_report("Number of channels is not supported."); @@ -281,6 +310,8 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s, return cpu_to_le32(VIRTIO_SND_S_NOT_SUPP); } =20 + st_params =3D virtio_snd_pcm_get_params(s, stream_id); + st_params->buffer_bytes =3D le32_to_cpu(params->buffer_bytes); st_params->period_bytes =3D le32_to_cpu(params->period_bytes); st_params->features =3D le32_to_cpu(params->features); @@ -289,6 +320,13 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s, st_params->format =3D params->format; st_params->rate =3D params->rate; =20 + if (stream->state & VSND_PCMSTREAM_STATE_F_PREPARED) { + /* implicit VIRTIO_SND_R_PCM_RELEASE */ + virtio_snd_pcm_flush(stream); + } + + stream->state =3D VSND_PCMSTREAM_STATE_PARAMS_SET; + return cpu_to_le32(VIRTIO_SND_S_OK); } =20 @@ -398,15 +436,13 @@ static void virtio_snd_get_qemu_audsettings(audsettin= gs *as, */ static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream) { - if (stream) { - virtio_snd_pcm_flush(stream); - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - audio_be_close_out(stream->s->audio_be, stream->voice.out); - stream->voice.out =3D NULL; - } else if (stream->info.direction =3D=3D VIRTIO_SND_D_INPUT) { - audio_be_close_in(stream->s->audio_be, stream->voice.in); - stream->voice.in =3D NULL; - } + virtio_snd_pcm_flush(stream); + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + audio_be_close_out(stream->s->audio_be, stream->voice.out); + stream->voice.out =3D NULL; + } else if (stream->info.direction =3D=3D VIRTIO_SND_D_INPUT) { + audio_be_close_in(stream->s->audio_be, stream->voice.in); + stream->voice.in =3D NULL; } } =20 @@ -423,32 +459,23 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s= , uint32_t stream_id) virtio_snd_pcm_set_params *params; VirtIOSoundPCMStream *stream; =20 - if (s->pcm.streams =3D=3D NULL || - s->pcm.pcm_params =3D=3D NULL || - stream_id >=3D s->snd_conf.streams) { + stream =3D virtio_snd_pcm_get_stream(s, stream_id); + if (!stream) { return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - params =3D virtio_snd_pcm_get_params(s, stream_id); - if (params =3D=3D NULL) { + switch (stream->state) { + case VSND_PCMSTREAM_STATE_PARAMS_SET: + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_RELEASED: + break; + default: return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - stream =3D virtio_snd_pcm_get_stream(s, stream_id); - if (stream =3D=3D NULL) { - stream =3D &s->streams[stream_id]; - stream->active =3D false; - stream->latency_bytes =3D 0; - - /* - * stream_id >=3D s->snd_conf.streams was checked before so this is - * in-bounds - */ - s->pcm.streams[stream_id] =3D stream; - } + params =3D virtio_snd_pcm_get_params(s, stream_id); =20 virtio_snd_get_qemu_audsettings(&as, params); - stream->params =3D *params; =20 stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; stream->positions[1] =3D VIRTIO_SND_CHMAP_FR; @@ -472,6 +499,8 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, = uint32_t stream_id) audio_be_set_volume_in_lr(s->audio_be, stream->voice.in, 0, 255, 2= 55); } =20 + stream->state =3D VSND_PCMSTREAM_STATE_PREPARED; + return cpu_to_le32(VIRTIO_SND_S_OK); } =20 @@ -540,12 +569,28 @@ static uint32_t virtio_snd_pcm_start_stop(VirtIOSound= *s, } =20 if (start) { + switch (stream->state) { + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_STOPPED: + break; + default: + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } + trace_virtio_snd_handle_pcm_start(stream_id); + stream->state =3D VSND_PCMSTREAM_STATE_STARTED; } else { + switch (stream->state) { + case VSND_PCMSTREAM_STATE_STARTED: + break; + default: + return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + } + trace_virtio_snd_handle_pcm_stop(stream_id); + stream->state =3D VSND_PCMSTREAM_STATE_STOPPED; } =20 - stream->active =3D start; if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { audio_be_set_active_out(s->audio_be, stream->voice.out, start); } else { @@ -639,6 +684,15 @@ static void virtio_snd_handle_pcm_release(VirtIOSound = *s, return; } =20 + switch (stream->state) { + case VSND_PCMSTREAM_STATE_PREPARED: + case VSND_PCMSTREAM_STATE_STOPPED: + break; + default: + cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_BAD_MSG); + return; + } + if (virtio_snd_pcm_get_io_msgs_count(stream)) { /* * virtio-v1.2-csd01, 5.14.6.6.5.1, @@ -653,6 +707,8 @@ static void virtio_snd_handle_pcm_release(VirtIOSound *= s, virtio_snd_pcm_flush(stream); } =20 + stream->state =3D VSND_PCMSTREAM_STATE_RELEASED; + cmd->resp.code =3D cpu_to_le32(VIRTIO_SND_S_OK); } =20 @@ -874,12 +930,11 @@ static void virtio_snd_handle_tx_xfer(VirtIODevice *v= dev, VirtQueue *vq) } stream_id =3D le32_to_cpu(hdr.stream_id); =20 - if (stream_id >=3D vsnd->snd_conf.streams - || vsnd->pcm.streams[stream_id] =3D=3D NULL) { + if (stream_id >=3D vsnd->snd_conf.streams) { goto tx_err; } =20 - stream =3D vsnd->pcm.streams[stream_id]; + stream =3D &vsnd->streams[stream_id]; if (stream->info.direction !=3D VIRTIO_SND_D_OUTPUT) { goto tx_err; } @@ -954,13 +1009,12 @@ static void virtio_snd_handle_rx_xfer(VirtIODevice *= vdev, VirtQueue *vq) } stream_id =3D le32_to_cpu(hdr.stream_id); =20 - if (stream_id >=3D vsnd->snd_conf.streams - || !vsnd->pcm.streams[stream_id]) { + if (stream_id >=3D vsnd->snd_conf.streams) { goto rx_err; } =20 - stream =3D vsnd->pcm.streams[stream_id]; - if (stream =3D=3D NULL || stream->info.direction !=3D VIRTIO_SND_D= _INPUT) { + stream =3D &vsnd->streams[stream_id]; + if (stream->info.direction !=3D VIRTIO_SND_D_INPUT) { goto rx_err; } =20 @@ -1019,8 +1073,6 @@ static void virtio_snd_realize(DeviceState *dev, Erro= r **errp) ERRP_GUARD(); VirtIOSound *vsnd =3D VIRTIO_SND(dev); VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); - virtio_snd_pcm_set_params default_params =3D { 0 }; - uint32_t status; =20 trace_virtio_snd_realize(vsnd); =20 @@ -1058,6 +1110,7 @@ static void virtio_snd_realize(DeviceState *dev, Erro= r **errp) VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; =20 stream->id =3D i; + stream->state =3D VSND_PCMSTREAM_STATE_UNINITIALIZED; stream->s =3D vsnd; QSIMPLEQ_INIT(&stream->queue); stream->info.hdr.hda_fn_nid =3D VIRTIO_SOUND_HDA_FN_NID; @@ -1071,21 +1124,9 @@ static void virtio_snd_realize(DeviceState *dev, Err= or **errp) stream->info.channels_max =3D 2; } =20 - vsnd->pcm.streams =3D - g_new0(VirtIOSoundPCMStream *, vsnd->snd_conf.streams); - vsnd->pcm.pcm_params =3D - g_new0(virtio_snd_pcm_set_params, vsnd->snd_conf.streams); - virtio_init(vdev, VIRTIO_ID_SOUND, sizeof(virtio_snd_config)); virtio_add_feature(&vsnd->features, VIRTIO_F_VERSION_1); =20 - /* set default params for all streams */ - default_params.features =3D 0; - default_params.buffer_bytes =3D cpu_to_le32(8192); - default_params.period_bytes =3D cpu_to_le32(2048); - default_params.channels =3D 2; - default_params.format =3D VIRTIO_SND_PCM_FMT_S16; - default_params.rate =3D VIRTIO_SND_PCM_RATE_48000; vsnd->queues[VIRTIO_SND_VQ_CONTROL] =3D virtio_add_queue(vdev, 64, virtio_snd_handle_ctrl); vsnd->queues[VIRTIO_SND_VQ_EVENT] =3D @@ -1096,28 +1137,6 @@ static void virtio_snd_realize(DeviceState *dev, Err= or **errp) virtio_add_queue(vdev, 64, virtio_snd_handle_rx_xfer); QTAILQ_INIT(&vsnd->cmdq); QSIMPLEQ_INIT(&vsnd->invalid); - - for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { - status =3D virtio_snd_set_pcm_params(vsnd, i, &default_params); - if (status !=3D cpu_to_le32(VIRTIO_SND_S_OK)) { - error_setg(errp, - "Can't initialize stream params, device responded w= ith %s.", - print_code(status)); - goto error_cleanup; - } - status =3D virtio_snd_pcm_prepare(vsnd, i); - if (status !=3D cpu_to_le32(VIRTIO_SND_S_OK)) { - error_setg(errp, - "Can't prepare streams, device responded with %s.", - print_code(status)); - goto error_cleanup; - } - } - - return; - -error_cleanup: - virtio_snd_unrealize(dev); } =20 static inline void update_latency(VirtIOSoundPCMStream *s, size_t used) @@ -1166,7 +1185,7 @@ static void virtio_snd_pcm_out_cb(void *data, int ava= ilable) if (!virtio_queue_ready(buffer->vq)) { return; } - if (!stream->active) { + if (!(stream->state & VSND_PCMSTREAM_STATE_F_ACTIVE)) { /* Stream has stopped, so do not perform audio_be_write. */ return_tx_buffer(stream, buffer); continue; @@ -1260,7 +1279,7 @@ static void virtio_snd_pcm_in_cb(void *data, int avai= lable) if (!virtio_queue_ready(buffer->vq)) { return; } - if (!stream->active) { + if (!(stream->state & VSND_PCMSTREAM_STATE_F_ACTIVE)) { /* Stream has stopped, so do not perform audio_be_read. */ return_rx_buffer(stream, buffer); continue; @@ -1333,17 +1352,15 @@ static void virtio_snd_unrealize(DeviceState *dev) qemu_del_vm_change_state_handler(vsnd->vmstate); trace_virtio_snd_unrealize(vsnd); =20 - if (vsnd->pcm.streams) { + if (vsnd->streams) { + virtio_snd_process_cmdq(vsnd); for (uint32_t i =3D 0; i < vsnd->snd_conf.streams; i++) { - stream =3D vsnd->pcm.streams[i]; - if (stream) { - virtio_snd_process_cmdq(stream->s); - virtio_snd_pcm_close(stream); + stream =3D &vsnd->streams[i]; + if (stream->state & VSND_PCMSTREAM_STATE_F_PREPARED) { + virtio_snd_pcm_flush(stream); } } - g_free(vsnd->pcm.streams); } - g_free(vsnd->pcm.pcm_params); g_free(vsnd->streams); vsnd->streams =3D NULL; virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]); @@ -1377,6 +1394,9 @@ static void virtio_snd_reset(VirtIODevice *vdev) VirtIOSoundPCMStream *stream =3D &vsnd->streams[i]; VirtIOSoundPCMBuffer *buffer; =20 + virtio_snd_pcm_close(stream); + stream->state =3D VSND_PCMSTREAM_STATE_UNINITIALIZED; + while ((buffer =3D QSIMPLEQ_FIRST(&stream->queue))) { QSIMPLEQ_REMOVE_HEAD(&stream->queue, entry); virtio_snd_pcm_buffer_free(buffer); diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index d65e6ba85be..28d0322b979 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -75,8 +75,6 @@ typedef struct VirtIOSoundPCMStream VirtIOSoundPCMStream; =20 typedef struct virtio_snd_ctrl_command virtio_snd_ctrl_command; =20 -typedef struct VirtIOSoundPCM VirtIOSoundPCM; - typedef struct VirtIOSoundPCMBuffer VirtIOSoundPCMBuffer; =20 /* @@ -121,32 +119,19 @@ struct VirtIOSoundPCMBuffer { uint8_t data[]; }; =20 -struct VirtIOSoundPCM { - /* - * PCM parameters are a separate field instead of a VirtIOSoundPCMStre= am - * field, because the operation of PCM control requests is first - * VIRTIO_SND_R_PCM_SET_PARAMS and then VIRTIO_SND_R_PCM_PREPARE; this - * means that some times we get parameters without having an allocated - * stream yet. - */ - virtio_snd_pcm_set_params *pcm_params; - VirtIOSoundPCMStream **streams; -}; - struct VirtIOSoundPCMStream { virtio_snd_pcm_info info; virtio_snd_pcm_set_params params; uint32_t id; + uint32_t state; /* channel position values (VIRTIO_SND_CHMAP_XXX) */ uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; VirtIOSound *s; - bool flushing; audsettings as; union { SWVoiceIn *in; SWVoiceOut *out; } voice; - bool active; uint32_t latency_bytes; QSIMPLEQ_HEAD(, VirtIOSoundPCMBuffer) queue; }; @@ -213,7 +198,6 @@ struct VirtIOSound { =20 VirtQueue *queues[VIRTIO_SND_VQ_MAX]; uint64_t features; - VirtIOSoundPCM pcm; VirtIOSoundPCMStream *streams; AudioBackend *audio_be; VMChangeStateEntry *vmstate; --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782374989; cv=none; d=zohomail.com; s=zohoarc; b=W2z9SqDwYshtewU5mtkWJ8v5vmvBu0a81LqCj+x4+VA1P/oTfw/73jXHULicCZnusa0oxfC2jXUxRH5/S5LQyeObiNKe79XU9+MnSOnN6YNaSbzReZX+gw5hjOzSCWBALGzRdB+R03hxzd9aQ4f6MMYREGdtSZ5THI4tGSQezb8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782374989; 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=qG3AH3FF5TzTBpF0P1Mgrj/ndCjQ2RUkBwIiaBbWrQU=; b=Vt6JIgB+W2HH9aXx6ZuHSM/BK7kPC1jWjM52ht6mjhOa7tss6KrUzXynxXm99rdOu5FeK+HZSKcdG4iXHRqywi0KRWaIr4ZGH21FHyhPGRZaAivtdq5dUMedt6xkTHvVVpJmXWyXVA39YC9pbMMPWTHcrMT6nUv+8Wq/WwG99ow= 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 1782374989065203.1750997680972; Thu, 25 Jun 2026 01:09:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9P-0001qI-QZ; Thu, 25 Jun 2026 04:09:31 -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 1wcf9H-0001gW-0f for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:24 -0400 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcf9F-0007uP-1L for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:22 -0400 Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-490bc6a7958so4443915e9.1 for ; Thu, 25 Jun 2026 01:09:20 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374959; x=1782979759; 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=qG3AH3FF5TzTBpF0P1Mgrj/ndCjQ2RUkBwIiaBbWrQU=; b=e6gkXd/PJcxnkb66LgHABc5wwZ1ZGH24G9xYUyyxS/e0FI3+OI7e4+4GPE3tBLy5vv PoEj9m3aKhweHvCFrtHijO7HL/HlZDziC6489rOIUnU5nU/cpHfT1TtoYpTcHj9+0X9v zoWe61paHE1wiGCpJ02hW/e+tfikaeaJLVrE4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374959; x=1782979759; 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=qG3AH3FF5TzTBpF0P1Mgrj/ndCjQ2RUkBwIiaBbWrQU=; b=li0oENKEjgDI4MOHOtsar450l2gYlongtKdTBHvy7+tg0uT/LB9Zpes+eRoAMtlK0Q cvFiNEM5Xl7dZ6iOZ280SDlWT+XHsLwJb5ctTWaNIonzIsdQ4nnmQ5+nBgmAKQpPWVm7 yadDk5gA8pxRtYaHxCtUgvHhN/tLFACE/b677pM05URF0qxAQrVcblzNmh18XKqeuq/R n4/ebTkJMt7BysYYKdo7Sb1dd+oMgRmqNeA+DMTD2nEbkMwiDXWtpafIKSxsEPD284qg fLZnL6oyxVeS+A/z5X0GtrDA1M4FhZaLmi/fFNLFsnFhFmWtDLBeyhgMDYyJ63gQsOuF BHPA== X-Gm-Message-State: AOJu0Ywt4qBS5qNJ/OOH2pTGv6yrx5x0k09Dm/X11RpVUhOSh4KHVOUG YLQIWYwxFfwCBejFsWMJpPQyZPiOUlKFdbfN0/moTxSr6Oxqz4dlkZrQMskUU6TzLXyUT8c+/VD aEiIedFEyZw== X-Gm-Gg: AfdE7cm/Z1JT5uRx6s609hKLXkg9A5JT5UHkLCAmqqPggOhTWgQfjiES1yuv6wjyDNn +qGMYB60MBxAxBZUDhtQ/PS9zcWSzWvgpXxI3U9vZ5x7KNc2jmdah+z57pKfZi2SkH9hWEGTw8e A3lEsniNeX3aqrMY3RrTaYSO5F6USN+tyeKxlCgy1VPgGbdyhFfC+ig42sACiq/orXf8RtXZhiM 00QA9sDs9p4lN+BE4p/zWb5SF0pMkVgtgciu9yE5SAPObpMAeSwWlKxsSv+IpJXGqcf0pEf3t2G ItINNfqAl1aN+Y8GrUixRZyoE8p9UPNsREPYNH5IV+SXcLKgbZWyFy1hOw9iJv4b5KmzJM5Nj3p FE3Q2N8n3LP+BqaskMvxqx3lMfE0MPf70FbyFrybHi5Xhp+3iinYmzeMaMbF+pQMjUSZI73//E+ BjK5ivkPG3ck3sQuKZntDWOKDG89yvOMtfDmVLzy0e/TCqbUXmDDalRK+IZt9QG36TcGVgG95iu jZue/g4+liL X-Received: by 2002:a05:6000:981:b0:463:c84f:fcf1 with SMTP id ffacd0b85a97d-46a806bc981mr20177838f8f.15.1782374959498; Thu, 25 Jun 2026 01:09:19 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 6/9] hw/audio/virtio-sound: introduce virtio_snd_pcm_open() Date: Thu, 25 Jun 2026 10:09:07 +0200 Message-ID: <20260625080910.30569-7-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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::32e; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x32e.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: 1782374991985158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 60 ++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 388a302255a..48a6ca9f09c 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -429,6 +429,38 @@ static void virtio_snd_get_qemu_audsettings(audsetting= s *as, as->big_endian =3D false; /* Conforming to VIRTIO 1.0: always little e= ndian. */ } =20 +/* + * Open a stream. + * + * @stream: VirtIOSoundPCMStream *stream + */ +static void virtio_snd_pcm_open(VirtIOSoundPCMStream *stream) +{ + virtio_snd_get_qemu_audsettings(&stream->as, &stream->params); + stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; + stream->positions[1] =3D VIRTIO_SND_CHMAP_FR; + + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + stream->voice.out =3D audio_be_open_out(stream->s->audio_be, + stream->voice.out, + "virtio-sound.out", + stream, + virtio_snd_pcm_out_cb, + &stream->as); + audio_be_set_volume_out_lr(stream->s->audio_be, + stream->voice.out, 0, 255, 255); + } else { + stream->voice.in =3D audio_be_open_in(stream->s->audio_be, + stream->voice.in, + "virtio-sound.in", + stream, + virtio_snd_pcm_in_cb, + &stream->as); + audio_be_set_volume_in_lr(stream->s->audio_be, + stream->voice.in, 0, 255, 255); + } +} + /* * Close a stream and free all its resources. * @@ -455,8 +487,6 @@ static void virtio_snd_pcm_close(VirtIOSoundPCMStream *= stream) */ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id) { - audsettings as; - virtio_snd_pcm_set_params *params; VirtIOSoundPCMStream *stream; =20 stream =3D virtio_snd_pcm_get_stream(s, stream_id); @@ -473,31 +503,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s,= uint32_t stream_id) return cpu_to_le32(VIRTIO_SND_S_BAD_MSG); } =20 - params =3D virtio_snd_pcm_get_params(s, stream_id); - - virtio_snd_get_qemu_audsettings(&as, params); - - stream->positions[0] =3D VIRTIO_SND_CHMAP_FL; - stream->positions[1] =3D VIRTIO_SND_CHMAP_FR; - stream->as =3D as; - - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - stream->voice.out =3D audio_be_open_out(s->audio_be, - stream->voice.out, - "virtio-sound.out", - stream, - virtio_snd_pcm_out_cb, - &as); - audio_be_set_volume_out_lr(s->audio_be, stream->voice.out, 0, 255,= 255); - } else { - stream->voice.in =3D audio_be_open_in(s->audio_be, - stream->voice.in, - "virtio-sound.in", - stream, - virtio_snd_pcm_in_cb, - &as); - audio_be_set_volume_in_lr(s->audio_be, stream->voice.in, 0, 255, 2= 55); - } + virtio_snd_pcm_open(stream); =20 stream->state =3D VSND_PCMSTREAM_STATE_PREPARED; =20 --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782375038; cv=none; d=zohomail.com; s=zohoarc; b=K2GIcF+tSbtJ194cYBAkI8eTVAmvpeA3UUzDvTrrnT8dP1biPVtcjFPNhLIVFzAl39TJ2E1E2rkd/8zU6N54VMOg04797hz6w1GW0hByXla2STQLSCJv0p2/6rIFjImWmnRkNXCI7VQLrE6ii3X1/P9tyM6CswHVjjWnKuX2/n8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782375038; 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=3oLkQQvmPQBpNbaPrb0k9ibPB5UgzM32tGf27u8O5Wg=; b=Lk+Xm5WvBiwUanywei/+X1fpfd/7NfYLfjI8da9ek3+Jyvz0lJzwRooinTb6VEbVxSiwsILwWaJK521a+bqsxG3wlTJIBmgsNNWPUqiKE1lcdWzleqlJPkWGZROCtzIaGf5YXd1p6aHise09Ne3ISPI1Bgu6UKNmerslMlJOZBk= 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 1782375038484961.6976284020575; Thu, 25 Jun 2026 01:10:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9M-0001i5-IO; Thu, 25 Jun 2026 04:09:28 -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 1wcf9I-0001gv-2b for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:24 -0400 Received: from mail-wr1-x429.google.com ([2a00:1450:4864:20::429]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcf9G-0007v3-Ho for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:23 -0400 Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-46cbe01d4b6so947861f8f.2 for ; Thu, 25 Jun 2026 01:09:22 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374961; x=1782979761; 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=3oLkQQvmPQBpNbaPrb0k9ibPB5UgzM32tGf27u8O5Wg=; b=YN5eHOKs0S6h0iBxUP8EFtMNbi+gIOmWwIaZDxAPsAcBR616sbk37dVD6GPduHS2Sk rRuN0/n90IV1WbHNisJd27cGSMhHUgyCO894odOrd9qme06IdhBhUKz/K1l1ddquliR5 1+tldEyGDlVMS8VOfgxrPNnf7mhJ7PV4YxkeE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374961; x=1782979761; 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=3oLkQQvmPQBpNbaPrb0k9ibPB5UgzM32tGf27u8O5Wg=; b=GmvtAfscz6MW2Xgk1S7Q8WW3roh//qqZ0Y6M/D9nwbvvn+10lZ8qcCBZYrtH6gW9Aq SVr0Jkzcm3GyOnMUkjgkmxA+Zzqyw3b6W77HpSV4EUQr/5OdxM4TodxUoqcBFZMvy/bP y/Jp6ZjUcjrHJ5/jka6MrJxUG7cPnEsqq080EsGCkedPuvueZ4i0LVlRAh/8R5cpBkK2 F9f156Yz5ehZ+hFqngzmxdWAwSxPJY1pzMlib60bdgPdk5/vcZ2ltzdHGX6g/EB1ig8N za3lfhsbaEn0a4Y/4a0qmpo8ejNlygQRhT+EPpfHC6uKSjKOLyQtO4TWqwkb/GXkCYB0 obDw== X-Gm-Message-State: AOJu0YwyIucE6YW6lS3tj31OFbmUSHypJtZ/gZNlZ5GK956GJ69AlZbN jpqEZ7EW0H0RIUz1mgKsNHc/tUU1lPEohy6qpvuqlqXR/5v9wEUslfyFRVYsQHqPOCAaDRzagPJ yPr1wXWwDJQ== X-Gm-Gg: AfdE7clbDAD8Plq9DZQB6OUSyHgjrOKV9fyE5t5HqEKSjXblu3KNIezZKzZqle/jLtY /PGsVwathEBInDEPovkmQtm27aTBbJgLk05zb/lBIBXwEGEOJRYtVvWVHNKskEAJWffCYZsH8La GnSGndkPu/P+P1R3aAn8ob12oyl2U06+i+uPlMJau7mnTDZVXYsUixGpo/hRxm1UgD2rapublTu 5VoQhfpUqHkMNFhhlRBvnGc47JRk/7E8SWIGlsvTgbeVlj5ITYAyQyOTNSygNTazr0EoDDVf6Sn FhcBcCvK32pvqZTnNlMMip364SfVU2GXhwgO5EGTs1b5O1Brm2CD1kWPCDS761nBMZvUDW3zCf2 y8s0ZSUaXhPVteLsrwXLy0FXMVYhsQ0BBMUgwlLn2h3c5pgdz3ZYuIiH4mHi6/HQNsCn0DvKhRu As6vdSogHlifxOVt+ktPjorbvIzt+rnoFnXbvEl0AAezURFunglYCTV5J6DFULlM3J555QJQ/5w wJPMNn/E0FdRrS4MLUCiHo= X-Received: by 2002:a05:6000:1841:b0:451:3b12:9bca with SMTP id ffacd0b85a97d-46dc20763ecmr2130614f8f.25.1782374960701; Thu, 25 Jun 2026 01:09:20 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 7/9] hw/audio/virtio-sound: introduce virtio_snd_set_active() Date: Thu, 25 Jun 2026 10:09:08 +0200 Message-ID: <20260625080910.30569-8-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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::429; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x429.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: 1782375039696158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 48a6ca9f09c..53f9066ab24 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -461,6 +461,21 @@ static void virtio_snd_pcm_open(VirtIOSoundPCMStream *= stream) } } =20 +/* + * Activate/deactivate a stream. + * + * @stream: VirtIOSoundPCMStream *stream + * @active: whether to activate or deactivate the stream + */ +static void virtio_snd_pcm_set_active(VirtIOSoundPCMStream *stream, bool a= ctive) +{ + if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { + audio_be_set_active_out(stream->s->audio_be, stream->voice.out, ac= tive); + } else { + audio_be_set_active_in(stream->s->audio_be, stream->voice.in, acti= ve); + } +} + /* * Close a stream and free all its resources. * @@ -597,11 +612,7 @@ static uint32_t virtio_snd_pcm_start_stop(VirtIOSound = *s, stream->state =3D VSND_PCMSTREAM_STATE_STOPPED; } =20 - if (stream->info.direction =3D=3D VIRTIO_SND_D_OUTPUT) { - audio_be_set_active_out(s->audio_be, stream->voice.out, start); - } else { - audio_be_set_active_in(s->audio_be, stream->voice.in, start); - } + virtio_snd_pcm_set_active(stream, start); =20 return cpu_to_le32(VIRTIO_SND_S_OK); } --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782374998; cv=none; d=zohomail.com; s=zohoarc; b=gumoKCkHyq5hsQfk9hVAgKGAPNXU50jP5RJWbgnwd7eUPa4ahhYbXxSliy/EVry+5IMlCeZFP7nOJXkg3vooqm2/CS0xmkPH31jr+iTQqE/Asn3laAIB/yyoQ1yM9zlvyJwg/PfuinQyA4Ge4xaqqFglFbnQ1bQOimv9rLNB7wQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782374998; 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=8iiOZwR3wwRuU12hGn3F6sKroOsfSannvUWI+vGr7PE=; b=EwDXbgkZFgTpqh1NavuNKkH4OcLMmMuPRveBxU5/wBknRJeejufjH1avX9/k4fXbMq1zWkQg3lh/AkrDNSEQRqW4JI42BcYU9Z2c6rPPoTVHqQsIH1bIW7L6mCru7gtZFEuOZf33vVVQ9yCN+cqTpOF6KPQtHjtg1wgX4z9pN0I= 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 1782374998883245.7652637771721; Thu, 25 Jun 2026 01:09:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9P-0001pg-MC; Thu, 25 Jun 2026 04:09:31 -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 1wcf9J-0001hL-Q6 for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:26 -0400 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcf9H-0007we-QG for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:25 -0400 Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-46cbe01d4b6so947879f8f.2 for ; Thu, 25 Jun 2026 01:09:23 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374962; x=1782979762; 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=8iiOZwR3wwRuU12hGn3F6sKroOsfSannvUWI+vGr7PE=; b=EXPQyaoQQBEh1+WSzWMLaOiWpb78dn72fHeanbApx6Eji9+8oHxbvzN9fyJ66YztcI 0mxdobqzaIeLN4r19qMpLHjQPHbZ1n01G6UN1+ETcZyYzgb83ukA2VbsTVX9WaxA6YfN 6PX3svVwlORYcWLWhOBsDqM285eZ66TxgOVyk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374962; x=1782979762; 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=8iiOZwR3wwRuU12hGn3F6sKroOsfSannvUWI+vGr7PE=; b=Chr1Vvhsw84WEprl4PHd2Tje3aff/6JQisQbt48ee6FkMaPJgKGOurY2Z6BrjTCG17 fDjYLCumAT6NuvOK+u8JmRDptzbQMkh7DXZGc1kB/dCn4Wkas+VaN4H9hd82qTeVOwS6 Z8AmK7KX7scMZrYs7PuXCF5Eb/c6KREF3Cv8vqTskebngh5+CrS4dW6TV+DGldVCsX5I 7m82UhWfqZw5sOKJqcRw720l27HXrtYl1pUHC0INNeUabcoHUcXoj9rhQAUMXLuno4EF TDHOjUbZVBRm0tQaPmo/yGHpyyAVdy4w7SZtc0Pfm70+aJD8mqkACLlTCa6Ckn9p9ciu K7AQ== X-Gm-Message-State: AOJu0Yy0AHQ3owm4pvi2X40XFbXycTC1Wj+vg/m5QiltD461CVnnR9NT bRGVMmUobkLeBfeIf/JLpKTlVEQ1xtVhHQ07b2GWo3I7VxFtYjknefakiaTX8RCdUsUFKnS5iMq qj6MJAieRbg== X-Gm-Gg: AfdE7cn22vNFKpCP3AitRmY6TuTsdMYWNYW1PUunhRPYU9VT3mdkCj98bvV9KShW0ZT /zcgbxqyQ5u39qC1OcR4u4G3amBQBh5tDIqP3WNn19F1d1uIgiBti8m/wTYVD5aew6PuTB2tgoh 5KK+p/X2KN+VbXAEQTFxk8Ms7Ib9CBDDHU/nnLGMfck+F1lTKPmVsb2lH42qTUDnRNnIeNz9yrT 217dpasMrv5SzncmMUtzAWLxL2VRBMKyF5wqU9i9edw1IMyQs0JHigbYtCoEofX+7/JZAtttHtk AJtJ0w+quPP0z1cBCGh7a1f4T002P3BiCo9WaAAmyOYq1nqP1Nt2oS9ttv13YtXmKJAq401RWvc BGWmCoSHNK32jCsODUeZTs5yjsx76XPdkld77MmpJjzVNb8ig9NNfqJA/iXrKoFYb5fbIVn3VaV FJT7zxfRIFxSJVaI2kc5d7AYQFS+MqkFs702T+WGNfCaKkouFe9JNQbg7uag7L09X5jsTE1NXTZ KNwLo2Yjq6N X-Received: by 2002:a05:6000:4022:b0:460:66c0:311 with SMTP id ffacd0b85a97d-46dc27326bemr1994578f8f.33.1782374962219; Thu, 25 Jun 2026 01:09:22 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 8/9] hw/audio/virtio-sound: add missing vmstate fields Date: Thu, 25 Jun 2026 10:09:09 +0200 Message-ID: <20260625080910.30569-9-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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::430; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x430.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: 1782374999571158500 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 Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 83 +++++++++++++++++++++++++++++++---- include/hw/audio/virtio-snd.h | 1 + 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index 53f9066ab24..b3de8abcb61 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -24,7 +24,6 @@ #include "qapi/error.h" #include "hw/audio/virtio-snd.h" =20 -#define VIRTIO_SOUND_VM_VERSION 1 #define VIRTIO_SOUND_JACK_DEFAULT 0 #define VIRTIO_SOUND_STREAM_DEFAULT 2 #define VIRTIO_SOUND_CHMAP_DEFAULT 0 @@ -78,17 +77,40 @@ static uint32_t supported_rates =3D BIT(VIRTIO_SND_PCM_= RATE_5512) | BIT(VIRTIO_SND_PCM_RATE_192000) | BIT(VIRTIO_SND_PCM_RATE_384000); =20 +static const VMStateDescription vmstate_virtio_snd_stream =3D { + .name =3D "virtio-sound-stream", + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32(state, VirtIOSoundPCMStream), + VMSTATE_UINT32(info.hdr.hda_fn_nid, VirtIOSoundPCMStream), + VMSTATE_UINT32(info.features, VirtIOSoundPCMStream), + VMSTATE_UINT64(info.formats, VirtIOSoundPCMStream), + VMSTATE_UINT64(info.rates, VirtIOSoundPCMStream), + VMSTATE_UINT8(info.direction, VirtIOSoundPCMStream), + VMSTATE_UINT8(info.channels_min, VirtIOSoundPCMStream), + VMSTATE_UINT8(info.channels_max, VirtIOSoundPCMStream), + VMSTATE_UINT32(params.buffer_bytes, VirtIOSoundPCMStream), + VMSTATE_UINT32(params.period_bytes, VirtIOSoundPCMStream), + VMSTATE_UINT32(params.features, VirtIOSoundPCMStream), + VMSTATE_UINT8(params.channels, VirtIOSoundPCMStream), + VMSTATE_UINT8(params.format, VirtIOSoundPCMStream), + VMSTATE_UINT8(params.rate, VirtIOSoundPCMStream), + VMSTATE_END_OF_LIST() + }, +}; + static const VMStateDescription vmstate_virtio_snd_device =3D { - .name =3D TYPE_VIRTIO_SND, - .version_id =3D VIRTIO_SOUND_VM_VERSION, - .minimum_version_id =3D VIRTIO_SOUND_VM_VERSION, + .name =3D "virtio-sound-device", + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32_ARRAY(queue_inuse, VirtIOSound, VIRTIO_SND_VQ_MAX), + VMSTATE_STRUCT_VARRAY_POINTER_UINT32(streams, VirtIOSound, + snd_conf.streams, + vmstate_virtio_snd_stream, VirtIOSoundPCMStream), + VMSTATE_END_OF_LIST() + }, }; =20 static const VMStateDescription vmstate_virtio_snd =3D { - .name =3D TYPE_VIRTIO_SND, - .unmigratable =3D 1, - .minimum_version_id =3D VIRTIO_SOUND_VM_VERSION, - .version_id =3D VIRTIO_SOUND_VM_VERSION, + .name =3D "virtio-sound", .fields =3D (const VMStateField[]) { VMSTATE_VIRTIO_DEVICE, VMSTATE_END_OF_LIST() @@ -800,6 +822,7 @@ process_cmd(VirtIOSound *s, virtio_snd_ctrl_command *cm= d) sizeof(virtio_snd_hdr)); virtqueue_push(cmd->vq, cmd->elem, sizeof(virtio_snd_hdr) + cmd->payload_size); + s->queue_inuse[VIRTIO_SND_VQ_CONTROL] -=3D 1; virtio_notify(VIRTIO_DEVICE(s), cmd->vq); } =20 @@ -846,6 +869,7 @@ static void virtio_snd_handle_ctrl(VirtIODevice *vdev, = VirtQueue *vq) =20 elem =3D virtqueue_pop(vq, sizeof(VirtQueueElement)); while (elem) { + s->queue_inuse[VIRTIO_SND_VQ_CONTROL] +=3D 1; cmd =3D g_new0(virtio_snd_ctrl_command, 1); cmd->elem =3D elem; cmd->vq =3D vq; @@ -956,6 +980,7 @@ static void virtio_snd_handle_tx_xfer(VirtIODevice *vde= v, VirtQueue *vq) goto tx_err; } =20 + vsnd->queue_inuse[VIRTIO_SND_VQ_TX] +=3D 1; size =3D iov_size(elem->out_sg, elem->out_num) - msg_sz; =20 buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); @@ -1035,6 +1060,7 @@ static void virtio_snd_handle_rx_xfer(VirtIODevice *v= dev, VirtQueue *vq) goto rx_err; } =20 + vsnd->queue_inuse[VIRTIO_SND_VQ_RX] +=3D 1; size =3D iov_size(elem->in_sg, elem->in_num) - sizeof(virtio_snd_pcm_status); buffer =3D g_malloc0(sizeof(VirtIOSoundPCMBuffer) + size); @@ -1177,6 +1203,7 @@ static inline void return_tx_buffer(VirtIOSoundPCMStr= eam *stream, virtqueue_push(buffer->vq, buffer->elem, sizeof(virtio_snd_pcm_status)); + stream->s->queue_inuse[VIRTIO_SND_VQ_TX] -=3D 1; virtio_notify(VIRTIO_DEVICE(stream->s), buffer->vq); QSIMPLEQ_REMOVE(&stream->queue, buffer, @@ -1270,6 +1297,7 @@ static inline void return_rx_buffer(VirtIOSoundPCMStr= eam *stream, virtqueue_push(buffer->vq, buffer->elem, sizeof(virtio_snd_pcm_status) + buffer->size); + stream->s->queue_inuse[VIRTIO_SND_VQ_RX] -=3D 1; virtio_notify(VIRTIO_DEVICE(stream->s), buffer->vq); QSIMPLEQ_REMOVE(&stream->queue, buffer, @@ -1387,6 +1415,40 @@ static void virtio_snd_unrealize(DeviceState *dev) virtio_cleanup(vdev); } =20 +static int virtio_snd_post_load(VirtIODevice *vdev) +{ + VirtIOSound *s =3D VIRTIO_SND(vdev); + uint32_t i; + + for (i =3D 0; i < s->snd_conf.streams; i++) { + struct VirtIOSoundPCMStream *stream; + + stream =3D virtio_snd_pcm_get_stream(s, i); + if (stream->state & VSND_PCMSTREAM_STATE_F_PREPARED) { + virtio_snd_pcm_open(stream); + + if (stream->state & VSND_PCMSTREAM_STATE_F_ACTIVE) { + virtio_snd_pcm_set_active(stream, true); + } + } + } + + for (i =3D 0; i < VIRTIO_SND_VQ_MAX; i++) { + if (s->queue_inuse[i]) { + bool rc; + + rc =3D virtqueue_rewind(s->queues[i], s->queue_inuse[i]); + if (!rc) { + error_report( + "virtio-sound: could not rewind %u elements in queue %= u", + s->queue_inuse[i], i); + } + s->queue_inuse[i] =3D 0; + } + } + + return 0; +} =20 static void virtio_snd_reset(VirtIODevice *vdev) { @@ -1419,6 +1481,10 @@ static void virtio_snd_reset(VirtIODevice *vdev) virtio_snd_pcm_buffer_free(buffer); } } + + for (i =3D 0; i < VIRTIO_SND_VQ_MAX; i++) { + vsnd->queue_inuse[i] =3D 0; + } } =20 static void virtio_snd_class_init(ObjectClass *klass, const void *data) @@ -1432,6 +1498,7 @@ static void virtio_snd_class_init(ObjectClass *klass,= const void *data) =20 dc->vmsd =3D &vmstate_virtio_snd; vdc->vmsd =3D &vmstate_virtio_snd_device; + vdc->post_load =3D virtio_snd_post_load; vdc->realize =3D virtio_snd_realize; vdc->unrealize =3D virtio_snd_unrealize; vdc->get_config =3D virtio_snd_get_config; diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index 28d0322b979..523c456436b 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -197,6 +197,7 @@ struct VirtIOSound { VirtIODevice parent_obj; =20 VirtQueue *queues[VIRTIO_SND_VQ_MAX]; + uint32_t queue_inuse[VIRTIO_SND_VQ_MAX]; uint64_t features; VirtIOSoundPCMStream *streams; AudioBackend *audio_be; --=20 2.47.3 From nobody Sun Jul 26 11:50:46 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=1782374989; cv=none; d=zohomail.com; s=zohoarc; b=Qhsu1HwJNrT363pjLMRY0yDzcEli78a68Yp88PM3D48TZam5D/+wwHMROk+fQ29rUB+rVW8w68+VL0OkmHMKK7tDT7VcDu8SLPT/OEm5h4LA6aIe8Mu7dr981vqsWRUhYkA/rjHxpUfhJMASnyvQlUnAhVLFOkd31ryEy3bB2n4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782374989; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Un3eHQApgu4sIeZqrs0kysA5i496iAug3k/3dQTUAwQ=; b=MsxRCmkYOC6J/DvPSxDyEFvqLS5+X/AGkZKM5+ETQUvub6XSdnydRrsizxngnd8sdZuAnVA0OfPEV8bTxodVYbw+JpFqvS2UgtaYUb+L4IF0u6L3RWbYWYQ83aBwI5y27wWixrO5xVfoHcQXlNBuPEkD9vpwdcxlwUs6ukPPCHw= 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 1782374989551815.1305928040437; Thu, 25 Jun 2026 01:09:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wcf9Q-0001rb-4U; Thu, 25 Jun 2026 04:09:32 -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 1wcf9K-0001hZ-JR for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:26 -0400 Received: from mail-wr1-x431.google.com ([2a00:1450:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wcf9J-0007yD-3s for qemu-devel@nongnu.org; Thu, 25 Jun 2026 04:09:26 -0400 Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-46daae24c79so333343f8f.0 for ; Thu, 25 Jun 2026 01:09:24 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a720090e98b0d86cf6583.dip0.t-ipconnect.de. [2003:cf:574a:7200:90e9:8b0d:86cf:6583]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-46dcbac0c9dsm3086950f8f.19.2026.06.25.01.09.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 01:09:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1782374964; x=1782979764; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Un3eHQApgu4sIeZqrs0kysA5i496iAug3k/3dQTUAwQ=; b=g4oV4pc2j6wvhPJZn0Hs/9ojYws0JCtU4JCWmXyTyUPQIIz6OLD9l1mvC7hlGzO8Uh Nm6uLlVIUxaaBsrqm1JV/kN7ZOBt/60KLArBYMitmUTn8dDOL7JCT+c77rVaoOTxnqlk Xbu1w7zpJ8YFS4byHuUZxTLberzAnja623yk0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374964; x=1782979764; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Un3eHQApgu4sIeZqrs0kysA5i496iAug3k/3dQTUAwQ=; b=F+eyZZw/JRVCtS7V2raeTgCKlMkm/3243Ia4s3BzNUNYnYtfMi4swa0td6KE4cmEf5 L0DEJfBT00KQaufoBWa/vNhBknoapi6Q7sjWsISKj7QcYT/xQoc30U8RU4k+4DRmWKGI eVsrMyMYtDpV3iVXc5G4CzWvqQppc3FI3JSKgSyyo0JX2cXZRb5o0DKfPa+RcnLatkte KGmiSi10uvc4dYBeGqLfybiCW70sAsHH2y14+SPZ4tNJOoKKgko+qBTcRroSE6n50les YW6duCECb57Vnbo0GbMo8q8xMjd0ujdJq10sa7nMYa5M9PaHHIC2sM2TfXHfyUzZS+Nx Z5OQ== X-Gm-Message-State: AOJu0YwdcYI+Wnts36TjW/yUNTrfi8LEMwX4UJ4AqLOeNSKyTLpbTylk CcD95fLlUXsJi7EOr5mTGRTfvPRfC5ulVusFmZdCiOD+stgXEesXpM0yQyKVHICuOS5SzHDhcWy /3HaK5DaMIA== X-Gm-Gg: AfdE7cnyC621lZ+oQwotLI3kprCjQ/dlmsqCF8p1SeogXAKtYhymIfoUZ04NUdKJOlE FwHcErXwWVPvypr7b+EQ44gT5CLRvbjkDsCVNdt8CNfzIluWZlyPvjpUOp9U8uNA7uFLX7dJhUI p8qD/jqOHs1ZGAtYMwmF/haO35ATijU/5WepS8ogdg2hX4kcaonF5kXJ5hJ4b/XIm3HotEhmMnO DCxZ3mRHJWmebpUvTQKstzbAbblTuOj6cGViAetYwYrmdZYIJ+Wapiihh5R0x6/ajFcK91JbPZ/ GXw8A54DbzYxSCXfTWDI45H7dQBnmgiQE8XPBzIr9usLVJd7z8nU5CUn3C+hbuLr/fZilxO4Pmk pZwZWMD1izP0519hPKPBrGLY5I4HHQQflryalcR4a04HAdu28IVTOL4NCXyZGcirH5SPyPrzJji +84cj2IO4E90fC87eZNUqoDXiR5Qe/mQrSKvrtYlZZuwapGyl8r+THcBO18T4C6aa1bdynEu4gL XQXuSFnMggL X-Received: by 2002:a05:6000:2884:b0:46c:cffc:7638 with SMTP id ffacd0b85a97d-46dc17af258mr2008273f8f.30.1782374963698; Thu, 25 Jun 2026 01:09:23 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , =?UTF-8?q?St=C3=A9phane=20Graber?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Volker=20R=C3=BCmelin?= , Gerd Hoffmann , Manos Pitsidianakis , Alexander Mikhalitsyn , Alexander Mikhalitsyn Subject: [PATCH 9/9] hw/audio/virtio-sound: add placeholder for buffer write position Date: Thu, 25 Jun 2026 10:09:10 +0200 Message-ID: <20260625080910.30569-10-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625080910.30569-1-alexander@mihalicyn.com> References: <20260625080910.30569-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::431; envelope-from=alexander@mihalicyn.com; helo=mail-wr1-x431.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: 1782374991954158500 From: Volker R=C3=BCmelin When a running audio stream is migrated, on average half of a recording stream buffer is lost or half of a playback stream buffer is played twice. Add a placeholder for the write position of the current stream buffer to the migrated data. Additional program code is required to resolve the above issues. However, the placeholder makes it possible to add code in a backwards and forwards compatible way. Signed-off-by: Volker R=C3=BCmelin Signed-off-by: Alexander Mikhalitsyn --- hw/audio/virtio-snd.c | 2 ++ include/hw/audio/virtio-snd.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index b3de8abcb61..cdd384cf4a0 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -81,6 +81,7 @@ static const VMStateDescription vmstate_virtio_snd_stream= =3D { .name =3D "virtio-sound-stream", .fields =3D (const VMStateField[]) { VMSTATE_UINT32(state, VirtIOSoundPCMStream), + VMSTATE_UINT32(buf_wpos, VirtIOSoundPCMStream), VMSTATE_UINT32(info.hdr.hda_fn_nid, VirtIOSoundPCMStream), VMSTATE_UINT32(info.features, VirtIOSoundPCMStream), VMSTATE_UINT64(info.formats, VirtIOSoundPCMStream), @@ -1431,6 +1432,7 @@ static int virtio_snd_post_load(VirtIODevice *vdev) virtio_snd_pcm_set_active(stream, true); } } + stream->buf_wpos =3D 0; } =20 for (i =3D 0; i < VIRTIO_SND_VQ_MAX; i++) { diff --git a/include/hw/audio/virtio-snd.h b/include/hw/audio/virtio-snd.h index 523c456436b..4c688016c25 100644 --- a/include/hw/audio/virtio-snd.h +++ b/include/hw/audio/virtio-snd.h @@ -124,6 +124,8 @@ struct VirtIOSoundPCMStream { virtio_snd_pcm_set_params params; uint32_t id; uint32_t state; + /* placeholder: write position in current VirtIOSoundPCMBuffer */ + uint32_t buf_wpos; /* channel position values (VIRTIO_SND_CHMAP_XXX) */ uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE]; VirtIOSound *s; --=20 2.47.3