On Sat, Oct 31, 2020 at 09:59:55AM +0100, Christoph Hellwig wrote: > Move the calculation of the per-page variables and the readahead handling > from the only caller into generic_file_buffered_read_pagenotuptodate, > which now becomes a routine to handle everything related to bringing > one page uptodate and thus is renamed to filemap_read_one_page. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- > mm/filemap.c | 63 +++++++++++++++++++++++----------------------------- > 1 file changed, 28 insertions(+), 35 deletions(-) > > diff --git a/mm/filemap.c b/mm/filemap.c > index bae5b905aa7bdc..5cdf8090d4e12c 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -2217,13 +2217,26 @@ static int filemap_readpage(struct kiocb *iocb, struct page *page) > return error; > } > > -static int generic_file_buffered_read_pagenotuptodate(struct kiocb *iocb, > - struct iov_iter *iter, struct page *page, loff_t pos, > - loff_t count, bool first) > +static int filemap_make_page_uptodate(struct kiocb *iocb, struct iov_iter *iter, > + struct page *page, pgoff_t pg_index, bool first) I prefer "filemap_update_page". I don't understand why you pass in pg_index instead of using page->index. We dereferenced the page pointer already to check PageReadahead(), so there's no performance issue here. Also, if filemap_find_get_pages() stops on the first !Uptodate or Readahead page, as I had it in my patchset, then we don't need the loop at all -- filemap_read_pages() looks like: nr_pages = filemap_find_get_pages(iocb, iter, pages, nr); if (!nr_pages) { pages[0] = filemap_create_page(iocb, iter); if (!IS_ERR_OR_NULL(pages[0])) return 1; if (!pages[0]) goto retry; return PTR_ERR(pages[0]); } page = pages[nr_pages - 1]; if (PageUptodate(page) && !PageReadahead(page)) return nr_pages; err = filemap_update_page(iocb, iter, page); if (!err) return nr_pages; nr_pages -= 1; if (nr_pages) return nr_pages; return err;