[PATCH] readahead: Align window end in pagecache_ra_order()

From: Jan Kara

Date: Thu Nov 05 2026 - 10:31:59 EST


---
mm/readahead.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/mm/readahead.c b/mm/readahead.c
index 6e5563290287..62e204eb3e7c 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -490,7 +490,7 @@ void page_cache_ra_order(struct readahead_control *ractl,
unsigned int nofs;
int err = 0;
gfp_t gfp = readahead_gfp_mask(mapping);
- unsigned int new_order = ra->order;
+ unsigned int new_order = ra->order, last_order = 0;

trace_page_cache_ra_order(mapping->host, start, ra);
if (!mapping_large_folio_support(mapping)) {
@@ -532,10 +532,22 @@ void page_cache_ra_order(struct readahead_control *ractl,
/* Don't allocate pages past EOF */
while (order > min_order && index + (1UL << order) - 1 > limit)
order--;
+ /*
+ * If we are allowed to align the end of readahead window, stop
+ * the readahead as soon as we have to reduce folio order due
+ * to it exceeding the RA window.
+ */
+ if (ractl->_align_end && order < last_order) {
+ ra->size = index - start;
+ if (ra->async_size > ra->size)
+ ra->async_size = ra->size;
+ break;
+ }
err = ra_alloc_folio(ractl, index, mark, order, gfp);
if (err)
break;
index += 1UL << order;
+ last_order = order;
}

read_pages(ractl);
--
2.53.0


--lgcir5uumdsu3tbv--