diff mbox series

[1/2] Convert NFS from readpages to readahead

Message ID 20220122205453.3958181-1-willy@infradead.org (mailing list archive)
State New, archived
Headers show
Series [1/2] Convert NFS from readpages to readahead | expand

Commit Message

Matthew Wilcox (Oracle) Jan. 22, 2022, 8:54 p.m. UTC
NFS is one of the last two users of the deprecated ->readpages aop.
This conversion looks straightforward, but I have only compile-tested
it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/nfs/file.c          |  2 +-
 fs/nfs/nfstrace.h      |  6 +++---
 fs/nfs/read.c          | 21 +++++++++++++--------
 include/linux/nfs_fs.h |  3 +--
 4 files changed, 18 insertions(+), 14 deletions(-)

Comments

Matthew Wilcox (Oracle) Jan. 31, 2022, 2:39 p.m. UTC | #1
On Sat, Jan 22, 2022 at 08:54:52PM +0000, Matthew Wilcox (Oracle) wrote:
> NFS is one of the last two users of the deprecated ->readpages aop.
> This conversion looks straightforward, but I have only compile-tested
> it.

These patches still apply to -rc2.
Matthew Wilcox (Oracle) Feb. 7, 2022, 4:18 p.m. UTC | #2
On Mon, Jan 31, 2022 at 02:39:17PM +0000, Matthew Wilcox wrote:
> On Sat, Jan 22, 2022 at 08:54:52PM +0000, Matthew Wilcox (Oracle) wrote:
> > NFS is one of the last two users of the deprecated ->readpages aop.
> > This conversion looks straightforward, but I have only compile-tested
> > it.
> 
> These patches still apply to -rc2.

And they still apply to rc3.

I'm just going to send them to Linus as part of the general fs-folio
work I'm doing during the next merge window.  If anybody would like to
test them, I'm happy to stick a Tested-by on them.
Trond Myklebust Feb. 7, 2022, 7:47 p.m. UTC | #3
On Mon, 2022-02-07 at 16:18 +0000, Matthew Wilcox wrote:
> On Mon, Jan 31, 2022 at 02:39:17PM +0000, Matthew Wilcox wrote:
> > On Sat, Jan 22, 2022 at 08:54:52PM +0000, Matthew Wilcox (Oracle)
> > wrote:
> > > NFS is one of the last two users of the deprecated ->readpages
> > > aop.
> > > This conversion looks straightforward, but I have only compile-
> > > tested
> > > it.
> > 
> > These patches still apply to -rc2.
> 
> And they still apply to rc3.
> 
> I'm just going to send them to Linus as part of the general fs-folio
> work I'm doing during the next merge window.  If anybody would like
> to
> test them, I'm happy to stick a Tested-by on them.

Unless there is a strong external dependency, I'd prefer to send them
through the NFS tree, both for testing purposes, and in case we need to
make changes.

I already have them applied to my 'testing' branch, but I can't move
that into linux-next until Anna's pull request against -rc3 comes
through.
Matthew Wilcox (Oracle) Feb. 25, 2022, 11:22 p.m. UTC | #4
On Mon, Feb 07, 2022 at 07:47:08PM +0000, Trond Myklebust wrote:
> I already have them applied to my 'testing' branch, but I can't move
> that into linux-next until Anna's pull request against -rc3 comes
> through.

Hey Trond,

I'm not seeing any patches in linux-next to fs/nfs/ other than those
that have gone through Andrew Morton, Jens Axboe and Chuck Lever.
Has the linux-nfs tree dropped out of linux-next?
Trond Myklebust Feb. 28, 2022, 1:29 a.m. UTC | #5
On Fri, 2022-02-25 at 23:22 +0000, Matthew Wilcox wrote:
> On Mon, Feb 07, 2022 at 07:47:08PM +0000, Trond Myklebust wrote:
> > I already have them applied to my 'testing' branch, but I can't
> > move
> > that into linux-next until Anna's pull request against -rc3 comes
> > through.
> 
> Hey Trond,
> 
> I'm not seeing any patches in linux-next to fs/nfs/ other than those
> that have gone through Andrew Morton, Jens Axboe and Chuck Lever.
> Has the linux-nfs tree dropped out of linux-next?
> 

