From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (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 EF5E53ECBC4 for ; Tue, 14 Apr 2026 16:48:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776185287; cv=none; b=YK50993YD7sITe3uwUvXRkLAPHjQJnDd/fahByHb93UP9O1VHLDjkzEFXO2Le8RmfgAB9WdiYKUObIH2ZJQOnhB8w0LQIiAeGYCK/Nk3jVLhC8ANkjBuS0oSHN2sdFsg7k8tn5Fywpcnir4d31i7N6QNigf59YsytR9yPBLm7lw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776185287; c=relaxed/simple; bh=uCY/nj9CD/1M1siCKk8xhE+z0p9kwT0Bf4ZGHP2fews=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D4FwwYs3Hd35MWSdCJB/9tPNQDOwZ5bJHqbhSkyQ51c0HsAGkrrsiq8wfuYM6zHXE875JkI0KjfkUF1MHFedMa4Aoo6LhW8JjvS5pXPla9AuCq3ffmxIdFxnymu4fzO8GurudedVABlWWEoyXxJ4PRkfRg94eloFd0kJ1mvpuXc= 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=gDQyPTFj; arc=none smtp.client-ip=74.125.82.171 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="gDQyPTFj" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2c15849aa2cso6693750eec.0 for ; Tue, 14 Apr 2026 09:48:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776185285; x=1776790085; 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=5QqwWZmoSxDFlOxH8SMWYFfGSd27ukOlZrAEvYnzROs=; b=gDQyPTFjYy3SPm8V+9EzNfnJy1i8NxwSWEAEjrvc0YluA5SOA3BWZx6Caaw/R+UvCK Qn+o+KKo7/sENpc/hu3ZIXNcZQ6ExFoRSBNz00lau2Hy3aQGr0ewCsYja3lYJCvnTYvJ 9HANFdkBMcFvGhf9ywArriwb+NyMY9jNy+P1SKOU5kc19cOqRozDeB2c1FTnfs9bTBXU JlaZs32ZmDMxhdcsJu233iKMKuw/1NUCtFOcHZkfVxps1FDWlg70BbL0z8StT4v0d7PN gv1kPvZsxyiIvBef+vjZMFhNuQ59Zec9uonxrDWhjmmXUeQGninNs1pDJ3CLVsyNkKgN kfoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776185285; x=1776790085; 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=5QqwWZmoSxDFlOxH8SMWYFfGSd27ukOlZrAEvYnzROs=; b=fBkerVmT7QK7CBi6MNErNbGF4LAG5Q332ojURorXlwwxW8rCiis+ymsjAqRX9Zz4J4 orHsKGj9Zs7KIly2XzQmGT1gC3mALzG8Of7rsX/ekrDc6EeotUYLFjxgB5kYkDP1nsv5 bMcXUb5HxsI4cDN4cJpgh8NLRpb5nGsRiRzWgZuXA90kgMXQ6zwpNr7fXB38w9qLbIpE PORvgJRAxTiKgZi7XhDC4AeMEN5fAM4YDtDa+rQI2jmW8zBhNgrWmZP2LOvJWmpTu5LA 93u0W8YN41G2LMQq81K5or4Yg0NzlNjNr61pelHoHTLOxTbhl/kEDFb+R8NlwJsqNywE Vbww== X-Forwarded-Encrypted: i=1; AFNElJ/IJH6msRGVos/NieLB5IPxongQJV6p23572A7d9/Au6uzEmHdLgx+zO34GDFOt+xgb5Sn3Haes+v5HJ3A=@vger.kernel.org X-Gm-Message-State: AOJu0YxIwBUiqhpifwPW9H87+8uarqDTivSpuq9LwMq+yBTuiDt6ZwSU skE8pdFSKGjd3xfkVDkuMs0meIWyR14wNtEJG2e4DYQ72Mhb9PsEmA8g X-Gm-Gg: AeBDiesp8l8w+QIBIEnPOG7rS4sCIaJnj+4DXyTeZz3Gik3rE7+DraHbkNTgPeGmvLQ Gi3+Yc65bBzjaWfGQGoq296tEnPJXH20ChdTleG2CKTJw/tvXWZhL5hcL4oB70wreWu8XzEUCtJ F1ndhJI5jWsHWCWDNgxSaEq/IWgu6BGR16GdGM2NKRxCmJ4PxwkgHAZvsoP5TAmIl494arb+YH8 4ZzEcYFrrJuX0sLPaEZ5InpwpcuSGbyY6NMNDhfjP1+30XZL14d0sAkA495Htb81V3AVGldHCqF G872thPvTEkg/AsP+qQa9Gl7CGVvi4GyEcbSApXS6X9qXc906carOYi/qW7s5o4b/Su3ArhtadX Jd7PxeqDeIaidTmClja72mrEwV0txuu7RY92IlNxDTFXB2xDxiiM2RxbABOH9kIDcSDq7mzx9bU 3T2GK1wq8340zVcz44+XYshMexFDB0inbP1UvUfy+AfqnZcrNRTp72Bn7RJOgKOAcaaRnwtITk9 PBb X-Received: by 2002:a05:7300:80c2:b0:2c0:d46d:cfc2 with SMTP id 5a478bee46e88-2d5887a2fe5mr10237011eec.23.1776185284959; Tue, 14 Apr 2026 09:48:04 -0700 (PDT) Received: from [192.168.1.18] (177-4-160-195.user3p.v-tal.net.br. [177.4.160.195]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2de130e056dsm558584eec.30.2026.04.14.09.48.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2026 09:48:04 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Tue, 14 Apr 2026 13:47:54 -0300 Subject: [PATCH 2/2] ALSA: compress: Propagate real pointer errors in avail paths 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: 8bit Message-Id: <20260414-alsa-compress-pointer-avail-errors-v1-2-f5a1a8b1dfba@gmail.com> References: <20260414-alsa-compress-pointer-avail-errors-v1-0-f5a1a8b1dfba@gmail.com> In-Reply-To: <20260414-alsa-compress-pointer-avail-errors-v1-0-f5a1a8b1dfba@gmail.com> To: Takashi Iwai , Vinod Koul , Mark Brown , Jaroslav Kysela Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=5707; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=uCY/nj9CD/1M1siCKk8xhE+z0p9kwT0Bf4ZGHP2fews=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJn38vcw7bwn8bLE0uJTsvAS9cf7f14zT3A5WhAWL9rbF T1nS2dvRykLgxgXg6yYIsvqpEWWe7oeXK2PW+EBM4eVCWQIAxenAExE2puR4XeF3aF9P/b+628v PPr65+vJjJ686SYMfCz73rGWLwnt3crwh+dKc2Su4eOve/4qXtyof5Zvq050xeXL/1MmSUxmvBg cyQ0A X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 Commit 61327f3d817c ("ALSA: compress: Pay attention if drivers error out retrieving pointers") made snd_compr_update_tstamp() return driver pointer() failures, but snd_compr_calc_avail() still ignores that status and continues with stale runtime counters. The fallback for an unsupported pointer callback remains intentional, so keep ignoring -EOPNOTSUPP there. Propagate real pointer-refresh failures instead. This makes SNDRV_COMPRESS_AVAIL, read() and write() fail immediately on real pointer errors, and makes poll() report EPOLLERR instead of continuing with stale availability data. snd_compr_tstamp() already propagates the same errors, so this also restores consistency between the timestamp and avail paths. Fixes: 61327f3d817c ("ALSA: compress: Pay attention if drivers error out retrieving pointers") Signed-off-by: Cássio Gabriel --- sound/core/compress_offload.c | 53 ++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index e3239c739d34..5a125329d5b7 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -207,18 +207,23 @@ static int snd_compr_update_tstamp(struct snd_compr_stream *stream, return 0; } -static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, - struct snd_compr_avail64 *avail) +static int snd_compr_calc_avail(struct snd_compr_stream *stream, + struct snd_compr_avail64 *avail) { + int ret; + memset(avail, 0, sizeof(*avail)); - snd_compr_update_tstamp(stream, &avail->tstamp); - /* Still need to return avail even if tstamp can't be filled in */ + ret = snd_compr_update_tstamp(stream, &avail->tstamp); + if (ret < 0 && ret != -EOPNOTSUPP) + return ret; + /* Still need to return avail when no timestamp is available */ if (stream->runtime->total_bytes_available == 0 && stream->runtime->state == SNDRV_PCM_STATE_SETUP && stream->direction == SND_COMPRESS_PLAYBACK) { pr_debug("detected init and someone forgot to do a write\n"); - return stream->runtime->buffer_size; + avail->avail = stream->runtime->buffer_size; + return 0; } pr_debug("app wrote %llu, DSP consumed %llu\n", stream->runtime->total_bytes_available, @@ -227,11 +232,12 @@ static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, stream->runtime->total_bytes_transferred) { if (stream->direction == SND_COMPRESS_PLAYBACK) { pr_debug("both pointers are same, returning full avail\n"); - return stream->runtime->buffer_size; + avail->avail = stream->runtime->buffer_size; } else { pr_debug("both pointers are same, returning no avail\n"); - return 0; + avail->avail = 0; } + return 0; } avail->avail = stream->runtime->total_bytes_available - @@ -240,14 +246,21 @@ static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, avail->avail = stream->runtime->buffer_size - avail->avail; pr_debug("ret avail as %zu\n", (size_t)avail->avail); - return avail->avail; + return 0; } -static inline size_t snd_compr_get_avail(struct snd_compr_stream *stream) +static inline int snd_compr_get_avail(struct snd_compr_stream *stream, + size_t *avail_ret) { struct snd_compr_avail64 avail; + int ret; - return snd_compr_calc_avail(stream, &avail); + ret = snd_compr_calc_avail(stream, &avail); + if (ret < 0) + return ret; + + *avail_ret = avail.avail; + return 0; } static void snd_compr_avail32_from_64(struct snd_compr_avail *avail32, @@ -262,15 +275,16 @@ static int snd_compr_ioctl_avail(struct snd_compr_stream *stream, { struct snd_compr_avail64 ioctl_avail64; struct snd_compr_avail ioctl_avail32; - size_t avail; const void *copy_from = &ioctl_avail64; size_t copy_size = sizeof(ioctl_avail64); + int ret; if (stream->direction == SND_COMPRESS_ACCEL) return -EBADFD; - avail = snd_compr_calc_avail(stream, &ioctl_avail64); - ioctl_avail64.avail = avail; + ret = snd_compr_calc_avail(stream, &ioctl_avail64); + if (ret < 0) + return ret; if (is_32bit) { snd_compr_avail32_from_64(&ioctl_avail32, &ioctl_avail64); copy_from = &ioctl_avail32; @@ -346,7 +360,9 @@ static ssize_t snd_compr_write(struct file *f, const char __user *buf, return -EBADFD; } - avail = snd_compr_get_avail(stream); + retval = snd_compr_get_avail(stream, &avail); + if (retval < 0) + return retval; pr_debug("avail returned %lu\n", (unsigned long)avail); /* calculate how much we can write to buffer */ if (avail > count) @@ -402,7 +418,9 @@ static ssize_t snd_compr_read(struct file *f, char __user *buf, return -EPIPE; } - avail = snd_compr_get_avail(stream); + retval = snd_compr_get_avail(stream, &avail); + if (retval < 0) + return retval; pr_debug("avail returned %lu\n", (unsigned long)avail); /* calculate how much we can read from buffer */ if (avail > count) @@ -437,6 +455,7 @@ static __poll_t snd_compr_poll(struct file *f, poll_table *wait) struct snd_compr_stream *stream; struct snd_compr_runtime *runtime; size_t avail; + int ret; __poll_t retval = 0; if (snd_BUG_ON(!data)) @@ -471,7 +490,9 @@ static __poll_t snd_compr_poll(struct file *f, poll_table *wait) } #endif - avail = snd_compr_get_avail(stream); + ret = snd_compr_get_avail(stream, &avail); + if (ret < 0) + return snd_compr_get_poll(stream) | EPOLLERR; pr_debug("avail is %lu\n", (unsigned long)avail); /* check if we have at least one fragment to fill */ switch (runtime->state) { -- 2.53.0