On Tue, Feb 13, 2024 at 10:37:03AM +0100, Pankaj Raghav (Samsung) wrote:
> From: Luis Chamberlain <[email protected]>
>
> Set the file_ra_state->ra_pages in file_ra_state_init() to be at least
> mapping_min_order of pages if the bdi->ra_pages is less than that.
>
> Signed-off-by: Luis Chamberlain <[email protected]>
> ---
> mm/readahead.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/mm/readahead.c b/mm/readahead.c
> index 2648ec4f0494..4fa7d0e65706 100644
> --- a/mm/readahead.c
> +++ b/mm/readahead.c
> @@ -138,7 +138,12 @@
> void
> file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping)
> {
> + unsigned int min_nrpages = mapping_min_folio_nrpages(mapping);
> + unsigned int max_pages = inode_to_bdi(mapping->host)->io_pages;
> +
> ra->ra_pages = inode_to_bdi(mapping->host)->ra_pages;
> + if (ra->ra_pages < min_nrpages && min_nrpages < max_pages)
> + ra->ra_pages = min_nrpages;
Why do we want to clamp readahead in this case to io_pages?
We're still going to be allocating a min_order folio in the page
cache, but it is far more efficient to initialise the entire folio
all in a single readahead pass than it is to only partially fill it
with data here and then have to issue and wait for more IO to bring
the folio fully up to date before we can read out data out of it,
right?
-Dave.
--
Dave Chinner
[email protected]