Sorry about that. As I said, I was first waiting for Anna to merge the
remaining 5.17 fixes, then got distracted with other work.
Hopefully it should appear in Stephen's tree when he updates it.

Cheers
  Trond
diff mbox series

Patch

diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 76d76acbc594..4d681683d13c 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -514,7 +514,7 @@  static void nfs_swap_deactivate(struct file *file)
 
 const struct address_space_operations nfs_file_aops = {
 	.readpage = nfs_readpage,
-	.readpages = nfs_readpages,
+	.readahead = nfs_readahead,
 	.set_page_dirty = __set_page_dirty_nobuffers,
 	.writepage = nfs_writepage,
 	.writepages = nfs_writepages,
diff --git a/fs/nfs/nfstrace.h b/fs/nfs/nfstrace.h
index 317ce27bdc4b..4611aa3a21a4 100644
--- a/fs/nfs/nfstrace.h
+++ b/fs/nfs/nfstrace.h
@@ -889,11 +889,11 @@  TRACE_EVENT(nfs_aop_readpage_done,
 TRACE_EVENT(nfs_aop_readahead,
 		TP_PROTO(
 			const struct inode *inode,
-			struct page *page,
+			loff_t pos,
 			unsigned int nr_pages
 		),
 
-		TP_ARGS(inode, page, nr_pages),
+		TP_ARGS(inode, pos, nr_pages),
 
 		TP_STRUCT__entry(
 			__field(dev_t, dev)
@@ -911,7 +911,7 @@  TRACE_EVENT(nfs_aop_readahead,
 			__entry->fileid = nfsi->fileid;
 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
 			__entry->version = inode_peek_iversion_raw(inode);
-			__entry->offset = page_index(page) << PAGE_SHIFT;
+			__entry->offset = pos;
 			__entry->nr_pages = nr_pages;
 		),
 
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index eb00229c1a50..2472f962a9a2 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -290,9 +290,8 @@  static void nfs_readpage_result(struct rpc_task *task,
 }
 
 static int
-readpage_async_filler(void *data, struct page *page)
+readpage_async_filler(struct nfs_readdesc *desc, struct page *page)
 {
-	struct nfs_readdesc *desc = data;
 	struct inode *inode = page_file_mapping(page)->host;
 	unsigned int rsize = NFS_SERVER(inode)->rsize;
 	struct nfs_page *new;
@@ -397,14 +396,16 @@  int nfs_readpage(struct file *file, struct page *page)
 	return ret;
 }
 
-int nfs_readpages(struct file *file, struct address_space *mapping,
-		struct list_head *pages, unsigned nr_pages)
+void nfs_readahead(struct readahead_control *ractl)
 {
+	unsigned int nr_pages = readahead_count(ractl);
+	struct file *file = ractl->file;
 	struct nfs_readdesc desc;
-	struct inode *inode = mapping->host;
+	struct inode *inode = ractl->mapping->host;
+	struct page *page;
 	int ret;
 
-	trace_nfs_aop_readahead(inode, lru_to_page(pages), nr_pages);
+	trace_nfs_aop_readahead(inode, readahead_pos(ractl), nr_pages);
 	nfs_inc_stats(inode, NFSIOS_VFSREADPAGES);
 
 	ret = -ESTALE;
@@ -422,14 +423,18 @@  int nfs_readpages(struct file *file, struct address_space *mapping,
 	nfs_pageio_init_read(&desc.pgio, inode, false,
 			     &nfs_async_read_completion_ops);
 
-	ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
+	while ((page = readahead_page(ractl)) != NULL) {
+		ret = readpage_async_filler(&desc, page);
+		put_page(page);
+		if (ret)
+			break;
+	}
 
 	nfs_pageio_complete_read(&desc.pgio);
 
 	put_nfs_open_context(desc.ctx);
 out:
 	trace_nfs_aop_readahead_done(inode, nr_pages, ret);
-	return ret;
 }
 
 int __init nfs_init_readpagecache(void)
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index 00835bacd236..e6ab516bc3d1 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -598,8 +598,7 @@  nfs_have_writebacks(struct inode *inode)
  * linux/fs/nfs/read.c
  */
 extern int  nfs_readpage(struct file *, struct page *);
-extern int  nfs_readpages(struct file *, struct address_space *,
-		struct list_head *, unsigned);
+void nfs_readahead(struct readahead_control *);
 
 /*
  * inline functions