]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Revert "mm: limit filemap_fault readahead to VMA boundaries"
authorLorenzo Stoakes <ljs@kernel.org>
Fri, 19 Jun 2026 11:28:51 +0000 (12:28 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 21 Jun 2026 18:37:38 +0000 (11:37 -0700)
This reverts commit 7b32f64bc512b40b268776c5ac4d354b325b3197.

This patch caused a significant performance regression, so revert it, and
we can determine whether the approach is sensible or not moving forwards,
and if so how to avoid this.

There was a merge conflict with commit de97ae6222c1 ("mm/readahead: no
PG_readahead on EOF"), care was taken to ensure that the revert retained
the behaviour of this patch and cleanly reverts commit 7b32f64bc512 ("mm:
limit filemap_fault readahead to VMA boundaries") only.

Link: https://lore.kernel.org/20260619112852.104213-1-ljs@kernel.org
Fixes: 7b32f64bc512 ("mm: limit filemap_fault readahead to VMA boundaries")
Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
Reported-by: kernel test robot <oliver.sang@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202606181547.617a6967-lkp@intel.com
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Jan Kara <jack@suse.cz>
Cc: Kalesh Singh <kaleshsingh@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/pagemap.h
mm/filemap.c
mm/readahead.c

index 627771e82eb162f52b4af04f4e871801d72e0d1a..2c3718d592d6dda2b2475ad01a8656ccef09efd1 100644 (file)
@@ -1348,7 +1348,6 @@ struct readahead_control {
        struct file_ra_state *ra;
 /* private: use the readahead_* accessors instead */
        pgoff_t _index;
-       pgoff_t _max_index; /* limit readahead to _max_index, inclusive */
        unsigned int _nr_pages;
        unsigned int _batch_count;
        bool dropbehind;
@@ -1362,7 +1361,6 @@ struct readahead_control {
                .mapping = m,                                           \
                .ra = r,                                                \
                ._index = i,                                            \
-               ._max_index = ULONG_MAX,                                \
        }
 
 #define VM_READAHEAD_PAGES     (SZ_128K / PAGE_SIZE)
index dc3a0e960b9fd67dfac6478f4b1e2d521c9aaf6b..17a64837597cb13b491c69e7095e2760b6b1b3b3 100644 (file)
@@ -3312,8 +3312,6 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)
        unsigned int thp_order = 0;
        unsigned short mmap_miss;
 
-       ractl._max_index = vmf->vma->vm_pgoff + vma_pages(vmf->vma) - 1;
-
        /* Use the readahead code, even if readahead is disabled */
        if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && (vm_flags & VM_HUGEPAGE)) {
                /*
@@ -3409,7 +3407,6 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)
                 * mmap read-around
                 */
                ra->start = max_t(long, 0, vmf->pgoff - ra->ra_pages / 2);
-               ra->start = max(ra->start, vmf->vma->vm_pgoff);
                ra->size = ra->ra_pages;
                ra->async_size = ra->ra_pages / 4;
                ra->order = 0;
@@ -3457,7 +3454,6 @@ static struct file *do_async_mmap_readahead(struct vm_fault *vmf,
        }
 
        if (folio_test_readahead(folio)) {
-               ractl._max_index = vmf->vma->vm_pgoff + vma_pages(vmf->vma) - 1;
                fpin = maybe_unlock_mmap_for_io(vmf, fpin);
                page_cache_async_ra(&ractl, folio, ra->ra_pages);
        }
index 38ce16e3fcbdf9ea15191addd30d13f21eb84c70..558c92957518b7b7f148f12ee22259d576f29dcb 100644 (file)
@@ -335,8 +335,6 @@ static void do_page_cache_ra(struct readahead_control *ractl,
                return;
 
        end_index = (isize - 1) >> PAGE_SHIFT;
-       if (end_index > ractl->_max_index)
-               end_index = ractl->_max_index;
        if (index > end_index)
                return;
        /* Don't read past the page containing the last byte of the file */
@@ -487,7 +485,7 @@ void page_cache_ra_order(struct readahead_control *ractl,
        pgoff_t start = readahead_index(ractl);
        pgoff_t index = start;
        unsigned int min_order = mapping_min_folio_order(mapping);
-       pgoff_t limit;
+       pgoff_t limit = (i_size_read(mapping->host) - 1) >> PAGE_SHIFT;
        pgoff_t mark;
        unsigned int nofs;
        int err = 0;
@@ -500,8 +498,6 @@ void page_cache_ra_order(struct readahead_control *ractl,
                goto fallback;
        }
 
-       limit = (i_size_read(mapping->host) - 1) >> PAGE_SHIFT;
-       limit = min(limit, ractl->_max_index);
        if (limit > index + ra->size - 1) {
                limit = index + ra->size - 1;
                mark = index + ra->size - ra->async_size;