]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Revert "readahead: properly shorten readahead when falling back to do_page_cache_ra()"
authorJan Kara <jack@suse.cz>
Tue, 26 Nov 2024 14:52:08 +0000 (15:52 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 6 Dec 2024 03:54:44 +0000 (19:54 -0800)
This reverts commit 7c877586da3178974a8a94577b6045a48377ff25.

Anders and Philippe have reported that recent kernels occasionally hang
when used with NFS in readahead code.  The problem has been bisected to
7c877586da3 ("readahead: properly shorten readahead when falling back to
do_page_cache_ra()").  The cause of the problem is that ra->size can be
shrunk by read_pages() call and subsequently we end up calling
do_page_cache_ra() with negative (read huge positive) number of pages.
Let's revert 7c877586da3 for now until we can find a proper way how the
logic in read_pages() and page_cache_ra_order() can coexist.  This can
lead to reduced readahead throughput due to readahead window confusion but
that's better than outright hangs.

Link: https://lkml.kernel.org/r/20241126145208.985-1-jack@suse.cz
Fixes: 7c877586da31 ("readahead: properly shorten readahead when falling back to do_page_cache_ra()")
Reported-by: Anders Blomdell <anders.blomdell@gmail.com>
Reported-by: Philippe Troin <phil@fifi.org>
Signed-off-by: Jan Kara <jack@suse.cz>
Tested-by: Philippe Troin <phil@fifi.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/readahead.c

index 8f1cf599b5722513de1c162ce0fbb6f879c64e1a..ea650b8b02fb19642b5e26a743814b95c7c99594 100644 (file)
@@ -458,8 +458,7 @@ void page_cache_ra_order(struct readahead_control *ractl,
                struct file_ra_state *ra, unsigned int new_order)
 {
        struct address_space *mapping = ractl->mapping;
-       pgoff_t start = readahead_index(ractl);
-       pgoff_t index = start;
+       pgoff_t index = readahead_index(ractl);
        unsigned int min_order = mapping_min_folio_order(mapping);
        pgoff_t limit = (i_size_read(mapping->host) - 1) >> PAGE_SHIFT;
        pgoff_t mark = index + ra->size - ra->async_size;
@@ -522,7 +521,7 @@ void page_cache_ra_order(struct readahead_control *ractl,
        if (!err)
                return;
 fallback:
-       do_page_cache_ra(ractl, ra->size - (index - start), ra->async_size);
+       do_page_cache_ra(ractl, ra->size, ra->async_size);
 }
 
 static unsigned long ractl_max_pages(struct readahead_control *ractl,