From nobody Sat May 30 11:16:15 2026 Received: from mail-dy1-f173.google.com (mail-dy1-f173.google.com [74.125.82.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F85C218592 for ; Tue, 26 May 2026 12:48:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779799723; cv=none; b=h9WqxSPtHcczlE6q5LfSxBfMFtJD8BShdERgrBtm7WxLwntwyHGHx9D998ZcoXeD9mg9QznAOunGwg/0D8CF/YeWkEnJ9cgvf6fDdotmHYvY5T/N5Ag/JpREmg1nQZn181qKfeQCsA2cwG3+Vtyd7XJP8VwUkBlkYqnxlqMv10c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779799723; c=relaxed/simple; bh=WzcH2Sbtw60mkU1iRWe1iTMpo9hq4D+yg6klUsKkNfY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CGZcK8xmGihK80pAk4XjOimhtf59TU3Wtn/9/3eLtBAuueSfi50j813tHhvKCdRmyvkAr9m91RrbMOw3WrcH+rAckiMo9YqH0mHmhqXIYjIucTQyAMoaCecTmEnqDTcvFGOIhFrY/2ScDcM0i14OZ7y1SBA7K7J3pzHR8zqYyAw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NRLFn200; arc=none smtp.client-ip=74.125.82.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NRLFn200" Received: by mail-dy1-f173.google.com with SMTP id 5a478bee46e88-3045c195251so3638872eec.1 for ; Tue, 26 May 2026 05:48:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779799721; x=1780404521; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=3SeoXPiG4SB9SK2Lj+OOHLE9VbLHbVVD8iNOr5ymQzc=; b=NRLFn200RLgBm/eG4bRdPWem1gpmo3izXZbzdVkBZrvOaleeB2/MM9nlBm431yYk0n Iifg0c+vJqzkgcOwieX3GYWytX83HQ5FAyZ5TdGexiXycXVSdycpdZZXek2gcH9RZegi JWKV35sWItMbNIQ3u2GyuWPaM7SVi2WJh6ptatKCi6pOb9RznSgXKnQ9F/ockp0Q3EIg 0lFbcbDYWYoGdo1NWWXXKqkkVKrZRxwgU1BtHB9HKNJ55P5AS48mv1MtqWkRxEs9ilpu YIdAEGEaRXZaxJDA68W0QQRRqeGGR5fRjuLUNi4h27ce7/7Wpn8jd7DVjAh/32q0jT+k 0UHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779799721; x=1780404521; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=3SeoXPiG4SB9SK2Lj+OOHLE9VbLHbVVD8iNOr5ymQzc=; b=cUlJL41vwtiWo97OpJ+eW3B75rCaMNuc7KI4f8om0xcet8VWOKCAB+NyaVybx/zVEw V/bYlGMOTGbvN96plhIV9U6TZUO/sLS4DhBCIa5yffsf69X+noqO2WW2ygSfispoc5Nn l4S9uycNlcEWdrRRvrH1o441o2HdXe9YuScrsPijFZal067RCoKXSE8F5c3RsCA2of6j 0uFn4DkHHQ3xW5kmghys4znMHOHFewlsnhnhgnAKIMIebLzX4ICUaQ6RaF3CxGbImQlh qXK5gjJhwQRgVTS7wvSzfelovt+45nC4X0qpnc5qmncSERFql3H+91lwIG2j+4DskQkZ 5HSw== X-Forwarded-Encrypted: i=1; AFNElJ/ghFhN9QzO1Jv0SDPo0a4hdkeffvJhhHliaBaUFiPHStrqJqIz/tXLwlKgDDN893OBdrO3pLfkVGam7Bo=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1CFoLdyEV3kWAlUQqSpAn1AfbIyeZDCA8mQd5zCVjr6YcG4uE FEPHow52ZFjoYlbHJ1LaYpYwgZUC6K/2OAH9oEXUy39iWNDNV7JLb8Jo X-Gm-Gg: Acq92OHZA1g2mnTNbhzeZFjHF/nrdgtUtgz2KkZVaT/sAtKLRHE4tTwoEcYhKLMv+wj YPHl2WNGfQgW/QlF1moSv8wcNWfGhWQst7Y+yUEOsC8FNhQz/ydOtZ6Zk9uZajSnpoHganhTcp6 81wvPrlcZfhouYvKRAAcnBVRaUTnECuT6rKTBQrWc0SAFkxpXG4h5/ng596g/6MCiIzy45sm4fe jGUYzDvxWWD1AHLZo3qBgJdIiWwFQvIIJMseAnPSW9dDIz90tgQzdB5TE8IH5fhs1r0wopeKso+ iTC4sE7qYyn62t2QTSH/QwFkmQyar8FFhddp80vCtuo1Lj363aaD12U3whKiSebzcnUB5GR1EA5 y879Q+x+XqxT6gn9pER3OG3VFj12jvXK3gSIZrJqczwRDONUP79NgYP4sE5zOUn7JDbie8ne07w O84Ixt1gfd24EzHRRipbRmjbN0mSV53bXHfT2B9etFLS4RXkVCp3SNX3CsijY2QVGEjZU7TfJON PP67rqRhDfD X-Received: by 2002:a05:7300:fd10:b0:2de:1508:937c with SMTP id 5a478bee46e88-3044912be04mr7816259eec.24.1779799721346; Tue, 26 May 2026 05:48:41 -0700 (PDT) Received: from [192.168.1.18] (177-4-162-74.user3p.v-tal.net.br. [177.4.162.74]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30451f20561sm9516837eec.10.2026.05.26.05.48.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2026 05:48:40 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Tue, 26 May 2026 09:48:26 -0300 Subject: [PATCH 1/2] ALSA: xen-front: Reset event channel state on stream clear Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260526-alsa-xen-event-channel-fixes-v1-1-91d3a6a50778@gmail.com> References: <20260526-alsa-xen-event-channel-fixes-v1-0-91d3a6a50778@gmail.com> In-Reply-To: <20260526-alsa-xen-event-channel-fixes-v1-0-91d3a6a50778@gmail.com> To: Takashi Iwai , Oleksandr Andrushchenko , Jaroslav Kysela Cc: xen-devel@lists.xenproject.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2435; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=WzcH2Sbtw60mkU1iRWe1iTMpo9hq4D+yg6klUsKkNfY=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDFmi0xY/773+TatxsuO3sLm1k80P1AktaOgPtVqpe93SL eevisy9jlIWBjEuBlkxRZbVSYss93Q9uFoft8IDZg4rE8gQBi5OAZgIjxLD/7pC83C/jANS+Xu1 xTxfdK10nmlr/Ov2wbwHxwVTts6d1sLIcP1OeqHlcb0O3c5kV4NmDnstqS6+sNPxc8qOzU5VN0r mAgA= X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 xen_snd_front_evtchnl_pair_clear() resets evt_next_id for both channels. That is correct for the request channel, where evt_next_id is used to allocate the next request id. It is wrong for the event channel: incoming events are validated against evt_id, and evt_id is incremented by evtchnl_interrupt_evt(). This leaves the expected event id from the previous stream instance. A backend that restarts event ids for a reopened stream can then have valid current-position events dropped until the stale frontend id catches up. Reset evt_id for the event channel. Also advance the event-page consumer to the current producer while clearing the stream, so obsolete events queued for the previous stream instance are not delivered to the next ALSA runtime. Fixes: 1cee559351a7 ("ALSA: xen-front: Implement ALSA virtual sound driver") Signed-off-by: C=C3=A1ssio Gabriel --- sound/xen/xen_snd_front_evtchnl.c | 8 ++++++-- sound/xen/xen_snd_front_evtchnl.h | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sound/xen/xen_snd_front_evtchnl.c b/sound/xen/xen_snd_front_ev= tchnl.c index bc03f71bf16e..09e4c1d05636 100644 --- a/sound/xen/xen_snd_front_evtchnl.c +++ b/sound/xen/xen_snd_front_evtchnl.c @@ -456,7 +456,11 @@ void xen_snd_front_evtchnl_pair_clear(struct xen_snd_f= ront_evtchnl_pair *evt_pai } =20 scoped_guard(mutex, &evt_pair->evt.ring_io_lock) { - evt_pair->evt.evt_next_id =3D 0; + evt_pair->evt.evt_id =3D 0; + /* Drop obsolete events queued for the previous stream instance. */ + evt_pair->evt.u.evt.page->in_cons =3D + evt_pair->evt.u.evt.page->in_prod; + /* Ensure the consumer index is visible before stream reuse. */ + virt_wmb(); } } - diff --git a/sound/xen/xen_snd_front_evtchnl.h b/sound/xen/xen_snd_front_ev= tchnl.h index 3675fba70564..8400261ac466 100644 --- a/sound/xen/xen_snd_front_evtchnl.h +++ b/sound/xen/xen_snd_front_evtchnl.h @@ -37,9 +37,9 @@ struct xen_snd_front_evtchnl { /* State of the event channel. */ enum xen_snd_front_evtchnl_state state; enum xen_snd_front_evtchnl_type type; - /* Either response id or incoming event id. */ + /* Current response id or next expected incoming event id. */ u16 evt_id; - /* Next request id or next expected event id. */ + /* Next request id. */ u16 evt_next_id; /* Shared ring access lock. */ struct mutex ring_io_lock; --=20 2.54.0 From nobody Sat May 30 11:16:15 2026 Received: from mail-dy1-f181.google.com (mail-dy1-f181.google.com [74.125.82.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 296A81FF5E3 for ; Tue, 26 May 2026 12:48:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779799729; cv=none; b=Jwy2KCTAdepj/dLL3MPQ/B+Wlh3l04jUfUbZCXL4U+mG4Xg8/23f2D+Myzf1HsB+m0qmSntS0pwFSSQjDThKHRmnzk0jvbrzB/xzX6/rBIyTWFQidkZ5Hs8di2tZGClsll1SgEsqBhgSNz2+VFFXR1JPsYmflLBp6iAbRHF0704= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779799729; c=relaxed/simple; bh=vlLMVEi4mc8JanxVJ4cRF3k2qZw2pWROuD5ZLWy8lr4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hzB3ppql2bNBFb8oz4TaT4oW8Q81NfHpJvHQ76SWR3OBP6qShh458lwmXano9ZYZDcQW0KhX0vcjMo84FbDBI3C89fItqxX/Kw/AAz0mTquUsj3n6AVoSp0rydXMzSSUah8xg8OcKrFF337FM8XUBU/HcJpP8SvdriSJzCyeoLg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=rImEx5Mc; arc=none smtp.client-ip=74.125.82.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rImEx5Mc" Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-3025d725a05so24371880eec.1 for ; Tue, 26 May 2026 05:48:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779799724; x=1780404524; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=KzFzYUS5xkTaeTcSd6mKOHfBy/NkiDE68cAiMBc0jmA=; b=rImEx5Mcot0CM/ji04s6rPw9luVBBdxpDCi9ozDxTlbjZo2tj0vQHy9Dmkne8YV9YI WNIh5/AvkJrw/NNFo9h5jTF949PDElLWVImjaHmHzCcF94hfj5PXmjkw0EEHqOtWQCOB aWI0/OlqdW23Syax8nmHGx9Al9712Q5x9D3LEmpDnX/PGaMpkhP9vgOvrwCigQAkaffx b5KdJIf3dR1/SztQZ8cgL9lkHpyC71ZKwAuD+KGn+mkKs892Fbsj/CM8jB6xJGTcbC0i qzYh3goIBJh8bTAkIMhLjUnpDOZkbxNzABJSwEbvUXqgrZvvucmXef0X161yhaCKDznR M1bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779799724; x=1780404524; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=KzFzYUS5xkTaeTcSd6mKOHfBy/NkiDE68cAiMBc0jmA=; b=VMw8RJhF4GFP9RCzBlEBuLNI9trHwFVCayDuvnZ8eYJJALhr9FYlRsJqBVWGej112E 8Zx88zVm8mHuedNBT2j3uynVBSfR7hWnP/MoMG825ujd/mFxFusrjujC19ROPPtcS8rK +94Tn38hEqnBSiNpyBZVW6TFfe7L53y6x4SXnZWP4Wd9E26JkCFmQff0sHdnD+NylFyT lIsXQQUWhIqdeQSgzPbltaGhPMADV/iO7M2YiO7ADYtkru5wnZjCPV6Dq8uuX3KQOaVM pamy1heuCYHcJ0xX6qcjAabW2KG+tvpsbTanp0bfggcg4s7qiMleffW6XwTtqHpswGCN ifAw== X-Forwarded-Encrypted: i=1; AFNElJ+Oo5J7br/pgfjXElWnE7Kp2mTjSa/l+KxsmiWS4HWqHtix65V/kKxmvVBIB2lKfBFU0i3EwZhDL+B8Kg8=@vger.kernel.org X-Gm-Message-State: AOJu0YyOX0GSjHxaDsrwtZ8HqinBkhPMbLtozToTgkVxy7AMgXRcjwpI wcTsL+VJz4SGgW4oOW7Rd33Vf74fgLGfA6F90kCyo7daHpvzr8jhvC4e X-Gm-Gg: Acq92OECjivDBWI11MYfNzw0hc0fLSQcuXkxQ+fxc6ju59ac1jqeUe/UZ8KLT1j0+AD JsEp+TFQHFrBd4hd3iNCJBbaN7xayWW53VgQbyWvrxf7LjnqN1vbkh2FTSSLQzKyzPUuUNEtNem yQzNbY4FDsvLTpi4H9jdH8k8TkBjDYwMj2DO0q3BaqVyGnXMkCxDVgZP8tpq/eimSQYzZF1BXun vBP4TNrag2w5Gd4qVT/Fagx4R7hG4XDQWuIjEtdIGvYTJJaL+0O/OKa7sSxNnKMNSMrsv260/N5 GHwlN5fE5/6cVIfwAHYmx7NYpxvNsbg8w8gB2CWJTrwvdfn9liZN666/7O5RUxF1SfXA0uLZCBo UZgmLt8H89sXNyGPPI/NRl2i/OOwlEtAulDbuv0wESFAGi7MGDh39GCSglJPcvke6Jvu3qKhKR5 7Yd6y8RV8U2cgTtuPOQFsSHDdb5sMuCvgDktiMi4vN0QOnfX6TmdpSsSSm6+P6HJr2H+lLi+Ypa +sUOIHp8y4j X-Received: by 2002:a05:7300:cd99:b0:304:188d:d0be with SMTP id 5a478bee46e88-30449156f8cmr7666135eec.16.1779799724191; Tue, 26 May 2026 05:48:44 -0700 (PDT) Received: from [192.168.1.18] (177-4-162-74.user3p.v-tal.net.br. [177.4.162.74]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30451f20561sm9516837eec.10.2026.05.26.05.48.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2026 05:48:43 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Tue, 26 May 2026 09:48:27 -0300 Subject: [PATCH 2/2] ALSA: xen-front: Connect event channel after stream prepare Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260526-alsa-xen-event-channel-fixes-v1-2-91d3a6a50778@gmail.com> References: <20260526-alsa-xen-event-channel-fixes-v1-0-91d3a6a50778@gmail.com> In-Reply-To: <20260526-alsa-xen-event-channel-fixes-v1-0-91d3a6a50778@gmail.com> To: Takashi Iwai , Oleksandr Andrushchenko , Jaroslav Kysela Cc: xen-devel@lists.xenproject.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6113; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=vlLMVEi4mc8JanxVJ4cRF3k2qZw2pWROuD5ZLWy8lr4=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDFmi05ZMEt7+9+1C28rcdPNvQW7GF7lsFX6I7du/9n/a1 hL3eJsPHaUsDGJcDLJiiiyrkxZZ7ul6cLU+boUHzBxWJpAhDFycAjCRSi9Ghjn8jK6XEorLNIwL CjLqvO8kOe91Ldz1U6l0ZoHX0e9eZxgZVv2rZPjn22DTbf8/XWu/7PVUl10bTwQJJfHpFL+Xvb6 aHwA= X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 The request channel must be connected from ALSA .open(), because hw-rule queries and the stream open request use it. The event channel is different: XENSND_EVT_CUR_POS handling uses ALSA runtime buffer and period geometry, and the corresponding Xen stream parameters are not submitted to the backend until .prepare() sends XENSND_OP_OPEN. Currently .open() connects both channels. A backend current-position event, or a stale event queued for an earlier stream instance, can therefore reach xen_snd_front_alsa_handle_cur_pos() before runtime->buffer_size and runtime->period_size are valid. Add a per-channel connection helper, connect only the request channel in .open(), connect the event channel after a successful stream prepare, and disconnect it before stream close/free. Re-check the event-channel state after taking ring_io_lock so disconnecting the event channel synchronizes against a threaded IRQ that passed the initial lockless state test. Keep defensive runtime geometry checks in the position handler. Fixes: 1cee559351a7 ("ALSA: xen-front: Implement ALSA virtual sound driver") Signed-off-by: C=C3=A1ssio Gabriel --- sound/xen/xen_snd_front_alsa.c | 17 ++++++++++++----- sound/xen/xen_snd_front_evtchnl.c | 20 +++++++++++++------- sound/xen/xen_snd_front_evtchnl.h | 2 ++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/sound/xen/xen_snd_front_alsa.c b/sound/xen/xen_snd_front_alsa.c index dc626480123a..a6dd196f73d6 100644 --- a/sound/xen/xen_snd_front_alsa.c +++ b/sound/xen/xen_snd_front_alsa.c @@ -378,7 +378,7 @@ static int alsa_open(struct snd_pcm_substream *substrea= m) =20 stream_clear(stream); =20 - xen_snd_front_evtchnl_pair_set_connected(stream->evt_pair, true); + xen_snd_front_evtchnl_set_connected(&stream->evt_pair->req, true); =20 ret =3D snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT, alsa_hw_rule, stream, @@ -498,6 +498,8 @@ static int alsa_hw_free(struct snd_pcm_substream *subst= ream) struct xen_snd_front_pcm_stream_info *stream =3D stream_get(substream); int ret; =20 + xen_snd_front_evtchnl_set_connected(&stream->evt_pair->evt, false); + ret =3D xen_snd_front_stream_close(&stream->evt_pair->req); stream_free(stream); return ret; @@ -532,6 +534,7 @@ static int alsa_prepare(struct snd_pcm_substream *subst= ream) return ret; =20 stream->is_open =3D true; + xen_snd_front_evtchnl_set_connected(&stream->evt_pair->evt, true); } =20 return 0; @@ -571,20 +574,24 @@ void xen_snd_front_alsa_handle_cur_pos(struct xen_snd= _front_evtchnl *evtchnl, { struct snd_pcm_substream *substream =3D evtchnl->u.evt.substream; struct xen_snd_front_pcm_stream_info *stream =3D stream_get(substream); + struct snd_pcm_runtime *runtime =3D substream->runtime; snd_pcm_uframes_t delta, new_hw_ptr, cur_frame; =20 - cur_frame =3D bytes_to_frames(substream->runtime, pos_bytes); + if (!runtime->buffer_size || !runtime->period_size) + return; + + cur_frame =3D bytes_to_frames(runtime, pos_bytes); =20 delta =3D cur_frame - stream->be_cur_frame; stream->be_cur_frame =3D cur_frame; =20 new_hw_ptr =3D (snd_pcm_uframes_t)atomic_read(&stream->hw_ptr); - new_hw_ptr =3D (new_hw_ptr + delta) % substream->runtime->buffer_size; + new_hw_ptr =3D (new_hw_ptr + delta) % runtime->buffer_size; atomic_set(&stream->hw_ptr, (int)new_hw_ptr); =20 stream->out_frames +=3D delta; - if (stream->out_frames > substream->runtime->period_size) { - stream->out_frames %=3D substream->runtime->period_size; + if (stream->out_frames > runtime->period_size) { + stream->out_frames %=3D runtime->period_size; snd_pcm_period_elapsed(substream); } } diff --git a/sound/xen/xen_snd_front_evtchnl.c b/sound/xen/xen_snd_front_ev= tchnl.c index 09e4c1d05636..17a30452c0cc 100644 --- a/sound/xen/xen_snd_front_evtchnl.c +++ b/sound/xen/xen_snd_front_evtchnl.c @@ -94,6 +94,9 @@ static irqreturn_t evtchnl_interrupt_evt(int irq, void *d= ev_id) =20 guard(mutex)(&channel->ring_io_lock); =20 + if (unlikely(channel->state !=3D EVTCHNL_STATE_CONNECTED)) + return IRQ_HANDLED; + prod =3D page->in_prod; /* Ensure we see ring contents up to prod. */ virt_rmb(); @@ -430,8 +433,8 @@ int xen_snd_front_evtchnl_publish_all(struct xen_snd_fr= ont_info *front_info) return ret; } =20 -void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl= _pair *evt_pair, - bool is_connected) +void xen_snd_front_evtchnl_set_connected(struct xen_snd_front_evtchnl *cha= nnel, + bool is_connected) { enum xen_snd_front_evtchnl_state state; =20 @@ -440,13 +443,16 @@ void xen_snd_front_evtchnl_pair_set_connected(struct = xen_snd_front_evtchnl_pair else state =3D EVTCHNL_STATE_DISCONNECTED; =20 - scoped_guard(mutex, &evt_pair->req.ring_io_lock) { - evt_pair->req.state =3D state; + scoped_guard(mutex, &channel->ring_io_lock) { + channel->state =3D state; } +} =20 - scoped_guard(mutex, &evt_pair->evt.ring_io_lock) { - evt_pair->evt.state =3D state; - } +void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl= _pair *evt_pair, + bool is_connected) +{ + xen_snd_front_evtchnl_set_connected(&evt_pair->req, is_connected); + xen_snd_front_evtchnl_set_connected(&evt_pair->evt, is_connected); } =20 void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *e= vt_pair) diff --git a/sound/xen/xen_snd_front_evtchnl.h b/sound/xen/xen_snd_front_ev= tchnl.h index 8400261ac466..f6ebdb09c029 100644 --- a/sound/xen/xen_snd_front_evtchnl.h +++ b/sound/xen/xen_snd_front_evtchnl.h @@ -77,6 +77,8 @@ void xen_snd_front_evtchnl_free_all(struct xen_snd_front_= info *front_info); int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_inf= o); =20 void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl); +void xen_snd_front_evtchnl_set_connected(struct xen_snd_front_evtchnl *cha= nnel, + bool is_connected); =20 void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl= _pair *evt_pair, bool is_connected); --=20 2.54.0