Skip to contentSkip to conversation

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

PATCH Applied Jan Kara 2 participants 2 messages Nov 26, 2024

Subsystems (4)
lore
Share & tools
lore

Jan Kara

author maintainer
#0 lore raw

PATCH 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
index 8f1cf599b572..ea650b8b02fb 100644
@@ -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
Tested-by on v1 1/1
#1 lore raw
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 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 +1 -2
index 8f1cf599b572..ea650b8b02fb 100644
@@ -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(struct readahead_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.