Commit a220d6b9 authored by Jan Kara's avatar Jan Kara Committed by Andrew Morton
Browse files

Revert "readahead: properly shorten readahead when falling back to do_page_cache_ra()"

This reverts commit 7c877586.

Anders and Philippe have reported that recent kernels occasionally hang
when used with NFS in readahead code.  The problem has been bisected to
7c877586 ("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 7c877586 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: 7c877586 ("readahead: properly shorten readahead when falling back to do_page_cache_ra()")
Reported-by: default avatarAnders Blomdell <anders.blomdell@gmail.com>
Reported-by: default avatarPhilippe Troin <phil@fifi.org>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Tested-by: default avatarPhilippe Troin <phil@fifi.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 4a475c0a
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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,