Revert "readahead: properly shorten readahead when falling back to do_page_cache_ra()"
Subsystems (4)
Jan Kara
maintainerPATCH 1/1 Revert "readahead: properly shorten readahead when falling back to do_page_cache_ra()"
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.
--- mm/readahead.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
mm/readahead.c +2 -3
@@ -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,
Signature · 1 line
2.35.3
Quoted 41 lines · Jan Kara
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 todo_page_cache_ra()"). The cause of the problem is thatra->sizecan be shrunk byread_pages()call and subsequently we end up callingdo_page_cache_ra()with negative (read huge positive) number of pages. Let's revert7c877586da3for now until we can find a proper way how the logic inread_pages()andpage_cache_ra_order()can coexist. This can lead to reduced readahead throughput due to readahead window confusion but that's better than outright hangs.Reported-by Anders Blomdell <[email protected]>Reported-by Philippe Troin <[email protected]>Signed-off-by Jan Kara <[email protected]>---
mm/readahead.c | 5 ++---1 file changed, 2 insertions(+), 3 deletions(-)mm/readahead.c +1
-2@@ -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:
mm/readahead.c +1
-1-do_page_cache_ra (ractl, ra->size - (index - start), ra->async_size); +do_page_cache_ra (ractl, ra->size, ra->async_size);
Quoted 3 lines
}
static unsigned long ractl_max_pages(structreadahead_control*ractl,
You can add a
tag as I did experiment and validate the fix with that revert on top of 6.11.10.
Phil.