From nobody Fri Jun 12 20:24:24 2026 Received: from mx0b-00364e01.pphosted.com (mx0b-00364e01.pphosted.com [148.163.139.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB86721D00A for ; Tue, 12 May 2026 20:46:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.139.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778618777; cv=none; b=UMyo2wOBc4N/A/eJXRDJqEWn1sXUQWXsRdXSRHQuqEyDK5/QlCLtMbYP8dHehJI6lC44scY/exEoczTERdpfoBTAPPtvA28Vwc2VIWjq04UKBo1SmIc6b/iCIq1W5mO2fNtb4+R/KUlRxS7vwA2nlwxE9dG+Rh7XZ+t5+dFPeEQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778618777; c=relaxed/simple; bh=EKfXg3Kedd/2DkHbNXwGJTPidd7Pkdr/1XwXuXKdOsY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=u2iZ5APqFdc1FZLf1WEd59TUMweqRrQZ/UorSCEF8hcRy1IfvRLHjrk0nMdaUPeEfv93gpA3WoytVEvGZtSTTHd/fobl1mI00ZjU/u2cPRLzjdmeXXrjuitFdX6DmjSD/nvOsYxBU1hDG2FfAcp/3o0V5jyrLIKJTMMQ4j1TToA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu; spf=pass smtp.mailfrom=columbia.edu; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b=Pk8dx9tV; arc=none smtp.client-ip=148.163.139.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=columbia.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=columbia.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=columbia.edu header.i=@columbia.edu header.b="Pk8dx9tV" Received: from pps.filterd (m0167075.ppops.net [127.0.0.1]) by mx0b-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64CKjZLT2889409 for ; Tue, 12 May 2026 16:46:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=columbia.edu; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=pps01; bh=oYr1O3U6/SXVN5rudFYRAdAuWO paLoIuDsz1B8w0T78=; b=Pk8dx9tVmrD/akIDvKQ1+od69ZPWbp3kgH5UZcm6nz 8tt6kga349LKljWsRoDFOPUMZp8jsrqL5zhzGk/SgbfOxe5//Ls7qLRKRYtF36Ow VsnkmR1ffrTr5lZ8FsMfQYE7FfPs5nnadc2qCXneVS+fNnELtpVga5jrXnDfYQCm DeLPqMVXJyrXh5BvKN3d48KanEWTlMKhm3aXspXKyGPJGyLRxdY3rd+F4WFvB8VS mjPYCUxGELPw2o3bYD2Zbe2amGp6q2IKEwFYXOVJSjiIHH+EsSWGjI8KByMPpNc9 a1dXV0G+ywH5aXAIMpGrzTASAP5snIzHnNCfUD7dtWfA== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0b-00364e01.pphosted.com (PPS) with ESMTPS id 4e476cjr53-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 12 May 2026 16:46:08 -0400 (EDT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-90cb6202d40so333428285a.1 for ; Tue, 12 May 2026 13:46:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778618768; x=1779223568; 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=oYr1O3U6/SXVN5rudFYRAdAuWOpaLoIuDsz1B8w0T78=; b=QVMxNmst64hJaAXmaSG16qUQJmrxw9/IoD6fwiMyaqYAHSk+mQfbcyKLzNilLqh3lN DtUCK2KwUTATF9eU1ggpRxuMpKflBMgqJsRXNjZgWe13OTTocm0h1BnU4O0nLT/JUQDQ aR0SD6TGTCLpbGmUSyCt1Tpxovsu7xlzK6KI7TpgCdbXn7O9X0FMzhcgOfx+wBmJ5Bmb Q2GrEWchZ4v7LxOn/7YlzTvpRGLnpSgUC4AgBuIQNHvmGIIwTCR97hT9lngsFX79NSpm I0bEjlQ+vQYViR4bLrOHgdDfDX78R5Bx7TuXNZGbLzy+02W9xIosoJ4meZCjUV/t39uA 6mmg== X-Forwarded-Encrypted: i=1; AFNElJ8W+BDtcTHfdtLP3k7kyqt+RKRewZpbY+Icq2/Zc2FT5AuY352Bw0dcN7oU+j7KmQHsvvvrD1uFaW3G3ZE=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8Ve6/6mGsQFP6hxiiNH4mLqF+RAmsFvzezVvP6KYvtPARj0s6 aDY6xKt8NyNP7kidSylecjce61hgAajS/XA6r+hbnyIzqmx1saBX3F+3hU8Iu3VfR8CyTU3yH8w On7acrcXM1LYb0AN35kamagytwcI8Q4KFiR+ahv7DdM+qUAaarFcglkwkWw5Bzg== X-Gm-Gg: Acq92OF2HrL+MgNyzJXZz6XhzZejGbJf1DUISuzQOKZA3tAOsnDqfKnWezNVWeS4MOY k2NG7MootFMBTgsu5gD9CiebBzvbXnPuLf1XbB1wgW8SUzJtRF8Gvh7RPzwDOLsPm1M7OmiObbb UcB7hZuRZpb4S+BSp/KXwhz5q+8DV5zbmyceykz4v+ugGa2ybjj/8Sh+EAXn6KvQAHYsrnOuwqY sszSRmG4dhsBUgnhLDticX0rVNiwvJ7IUyFQFH309NrYOhfyKDbaYtcLbHgfuClXSMGra+vlPq4 8r+3CHxNeJ552lpFqrqWVrnkc0LhUZVbnxLTbZLRUneMftKcbCN6Wmv8dUJEO3q2KXCCqvih612 3/2lxSFKgV54MNKDIOajA8XXBQUC3OPXl4k8/0y5Jt9RYeOmcasYWCmGRaBUBLqefGv8= X-Received: by 2002:a05:620a:2a0b:b0:90e:5b62:ea07 with SMTP id af79cd13be357-90f8b2d998dmr99074185a.56.1778618767935; Tue, 12 May 2026 13:46:07 -0700 (PDT) X-Received: by 2002:a05:620a:2a0b:b0:90e:5b62:ea07 with SMTP id af79cd13be357-90f8b2d998dmr99068485a.56.1778618767456; Tue, 12 May 2026 13:46:07 -0700 (PDT) Received: from [127.0.1.1] (dyn-160-39-33-242.dyn.columbia.edu. [160.39.33.242]) by smtp.gmail.com with ESMTPSA id af79cd13be357-90ccb338844sm374224485a.22.2026.05.12.13.46.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 May 2026 13:46:06 -0700 (PDT) From: Tal Zussman Date: Tue, 12 May 2026 16:45:59 -0400 Subject: [PATCH v2] mm/filemap: fix page_cache_prev_miss() when no hole is found 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: <20260512-prev_miss_fix-v2-1-4af8e5c1ae62@columbia.edu> X-B4-Tracking: v=1; b=H4sIAIaRA2oC/3WMTQ6CMBBGr0JmbU2npWJceQ9DSFuKTCJgWmk0p Hd3ZO/yfT9vgxQihQSXaoMYMiVaZgZ1qMCPdr4HQT0zKKlO0qAUT151E6XUDfQWg3danutGoUb gD7cc775byzxSei3xs+sz/tJ/powCRWOMc6g01sZe/fJYJ0f2GPoV2lLKF0C55NWtAAAA X-Change-ID: 20260510-prev_miss_fix-fcb308472131 To: "Matthew Wilcox (Oracle)" , Jan Kara , Andrew Morton , Vishal Moola Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Tal Zussman X-Mailer: b4 0.14.3-dev-d7477 X-Developer-Signature: v=1; a=ed25519-sha256; t=1778618766; l=3136; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=EKfXg3Kedd/2DkHbNXwGJTPidd7Pkdr/1XwXuXKdOsY=; b=XtPXuvkoCm1dLlbLMYm8YnPBn5FHXiqvrKn66Ff+O/0gAOrwSIpFbZ4yjNJznwjCnTf+2djQV pdORZT40uA/CCnyUGfFOCNYhfjqQxp4soMcu2D6CbBB5SZVlZnkmFn8 X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Proofpoint-ORIG-GUID: rl_c4-5aghB2LLHbTs1pWe9WX9Eu6U_q X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTEyMDIxMiBTYWx0ZWRfX3UAxRhdsErli ytOG/zAQKgwQnJmStqdYYigV2wqOlhaSJfefijSQwxdJc+JYiIi3BJcfBMkm9Tgr1mg4kJVIL0r FB4euMkwZcm/6B5rclrkx4jtWRwkdrtqfrn6eZJAgXXUVoVGK0o95uXxKqFQmvAg8YqDpErxoSU 1ltnPRJx84M2mZ7dhLNtOQd9cp7bCmzkW3MKo76ZyFGaFGuFaW++HHiCJ9RGgQcZ8HInh7Fo/cR B8O3jF1rGF+5HPFpybwmkzofnJa9sjCmjRfRz3N1jk8UdKfWbkyM1Se6Q2cTdMRm1aXwhvY71+y XGP9HuA6S32V1uXBDBv1rxE2L20dMD6yqZWrD1MNAj4aCypD1DPUN6IiZpW4xEnyffdmKNce4gC Rdv1ikdHj+uCjpGkJc68IjWTorWS6rt8dJPhlJMwnwqLubO2fQac5GG6rwRFzUkPT/0x4duRJFb jxcUuJ+ti7CXWn6hvkA== X-Authority-Analysis: v=2.4 cv=X8Vi7mTe c=1 sm=1 tr=0 ts=6a039190 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=x7bEGLp0ZPQA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=HpS3TJQ9O3Ob1ozEcmik:22 a=VwQbUJbxAAAA:8 a=MarPr37N4K3uxDc3k44A:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-GUID: rl_c4-5aghB2LLHbTs1pWe9WX9Eu6U_q X-Proofpoint-Virus-Version: vendor=nai engine=6800 definitions=11784 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 spamscore=0 malwarescore=0 clxscore=1015 phishscore=0 lowpriorityscore=10 adultscore=0 impostorscore=10 bulkscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605120212 page_cache_prev_miss() is documented to return a value outside the searched range when no gap is found. However, the no-gap-found path returns xas.xa_index, which after a successful loop is the first index in the range. As such, that index is misreported as a gap. The sole caller, page_cache_sync_ra(), uses the return value to estimate the cached run preceding a sequential read. In some cases, the buggy return value can undercount the contiguous range by one, shrinking the readahead window or pushing borderline requests into the small-random-read branch. Fix this by returning the start of the range - 1 when no hole is found. Update page_cache_next_miss() for clarity as well. Both helpers were previously fixed together in commit 9425c591e06a ("page cache: fix page_cache_next/prev_miss off by one"), but the fix was reverted because it caused a hugetlb performance regression. hugetlb no longer uses these functions and next_miss was subsequently refixed in commit 901a269ff3d5 ("filemap: fix page_cache_next_miss() when no hole found") and commit bbcaee20e03e ("readahead: fix return value of page_cache_next_miss() when no hole is found"), but prev_miss was not addressed. This was found by pointing Claude Opus 4.7 at mm/filemap.c. Fixes: 0d3f92966629 ("page cache: Convert hole search to XArray") Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Tal Zussman Reviewed-by: Jan Kara Reviewed-by: Vishal Moola --- Changes in v2: - Change return value for clarity, per Vishal and Jan. - Update page_cache_next_miss() for consistency and get rid of nr variable. - Link to v1: https://lore.kernel.org/r/20260510-prev_miss_fix-v1-1-755bb12= 3145a@columbia.edu --- mm/filemap.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mm/filemap.c b/mm/filemap.c index ab34cab2416a..4263d9775998 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1808,9 +1808,8 @@ pgoff_t page_cache_next_miss(struct address_space *ma= pping, pgoff_t index, unsigned long max_scan) { XA_STATE(xas, &mapping->i_pages, index); - unsigned long nr =3D max_scan; =20 - while (nr--) { + while (max_scan--) { void *entry =3D xas_next(&xas); if (!entry || xa_is_value(entry)) return xas.xa_index; @@ -1818,7 +1817,8 @@ pgoff_t page_cache_next_miss(struct address_space *ma= pping, return 0; } =20 - return index + max_scan; + /* Return end of the range + 1 when no hole is found */ + return xas.xa_index + 1; } EXPORT_SYMBOL(page_cache_next_miss); =20 @@ -1849,12 +1849,13 @@ pgoff_t page_cache_prev_miss(struct address_space *= mapping, while (max_scan--) { void *entry =3D xas_prev(&xas); if (!entry || xa_is_value(entry)) - break; + return xas.xa_index; if (xas.xa_index =3D=3D ULONG_MAX) - break; + return ULONG_MAX; } =20 - return xas.xa_index; + /* Return start of the range - 1 when no hole is found */ + return xas.xa_index - 1; } EXPORT_SYMBOL(page_cache_prev_miss); =20 --- base-commit: e9dd96806dbc2d50a66770b6a86962bd5d601153 change-id: 20260510-prev_miss_fix-fcb308472131 Best regards, --=20 Tal Zussman