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=1794590266; b=WamEcAoixbqUBuE80XYyAH8b9BHrn1ZbgKmpUQPtRVTndBODQreUOI7JgxXr6vIw+FDi abjhttJxKZE79LuOR5dp01ppelqoSqaia/2IphOM1lTyJmdSXi2RmfDWb42AsrTWidI92 VOll2JCrnq5BCsC23//blaTJv4euTLjRCT8w3NtuHCGaGvevHibQKFbqoMV8mb/umO3Im 8lLCnfi27KhkSy6jCQxt2vv+CE3PvgANhK2HWKDcol9SLvxWCCphVrIEk3XDgLAMdJ4M8 yX5S7xlx8veCJn35XRZBoawKJBm5VB4ERr1H2Dg35dwhTcuw9QZPFKZbB0w63T7GRFg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794590266; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:User-Agent:X-stable:X-Patchwork-Hint: MIME-Version:Content-Transfer-Encoding; bh=MKuw520oHaIuOnd3CeJhDwcigwXc3nY0sFMdm9Ar5Fw=; b=oTBHKEeIOuy+Cl5eDFprUHKbgCtNF8v98q9CWMp8doGY1YJ0Z9bA7vDEEX/bqPDLjaV0 0E9bqpDKFa5Bl2LD8d/CbCithaUZTsBHuFCh2FeMqoIAj15zv529DPkyDg7XQBu9Vd38W EGXf+DSaHHbA6Pd9K9P+wzHWcgJLUlTxmKmSezk0nVzXKDQFOtfCRCzJ+VVJNIaXCQDEe C5aseyxmCxMjQLxkh3pEFY/42VI2J3Id6/WUTS44GV2JZ0xgfJ7Ls5KM3BpfuNNHL2d5i eqmmQAk4R+zHPJGTgQckn9Wq8FrbkzcudCUhyDxpW21LcbfPUjyYexDFdiUxBK+OEEQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=GWKvQuYz; 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 A0D4460A382F; Fri, 13 Nov 2026 17:17:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=GWKvQuYz Received: by smtp.kernel.org (Postfix) with ESMTPSA id 541FD1F000C4; Fri, 13 Nov 2026 17:17:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=korg; t=1794590266; bh=MKuw520oHaIuOnd3CeJhDwcigwXc3nY0sFMdm9Ar5Fw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=GWKvQuYz2AAJgUqnjBM0ddo3G/+ibLs0fp5Li5/gtQCs2hbt8+zkEqPqjPqMkPF6G fhkETRVudixuzaj+8y72CkhM9Q8ConfmhRaSk6We7UN6zIOsuqCE4ku4ybQ5EuoXbR nUk4gE0r4UsUHXkqDmgDZvyOukeeItLyQnLphXrM= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Josef Bacik , Rik van Riel , Pedro Falcato , Muhammad Usama Anjum , "David Hildenbrand (Arm)" , Sasha Levin Subject: [PATCH 6.18 258/686] mm/filemap: dont lose a folio lock wakeup to a signal Date: Fri, 13 Nov 2026 10:46:31 -0500 Message-ID: <20261113153829.776101931@linuxfoundation.org> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261113153820.902362109@linuxfoundation.org> References: <20261113153820.902362109@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore X-Mailing-List: patches@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.18-stable review patch. If anyone has any objections, please let me know. ------------------ 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) 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 1a03588106090..7a8528d1daf79 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1383,10 +1383,22 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, * 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, folio_flags(folio, 0))) + return 0; + return -EINTR; + } return wait->flags & WQ_FLAG_WOKEN ? 0 : -EINTR; } -- 2.53.0