From nobody Sat Jun 13 04:22:23 2026 Received: from mx0a-00364e01.pphosted.com (mx0a-00364e01.pphosted.com [148.163.135.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 814FA33EAEC for ; Sun, 10 May 2026 21:56:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778450214; cv=none; b=L7OvhLB+YgN2ga4aSqFKvUK4egwwQM68R3LPAkYt2SC0J+pR/H2OPQ0GahWhplSUGmEXgNNmsMvwNdjjWkXyymBe4FsOD4K3juKdE47idgBCvLBTyeFF7XnHPC5NrAV6UxctAjTcBKpnjwKFaNQRqgX2+fe32ETGcIxarZfrm7w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778450214; c=relaxed/simple; bh=YxgrvZR3kH+gqOp0C/o4cUtDxnd5s1ZrRJGL8qXBbYc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=nNOKnVnCrT9shz4iA9AhJtS8eKOltDwXLNUcR7R8BF0p59AJ8TNkRRxHtFx0T/7trvscMTrKnGCHDx91pURq0PvjbAmqQKoPNHKUgVKKuIqQS8AACpoIC7K34FzB1tKNAqvvnMfWgvywQEYDDfeT7JbmQmPWlCcVulbZuHhWbOw= 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=fAaUJTUb; arc=none smtp.client-ip=148.163.135.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="fAaUJTUb" Received: from pps.filterd (m0167072.ppops.net [127.0.0.1]) by mx0a-00364e01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64AJBCDP3052800 for ; Sun, 10 May 2026 17:56:46 -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=jKIH04EBx4jQOhPZmlThKGkQBf xOj/8qm7n8vOuVizM=; b=fAaUJTUbaDBW2iznlyx6Vm8sXgjlJH5i+JAkG3UUOm Qz0ypTsyTuKuf6/PPsuWLbBVbN7LAiM8sAfJESDCWRX3iNPVhlcxbNpsMQi9VPUS 7MzCUrnUN51R1k7I99YgSNOGiCc4whpEycBAVe67iADCnpQTPRs73YXMyaAu+NzW lU0Z456X1YjzBhMK19LYkSNNvzY/jMNpPNyXk4Ex8EUTs+kuzbGcjZ/K1t/pcwwg 7f/W1p8/iNluGOZZmgwZPRRgA/4JtLU7zTbygEAdoZ1U/+4LLyMdAYzEcx2pbMjG j6CK33PhfrcQ6tNNVHltK92PfxKWVFTxDfuEEFNAxzCg== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-00364e01.pphosted.com (PPS) with ESMTPS id 4e2yxxgfx0-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sun, 10 May 2026 17:56:45 -0400 (EDT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-50d812c898cso90860671cf.1 for ; Sun, 10 May 2026 14:56:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778450204; x=1779055004; 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=jKIH04EBx4jQOhPZmlThKGkQBfxOj/8qm7n8vOuVizM=; b=a5C/WsmFMDZqupPJ/CcxUMUGP0Kj/5jsBYzuYqG4pvfjnruZmkT32W7xHf6J0C2hz/ ZmO/dIPz50nHIMXJhaOH8C1ZWG/nSGWdVkcegS/aJlOTdElBe7GIGqxUThK0bNABk4Nm C+pzXA6Tb3+zgY5XydcfTt//rGtXKEIwOoTnBI9tkNi4uthQtytG+U57MKkA6CvzjEcO x85RJrEl4rAq+QPq17mHqQVJc1WG+FaECgOu4pU8ksEkjmV8W3HySmAbwgEn3KmxtxpT wT0s0n7Eoyal1T2ZAZYr9MU0QAFd5APC4cT4AxFgyeya1ghn/4K7chaIPH5iPozMgjKN 3NqQ== X-Forwarded-Encrypted: i=1; AFNElJ9vANI9Bg3lprEM67RQ7hGxp+xY/m7d1bdxryKwjEvF/D3LyglwnJbE1P2nqmGqrBA/RFNH263O4Lqreck=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8dyMXiVn6PS71V6vfQ9QumwaP90/SrefEN/d9+hU2yQRL6lbg tZqxL5VcxhIP2EfhTD/7tbmkJxc9JsNrIYFA58BGC/Tq1xb/YthsWhTIa49AU6w9uAQVmUml1qg udwTEB7086LRvnsz+3VLkZoj+HWyHdH4nyOMnCrHW3+GDOP3jQmlf644eVO/lGxbvFtJgJA== X-Gm-Gg: Acq92OFtBe1EhaAUPoH3VxITHtJ41JGBW4sUz1m6KVaZ1+jFtUHS5oc8quSyP+hkHOO jO4hxfXZhNSGUOJT6Sthd6hVmkKMsBXc0rrCovKzwzYlWKpdQwO9dGwSaNFc72hT4tlQyHdp3hI iS4uBtOFYrwCzkTlZ8nlZRL3K/240Ssz6vjNZAWCH3Krb6ijos7Dr8RgWRDcMd2ckGMnfnpakOO VCDgOJX4GyHwtoZ1Wk/mOWyX5N/vK6rxD0FZWkg5Uyd9QDLiCwlMEV5I5gfrYP+01FJ8sKKq2Tz 440KdQnC0Nnde6gCYL9fYtVelZALtjiIxT0D01ykuD0u7nWrz8zsucHTCOks/OI4qsxQguIB+yq iAQF8TBctyJsZbX190YXsaPy0Ug02+YFZzdfEqPWH3ZR7LhPE+AQ5cvR770rXtHsHuS4= X-Received: by 2002:a05:622a:4a05:b0:50f:b2e4:ebb with SMTP id d75a77b69052e-51461be0195mr329587151cf.10.1778450204585; Sun, 10 May 2026 14:56:44 -0700 (PDT) X-Received: by 2002:a05:622a:4a05:b0:50f:b2e4:ebb with SMTP id d75a77b69052e-51461be0195mr329586971cf.10.1778450204171; Sun, 10 May 2026 14:56:44 -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 d75a77b69052e-5148e7bf34asm77435591cf.14.2026.05.10.14.56.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 10 May 2026 14:56:43 -0700 (PDT) From: Tal Zussman Date: Sun, 10 May 2026 17:54:17 -0400 Subject: [PATCH] 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: <20260510-prev_miss_fix-v1-1-755bb123145a@columbia.edu> X-B4-Tracking: v=1; b=H4sIAIj+AGoC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyDHUUlJIzE vPSU3UzU4B8JSMDIzMDU0MD3QKgqvjczOLi+LTMCt205CRjAwsTcyNDY0MloB6gLFAYbF50bG0 tAH0Y+thfAAAA X-Change-ID: 20260510-prev_miss_fix-fcb308472131 To: "Matthew Wilcox (Oracle)" , Jan Kara , Andrew Morton 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=1778450203; l=2462; i=tz2294@columbia.edu; s=20250528; h=from:subject:message-id; bh=YxgrvZR3kH+gqOp0C/o4cUtDxnd5s1ZrRJGL8qXBbYc=; b=zuLTzWpUjYMr/4//I6PYJbD7PvfLdjx3DXr5QmAfuqXINNrNXe1pK9UaYL5e09CsQeAr98oBT sokA9lNXDL3AdYSyKB6hATmOVyudprxle0XPxjA/aDJ3KX0zzWQEK3g X-Developer-Key: i=tz2294@columbia.edu; a=ed25519; pk=BIj5KdACscEOyAC0oIkeZqLB3L94fzBnDccEooxeM5Y= X-Authority-Analysis: v=2.4 cv=Zv3d7d7G c=1 sm=1 tr=0 ts=6a00ff1d cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=GaPK54s0Se3oFqK5NkZy0g==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=x7bEGLp0ZPQA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Da8U98TiO7q1upZEImrf:22 a=SsB-OO3BMngHh3ZO9fOt:22 a=ILz1Z2p9l7wduT6Ju-UA:9 a=QEXdDO2ut3YA:10 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTEwMDI0MCBTYWx0ZWRfX7M/t4J812Z57 eebUAN/oE9XfGXTdazRkDyVpuX58Tc9i6T7kDZBBp/mJ+875+9MDt9ZS1ro+85TTmlqbWifcu5D 3U27c3jyGWUfpudev/VKeps/JTagbuUplON3cEmJrdhTWytJr/TYN2p+ItVjUL003wtl9OcU7qD oNKirI8sSAD0qhxSJ42smU+O2k07SBs0pfOvURkspabH7uNl25UfW02dexGo34JHNJdrQbF4NSc dXw2hHL9zCncjRYnRPQ67YJ1UQhaeE4J90gSq6deSN+ruyTAKH4ciwFuP+jFedOMPknzUHuBd00 xxYab98qOPWEdXEQ/Vfmmxkd2NW4DJGFVFvUywj14BGA4IY3owJigWIVkzorh2UgXrXmixuyuYG ZJ06Rmd2Gn5TZvTThQ+24gLazxERTQVa7Vn8PtUklBrNlrUR03OU/Pam6ITefTViiN5JP5p/93D fm7wP7qW4tr8Ki3VY8Q== X-Proofpoint-ORIG-GUID: XIn2lAUp7Mn0KzcmkU6bXy5A7CZPU6Ec X-Proofpoint-GUID: XIn2lAUp7Mn0KzcmkU6bXy5A7CZPU6Ec X-Proofpoint-Virus-Version: vendor=nai engine=6800 definitions=11782 signatures=596817 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=10 impostorscore=10 adultscore=0 spamscore=0 clxscore=1015 priorityscore=1501 phishscore=0 suspectscore=0 malwarescore=0 bulkscore=10 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605100240 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. Mirror the fix in commit bbcaee20e03e ("readahead: fix return value of page_cache_next_miss() when no hole is found"): preserve max_scan in a separate variable across the loop and return `index - max_scan` from the no-gap-found path. 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 --- mm/filemap.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mm/filemap.c b/mm/filemap.c index ab34cab2416a..545ccd59777d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1845,16 +1845,17 @@ pgoff_t page_cache_prev_miss(struct address_space *= mapping, pgoff_t index, unsigned long max_scan) { XA_STATE(xas, &mapping->i_pages, index); + unsigned long nr =3D max_scan; =20 - while (max_scan--) { + while (nr--) { 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 index - max_scan; } EXPORT_SYMBOL(page_cache_prev_miss); =20 --- base-commit: e9dd96806dbc2d50a66770b6a86962bd5d601153 change-id: 20260510-prev_miss_fix-fcb308472131 Best regards, --=20 Tal Zussman