From nobody Mon Apr 6 09:13:18 2026 Received: from mail-dy1-f169.google.com (mail-dy1-f169.google.com [74.125.82.169]) (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 B98623B7752 for ; Fri, 20 Mar 2026 17:28:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774027733; cv=none; b=o/XIdACgMj6mjl/RlBnhDr9qi5FWqSfohpk3KHy3rkFk+3DU1/oZDfMQExSsyWdXQdarMvP9SRpO8x6Vyb3PmMKz5E5JjtaNBR14UlsxmbLPyBPEfAsgBG7fANFaM3z65yOR2GajjBAwyAVWmTJMFhQit2wY5n0dUct73fCtj/g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774027733; c=relaxed/simple; bh=cSimdG/PGvt0GcTfYG/NzuBfXHyQT99Ea8EILEC18qI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=sZ2SjMDI/AfzDlu9GhtWew1YJ3EVp3EApdWv8c+//q4L7ph3u/SJX/TiOVXvpVSPh+MLQ6qdpnE9f1Heyq29HR4YcefJIelKQ8hI87VAIlUPfKgqbisX7IackRZvedWIKNxmW/n5q/T/1bkNL2bjliR4UPl5IS6LzDMrnIWhZ1A= 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=gjsyvJWy; arc=none smtp.client-ip=74.125.82.169 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="gjsyvJWy" Received: by mail-dy1-f169.google.com with SMTP id 5a478bee46e88-2ba9c484e5eso1000105eec.1 for ; Fri, 20 Mar 2026 10:28:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774027732; x=1774632532; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=orno1CLSgFOCdJGCV/7kWNLdfd6UN0ZR1L986IDqy/A=; b=gjsyvJWyqTaY0Mo2N67KBCDk3FC9crIfM96pd6OTf1DnCTvRroCJ82hdbDemDmp1Vi 5dFQd+d9hklyOzske62KdfmKQefTXD+GeXsQKDfKEWcrxlDL8Ps/f2g6OtAGnIwHIcen pY/D4f6Zkk6/vIfp9QD85Ko1rtP6QW79TQtFquZGMYGk+MynhQ5MrJADLdTBOxJK1/CK qmd5B0S+KM6iY+uRj/qCr5h+I8bFcrr+7v2nTvxLO+pTr18Gzti/W+vAkMUQBbI3oV1c xz+plzOzLjJGp4fE7QvZmXjtJeTb7y+6L1v+UBSKExI5CLFBVUWERsbxuBaRCUREVC3N T06A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774027732; x=1774632532; h=cc:to: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=orno1CLSgFOCdJGCV/7kWNLdfd6UN0ZR1L986IDqy/A=; b=VVmXva2XFKOa1f4pHiT9STxhFfRwBsL7Mtz5vLE6Ny+XeTqguRZ/JAUlbfD4CnLfZq OIMSj+HEvuFx4KF9YwOvkLpACrEC4Kzmb+J3RkoRWkCGYQmO1wAlA5lJ/9IxDHucpbjP kVgDkmYuk/N8q4/6gXvatDP57Yfo4Pqb2QaB2SM/LUzm1jOO1ozFr+epV2WjPwvzWYlS jcaNvJw/4Na6MTYsxR9XVQW8/lJTs3KxupT+ZJjPunSUSZLdNismXxtjVfFIwrMzK3qy TuQxLmB6dAqbAZbHxPWz4J/8kNmGcNj5Sb+bC0Sir+CWsAkyJSbW9vdvwI0ibZnUe8U5 AOLw== X-Forwarded-Encrypted: i=1; AJvYcCUwI1ZY0X9jl7RLawi8p6wTQoPh2U556AUdZcqKfwhdX2Q6X2dsAEqi1rRduTdwv9FxCrZ4hKPpVdxbWFc=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6gzV/his414oP4TTaB2qtfUF8Cc5j8kyozgggbMu+CsbfYi4p DhPoEcLZfj99Hzcusbe0L0iB03BcVcHS0EpJvkVwBVlYNalCeegVAVDBsWsTatEv X-Gm-Gg: ATEYQzyve9/wzvivi5bdH/wXZUYziDF8RZh0YNamx0DnsQN6X0pVlSgMCFuqs3Ng7MI eCxLzmM1H/8JNlNk4UZeEHMFtsJtD1k+raGYvt3ri7YFG047ULpbweGbOwNiIRZgypGHTHjqhoG TpesRVcT7JqvwO6+DyDWm5x0+ZliGr3WxeGQyK1n5wReIPBDHvpC3ytpnrecQKcw5ov/FyjAman MlcSU/2QZyCmW3pRQ0tSSEw4Yjl3SkHPDDPN8c7qvQa8vg5FJPJ+5rjgYj6nSt73ByJ+cXiFu2g K6PMoZWP6+sh8RJFaEhwQvXXhpTgScZAjm785UjlGEffkojsql864OTtPwrb1NY6lh2GZSMS5/x idlTiw8Xx9mv/pXrQb2pqexeQvVqbDzo3rHRJA+LJ42GyWyYsk1WFOwaBhEjcTzhO2RKMCc8twi mfp4iRKsUTcPkIeE94b1znJ7wSEF7k9Bh37g6fIqI2ztQ/+E5wbH8fPKY/jnBGxi7Nwt+vD1rk2 Qk= X-Received: by 2002:a05:7300:3723:b0:2be:fe8:8b0d with SMTP id 5a478bee46e88-2c109752b22mr1833534eec.22.1774027731476; Fri, 20 Mar 2026 10:28:51 -0700 (PDT) Received: from [192.168.1.8] (177-4-160-195.user3p.v-tal.net.br. [177.4.160.195]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10aefd778sm5351611eec.0.2026.03.20.10.28.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 10:28:50 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 20 Mar 2026 14:28:35 -0300 Subject: [PATCH] ALSA: pcm: Serialize snd_pcm_suspend_all() with open_mutex 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: <20260320-alsa-pcm-suspend-open-close-lock-v1-1-b5992a120335@gmail.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/x2NQQrDIBAAvxL23IWNtSnNV0oOoptkqVVxSSlI/ l7pZWAuMw2Uq7DCPDSo/BGVnLqMlwH87tLGKKE7GDITXQ2hi+qw+DfqoYVTwNyJPmZljNm/8DY 96B4shdVa6JlSeZXvf/FczvMHryAhTXIAAAA= X-Change-ID: 20260320-alsa-pcm-suspend-open-close-lock-56907d40df44 To: Takashi Iwai Cc: Jaroslav Kysela , linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1605; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=cSimdG/PGvt0GcTfYG/NzuBfXHyQT99Ea8EILEC18qI=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJl7m8+uVb5swx6js6m/4/37AKvH4p3rbv9a9VDVwNhku 3T71S++HaUsDGJcDLJiiiyrkxZZ7ul6cLU+boUHzBxWJpAhDFycAjCRJRMZGXYus7bZfuaKxkyd 48K6eVl+7MLL2wW2bdrEvK/60uP991IY/mfOdmucVpdsJGDpmO4Y5/E0OuXRr5Wds+929PPzf95 TwwIA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 snd_pcm_suspend_all() walks all PCM substreams and uses a lockless runtime check to skip closed streams. It then calls snd_pcm_suspend() for each remaining substream and finally runs snd_pcm_sync_stop() in a second pass. The runtime lifetime is still controlled by pcm->open_mutex in the open/release path. That means a concurrent close can clear or free substream->runtime after the initial check in snd_pcm_suspend_all(), leaving the later suspend or sync-stop path to dereference a stale or NULL runtime pointer. Serialize snd_pcm_suspend_all() with pcm->open_mutex so the runtime pointer stays stable across both loops. This matches the existing PCM runtime lifetime rule already used by other core paths that access substream->runtime outside the stream lock. Signed-off-by: C=C3=A1ssio Gabriel --- sound/core/pcm_native.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 674b50c7c5f6..ebcb62603d49 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -1792,8 +1792,9 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm) if (! pcm) return 0; =20 + guard(mutex)(&pcm->open_mutex); + for_each_pcm_substream(pcm, stream, substream) { - /* FIXME: the open/close code should lock this as well */ if (!substream->runtime) continue; =20 --- base-commit: b3c48fa1fb397b490101785ddd87caf2e5513a66 change-id: 20260320-alsa-pcm-suspend-open-close-lock-56907d40df44 Best regards, --=20 C=C3=A1ssio Gabriel