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