2022-01-23 15:38:30

by Matthew Wilcox

[permalink] [raw]
Subject: [PATCH 1/2] Convert NFS from readpages to readahead

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) <[email protected]>
---
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(-)

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
--
2.34.1


2022-02-08 06:18:47

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH 1/2] Convert NFS from readpages to readahead

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.

--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
[email protected]


2022-02-08 18:43:00

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH 1/2] Convert NFS from readpages to readahead

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.

2022-02-26 02:16:56

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH 1/2] Convert NFS from readpages to readahead

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?

2022-02-28 02:38:55

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH 1/2] Convert NFS from readpages to readahead

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

--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
[email protected]