[PATCH RFC] mm/readahead: Fix repeat initial_readahead
From: Peng Zhang
Date: Tue Jun 18 2024 - 08:00:22 EST
From: bruzzhang <bruzzhang@xxxxxxxxxxx>
Now, if read from start of file, readahead
state will be repeatly initialized when
first time async readahead after sync one.
This case likes:
sequence read
page_cache_sync_readahead()
--> ondemand_readahead() <-- initial ra
--> folio ready <-- order=2, readahead flags
folio_test_readahead(folio)
filemap_readahead() <-- async readahead
--> ondemand_readahead() <-- initial ra again
The second initialization of ra seems a
mistake, and right ra window
(start, size, async_size) should be (4,8,8)
instead of (0,4,3) after async readahead.
What's more, this patch can improve sequence
read greatly, the result of test as following:
case name upstream upstream+fix speedup
---------- -------- ------------ --------
randread-4k-sync 48981.00 48948.0000 -0.0674%
seqread-4k-sync 1162630.00 1334915.00 14.8186%
randread-4k-libaio 47561.00 49910.00 4.9389%
seqread-4k-libaio 1058526.00 1257134.00 18.7627%
seqread-1024k-libaio 1365866.00 1411463.00 3.3383%
Signed-off-by: bruzzhang <bruzzhang@xxxxxxxxxxx>
Signed-off-by: Rongwei Wang <zigiwang@xxxxxxxxxxx>
Signed-off-by: Vern Hao <vernhao@xxxxxxxxxxx>
---
mm/readahead.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mm/readahead.c b/mm/readahead.c
index c1b23989d..498708b4b 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -571,7 +571,7 @@ static void ondemand_readahead(struct readahead_control *ractl,
/*
* start of file
*/
- if (!index)
+ if (!folio && !index)
goto initial_readahead;
/*
--
2.39.3