From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794683381; b=BfSXJ61SoFUmxJP/pD3rzam3PmvXpVIso+qthY1C/claMoEHItxolzlPAPiu7olQhdNx 67edjQvIgsPChi8+EZ2fcUC7UrQeXIWYuFzmqhKnIbnyeKl6YI3jYLcXpoq1+r89w0wm9 BLyPTlWBa3Jiw0guLY2yZFqpSMGOAupiEDdLJVvUo6VPKVqi6271KXpW2ssTpm9rke2cu OXEGvPxyBnoIZQow3ibliauynu2IDhH5AdDxUgSGajOEuPDIkXqeUc7w15CWtDvoJAuRQ oXlrF9hg3Ii2wrDVSTVnNNJJuULSqiZWy5QARc375jnk+lYRdakdkSkW75OMDR8t51w== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794683381; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=6LU9l0nHGVJDOR3C2dz8HNXstt18I9bFrlhpUlm1Sjc=; b=5iuQ5FuFR9o7ohIn8Fm53OJOUbhdzHvXmkW4y6ml7M1oUFCrFgYmmVu+nroGCcLxdiRR Um18nb55NI2Q7kYWCHgu4TbPhPQdzUH9SdloVpF9CEEN9u9ffpw1Cde1K8kle6r6Php8L bL89zDOlceX74eqbxQ18q1D1g1JCJdzGswKObB1wBbQKp0NChCtrSyLKJovf3COoKjAhB 50cF/XQLMSypZ90OWOZMd0trkmC8lQ3XM8kJLSJcOAibmtdtH1DXk/53PVYYB3oTXNv6B Fg6yr1Iw+vbvsYUr1GhXmOiZbTeWb7DRg1kdVLH0rVAem2NcBwpXD8ueDWH8Bn7D0tA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=OW4LF9Ve; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F267606A897 for ; Sat, 14 Nov 2026 19:09:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=OW4LF9Ve Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB8291F000C6; Sat, 14 Nov 2026 19:09:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794683380; bh=6LU9l0nHGVJDOR3C2dz8HNXstt18I9bFrlhpUlm1Sjc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=OW4LF9VeZoxVIzcmvH2WB9rXig+udVrZgce/tYO81CiRQllU9gignSGh5m8OEPazf 3Ew+Jlk/cz2vCmuuJ5iiG4UktFfWOOz7aTjV7xTEVyuRhk38/G4oHReu4VdClPxkLR xTmpxS0UuBZ+pEV1cE1e85UTls25Vvg4qn2ewW3rDXSOu/F0jDHpJ8vkVL88fIrBNh r0kO6OKn0X45EQx4MXWYn/w77528TMHtHcRslUdtCjv8lX4e4bH4h8lzXvo395+kKP w4PXoiBNsbEmm9i415Cz7Adi9lXSWj3qDkW1a4hODb+62BXLJw5RbYd+nYuo/+KK90 6Cx65BYj2EXYw== From: Sasha Levin To: stable@vger.kernel.org Cc: Josef Bacik , Rik van Riel , Pedro Falcato , Muhammad Usama Anjum , "David Hildenbrand (Arm)" , Sasha Levin Subject: [PATCH 5.10.y] mm/filemap: don't lose a folio lock wakeup to a signal Date: Sat, 14 Nov 2026 14:09:38 -0500 Message-ID: <20261114190919.462977-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261109202611-failed-5.10-8ccb6ded6a47@kernel.org> References: <20261109202611-failed-5.10-8ccb6ded6a47@kernel.org> X-Mailing-List: stable@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Josef Bacik [ Upstream commit 8ccb6ded6a47b59b4907ed4f8c293cf8122de889 ] An exclusive waiter in folio_wait_bit_common() can leave the wait loop because of a fatal signal, then be woken by folio_unlock() before finish_wait(). If the waker did not hand over the lock, the waiter returns -EINTR without trying to acquire it. folio_wake_bit() stops after waking the first exclusive waiter, so this loses the wakeup and can leave other waiters asleep indefinitely on an unlocked folio. After finish_wait(), let a waiter woken without a lock handoff try once more to acquire the lock. If successful, return success so the caller's eventual unlock wakes the next waiter. Otherwise, the current lock owner will do so. Fix generated by an LLM and sent by Josef Bacik in private. Fixes: 5ef64cc8987a ("mm: allow a controlled amount of unfairness in the page lock") Cc: stable@vger.kernel.org Signed-off-by: Josef Bacik [ david: clarify and simplify comment + description ] Reviewed-by: Rik van Riel Acked-by: Pedro Falcato Tested-by: Muhammad Usama Anjum Link: https://patch.msgid.link/20261031-fixes_core-v3-7-d6437171ecc3@kernel.org Signed-off-by: David Hildenbrand (Arm) [ sashal: Replaced folio_flags(folio, 0) with &page->flags to match the existing page-based wait function. ] Signed-off-by: Sasha Levin --- mm/filemap.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/mm/filemap.c b/mm/filemap.c index b98af5680bb9c..4114409856b5d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1324,10 +1324,22 @@ static inline int wait_on_page_bit_common(wait_queue_head_t *q, * return value based on that state without races. * * Also note that WQ_FLAG_WOKEN is sufficient for a non-exclusive - * waiter, but an exclusive one requires WQ_FLAG_DONE. + * waiter, but an exclusive one must also acquire the bit. */ - if (behavior == EXCLUSIVE) - return wait->flags & WQ_FLAG_DONE ? 0 : -EINTR; + if (behavior == EXCLUSIVE) { + if (wait->flags & WQ_FLAG_DONE) + return 0; + /* + * We might have just been woken up and the waker will not + * wake up anybody else. If we ignore that now, the remaining + * waiters may not get woken up: take the bit now if it is + * still free. + */ + if ((wait->flags & WQ_FLAG_WOKEN) && + !test_and_set_bit(bit_nr, &page->flags)) + return 0; + return -EINTR; + } return wait->flags & WQ_FLAG_WOKEN ? 0 : -EINTR; } -- 2.53.0