mm/filemap: don't decrease mmap_miss when folio has workingset flag
If there are too many folios that are recently evicted in a file, then they will probably continue to be evicted. In such situation, there is no positive effect to read-ahead this file since it is only a waste of IO. The mmap_miss is increased in do_sync_mmap_readahead() and decreased in both do_async_mmap_readahead() and filemap_map_pages(). In order to skip read-ahead in above scenario, the mmap_miss have to increased exceed MMAP_LOTSAMISS. This can be done by stop decreased mmap_miss when folio has workingset flag. The async path is not to care because in above scenario, it's hard to run into the async path. [liushixin2@huawei.com: add comments] Link: https://lkml.kernel.org/r/20240326065026.1910584-1-liushixin2@huawei.com Link: https://lkml.kernel.org/r/20240322093555.226789-3-liushixin2@huawei.com Signed-off-by: Liu Shixin <liushixin2@huawei.com> Reviewed-by: Jan Kara <jack@suse.cz> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Christian Brauner <brauner@kernel.org> Cc: Jinjiang Tu <tujinjiang@huawei.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
0fd44ab213
commit
5c46d5319b
14
mm/filemap.c
14
mm/filemap.c
@ -3492,7 +3492,15 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf,
|
||||
if (PageHWPoison(page + count))
|
||||
goto skip;
|
||||
|
||||
(*mmap_miss)++;
|
||||
/*
|
||||
* If there are too many folios that are recently evicted
|
||||
* in a file, they will probably continue to be evicted.
|
||||
* In such situation, read-ahead is only a waste of IO.
|
||||
* Don't decrease mmap_miss in this scenario to make sure
|
||||
* we can stop read-ahead.
|
||||
*/
|
||||
if (!folio_test_workingset(folio))
|
||||
(*mmap_miss)++;
|
||||
|
||||
/*
|
||||
* NOTE: If there're PTE markers, we'll leave them to be
|
||||
@ -3541,7 +3549,9 @@ static vm_fault_t filemap_map_order0_folio(struct vm_fault *vmf,
|
||||
if (PageHWPoison(page))
|
||||
return ret;
|
||||
|
||||
(*mmap_miss)++;
|
||||
/* See comment of filemap_map_folio_range() */
|
||||
if (!folio_test_workingset(folio))
|
||||
(*mmap_miss)++;
|
||||
|
||||
/*
|
||||
* NOTE: If there're PTE markers, we'll leave them to be
|
||||
|
Loading…
x
Reference in New Issue
Block a user