From: Jeff Layton <jlayton@kernel.org>
To: David Howells <dhowells@redhat.com>, Steve French <smfrench@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>,
Marc Dionne <marc.dionne@auristor.com>,
Paulo Alcantara <pc@manguebit.com>,
Shyam Prasad N <sprasad@microsoft.com>,
Tom Talpey <tom@talpey.com>,
Dominique Martinet <asmadeus@codewreck.org>,
Ilya Dryomov <idryomov@gmail.com>,
Christian Brauner <christian@brauner.io>,
linux-afs@lists.infradead.org, linux-cifs@vger.kernel.org,
linux-nfs@vger.kernel.org, ceph-devel@vger.kernel.org,
v9fs@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-cachefs@redhat.com
Subject: Re: [RFC PATCH 07/53] netfs: Provide invalidate_folio and release_folio calls
Date: Mon, 16 Oct 2023 11:50:49 -0400 [thread overview]
Message-ID: <01b4b502db610db7e100a6a1371acd8633a5dbb7.camel@kernel.org> (raw)
In-Reply-To: <20231013160423.2218093-8-dhowells@redhat.com>
On Fri, 2023-10-13 at 17:03 +0100, David Howells wrote:
> Provide default invalidate_folio and release_folio calls. These will need
> to interact with invalidation correctly at some point. They will be needed
> if netfslib is to make use of folio->private for its own purposes.
>
> Signed-off-by: David Howells <dhowells@redhat.com>
> cc: Jeff Layton <jlayton@kernel.org>
> cc: linux-cachefs@redhat.com
> cc: linux-fsdevel@vger.kernel.org
> cc: linux-mm@kvack.org
> ---
> fs/9p/vfs_addr.c | 33 ++-------------------------
> fs/afs/file.c | 53 ++++---------------------------------------
> fs/ceph/addr.c | 24 ++------------------
> fs/netfs/Makefile | 1 +
> fs/netfs/misc.c | 51 +++++++++++++++++++++++++++++++++++++++++
> include/linux/netfs.h | 6 +++--
> 6 files changed, 64 insertions(+), 104 deletions(-)
> create mode 100644 fs/netfs/misc.c
>
> diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c
> index 8a635999a7d6..18a666c43e4a 100644
> --- a/fs/9p/vfs_addr.c
> +++ b/fs/9p/vfs_addr.c
> @@ -104,35 +104,6 @@ const struct netfs_request_ops v9fs_req_ops = {
> .issue_read = v9fs_issue_read,
> };
>
> -/**
> - * v9fs_release_folio - release the private state associated with a folio
> - * @folio: The folio to be released
> - * @gfp: The caller's allocation restrictions
> - *
> - * Returns true if the page can be released, false otherwise.
> - */
> -
> -static bool v9fs_release_folio(struct folio *folio, gfp_t gfp)
> -{
> - if (folio_test_private(folio))
> - return false;
> -#ifdef CONFIG_9P_FSCACHE
> - if (folio_test_fscache(folio)) {
> - if (current_is_kswapd() || !(gfp & __GFP_FS))
> - return false;
> - folio_wait_fscache(folio);
> - }
> - fscache_note_page_release(v9fs_inode_cookie(V9FS_I(folio_inode(folio))));
> -#endif
> - return true;
> -}
> -
> -static void v9fs_invalidate_folio(struct folio *folio, size_t offset,
> - size_t length)
> -{
> - folio_wait_fscache(folio);
> -}
> -
> #ifdef CONFIG_9P_FSCACHE
> static void v9fs_write_to_cache_done(void *priv, ssize_t transferred_or_error,
> bool was_async)
> @@ -355,8 +326,8 @@ const struct address_space_operations v9fs_addr_operations = {
> .writepage = v9fs_vfs_writepage,
> .write_begin = v9fs_write_begin,
> .write_end = v9fs_write_end,
> - .release_folio = v9fs_release_folio,
> - .invalidate_folio = v9fs_invalidate_folio,
> + .release_folio = netfs_release_folio,
> + .invalidate_folio = netfs_invalidate_folio,
> .launder_folio = v9fs_launder_folio,
> .direct_IO = v9fs_direct_IO,
> };
> diff --git a/fs/afs/file.c b/fs/afs/file.c
> index 0c49b3b6f214..3fea5cd8ef13 100644
> --- a/fs/afs/file.c
> +++ b/fs/afs/file.c
> @@ -20,9 +20,6 @@
>
> static int afs_file_mmap(struct file *file, struct vm_area_struct *vma);
> static int afs_symlink_read_folio(struct file *file, struct folio *folio);
> -static void afs_invalidate_folio(struct folio *folio, size_t offset,
> - size_t length);
> -static bool afs_release_folio(struct folio *folio, gfp_t gfp_flags);
>
> static ssize_t afs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter);
> static ssize_t afs_file_splice_read(struct file *in, loff_t *ppos,
> @@ -57,8 +54,8 @@ const struct address_space_operations afs_file_aops = {
> .readahead = netfs_readahead,
> .dirty_folio = afs_dirty_folio,
> .launder_folio = afs_launder_folio,
> - .release_folio = afs_release_folio,
> - .invalidate_folio = afs_invalidate_folio,
> + .release_folio = netfs_release_folio,
> + .invalidate_folio = netfs_invalidate_folio,
> .write_begin = afs_write_begin,
> .write_end = afs_write_end,
> .writepages = afs_writepages,
> @@ -67,8 +64,8 @@ const struct address_space_operations afs_file_aops = {
>
> const struct address_space_operations afs_symlink_aops = {
> .read_folio = afs_symlink_read_folio,
> - .release_folio = afs_release_folio,
> - .invalidate_folio = afs_invalidate_folio,
> + .release_folio = netfs_release_folio,
> + .invalidate_folio = netfs_invalidate_folio,
> .migrate_folio = filemap_migrate_folio,
> };
>
> @@ -405,48 +402,6 @@ int afs_write_inode(struct inode *inode, struct writeback_control *wbc)
> return 0;
> }
>
> -/*
> - * invalidate part or all of a page
> - * - release a page and clean up its private data if offset is 0 (indicating
> - * the entire page)
> - */
> -static void afs_invalidate_folio(struct folio *folio, size_t offset,
> - size_t length)
> -{
> - _enter("{%lu},%zu,%zu", folio->index, offset, length);
> -
> - folio_wait_fscache(folio);
> - _leave("");
> -}
> -
> -/*
> - * release a page and clean up its private state if it's not busy
> - * - return true if the page can now be released, false if not
> - */
> -static bool afs_release_folio(struct folio *folio, gfp_t gfp)
> -{
> - struct afs_vnode *vnode = AFS_FS_I(folio_inode(folio));
> -
> - _enter("{{%llx:%llu}[%lu],%lx},%x",
> - vnode->fid.vid, vnode->fid.vnode, folio_index(folio), folio->flags,
> - gfp);
> -
> - /* deny if folio is being written to the cache and the caller hasn't
> - * elected to wait */
> -#ifdef CONFIG_AFS_FSCACHE
> - if (folio_test_fscache(folio)) {
> - if (current_is_kswapd() || !(gfp & __GFP_FS))
> - return false;
> - folio_wait_fscache(folio);
> - }
> - fscache_note_page_release(afs_vnode_cache(vnode));
> -#endif
> -
> - /* Indicate that the folio can be released */
> - _leave(" = T");
> - return true;
> -}
> -
> static void afs_add_open_mmap(struct afs_vnode *vnode)
> {
> if (atomic_inc_return(&vnode->cb_nr_mmap) == 1) {
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index f4863078f7fe..ced19ff08988 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -160,27 +160,7 @@ static void ceph_invalidate_folio(struct folio *folio, size_t offset,
> ceph_put_snap_context(snapc);
> }
>
> - folio_wait_fscache(folio);
> -}
> -
> -static bool ceph_release_folio(struct folio *folio, gfp_t gfp)
> -{
> - struct inode *inode = folio->mapping->host;
> -
> - dout("%llx:%llx release_folio idx %lu (%sdirty)\n",
> - ceph_vinop(inode),
> - folio->index, folio_test_dirty(folio) ? "" : "not ");
> -
> - if (folio_test_private(folio))
> - return false;
> -
> - if (folio_test_fscache(folio)) {
> - if (current_is_kswapd() || !(gfp & __GFP_FS))
> - return false;
> - folio_wait_fscache(folio);
> - }
> - ceph_fscache_note_page_release(inode);
> - return true;
> + netfs_invalidate_folio(folio, offset, length);
> }
>
> static void ceph_netfs_expand_readahead(struct netfs_io_request *rreq)
> @@ -1563,7 +1543,7 @@ const struct address_space_operations ceph_aops = {
> .write_end = ceph_write_end,
> .dirty_folio = ceph_dirty_folio,
> .invalidate_folio = ceph_invalidate_folio,
> - .release_folio = ceph_release_folio,
> + .release_folio = netfs_release_folio,
> .direct_IO = noop_direct_IO,
> };
>
> diff --git a/fs/netfs/Makefile b/fs/netfs/Makefile
> index 386d6fb92793..cd22554d9048 100644
> --- a/fs/netfs/Makefile
> +++ b/fs/netfs/Makefile
> @@ -5,6 +5,7 @@ netfs-y := \
> io.o \
> iterator.o \
> main.o \
> + misc.o \
> objects.o
>
> netfs-$(CONFIG_NETFS_STATS) += stats.o
> diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c
> new file mode 100644
> index 000000000000..c3baf2b247d9
> --- /dev/null
> +++ b/fs/netfs/misc.c
> @@ -0,0 +1,51 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/* Miscellaneous routines.
> + *
> + * Copyright (C) 2022 Red Hat, Inc. All Rights Reserved.
> + * Written by David Howells (dhowells@redhat.com)
> + */
> +
> +#include <linux/swap.h>
> +#include "internal.h"
> +
> +/**
> + * netfs_invalidate_folio - Invalidate or partially invalidate a folio
> + * @folio: Folio proposed for release
> + * @offset: Offset of the invalidated region
> + * @length: Length of the invalidated region
> + *
> + * Invalidate part or all of a folio for a network filesystem. The folio will
> + * be removed afterwards if the invalidated region covers the entire folio.
> + */
> +void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length)
> +{
> + _enter("{%lx},%zx,%zx", folio_index(folio), offset, length);
> +
> + folio_wait_fscache(folio);
> +}
> +EXPORT_SYMBOL(netfs_invalidate_folio);
> +
> +/**
> + * netfs_release_folio - Try to release a folio
> + * @folio: Folio proposed for release
> + * @gfp: Flags qualifying the release
> + *
> + * Request release of a folio and clean up its private state if it's not busy.
> + * Returns true if the folio can now be released, false if not
> + */
> +bool netfs_release_folio(struct folio *folio, gfp_t gfp)
> +{
> + struct netfs_inode *ctx = netfs_inode(folio_inode(folio));
> +
> + if (folio_test_private(folio))
> + return false;
> + if (folio_test_fscache(folio)) {
> + if (current_is_kswapd() || !(gfp & __GFP_FS))
> + return false;
> + folio_wait_fscache(folio);
> + }
> +
> + fscache_note_page_release(netfs_i_cookie(ctx));
> + return true;
> +}
> +EXPORT_SYMBOL(netfs_release_folio);
> diff --git a/include/linux/netfs.h b/include/linux/netfs.h
> index ed64d1034afa..daa431c4148d 100644
> --- a/include/linux/netfs.h
> +++ b/include/linux/netfs.h
> @@ -299,8 +299,10 @@ struct readahead_control;
> void netfs_readahead(struct readahead_control *);
> int netfs_read_folio(struct file *, struct folio *);
> int netfs_write_begin(struct netfs_inode *, struct file *,
> - struct address_space *, loff_t pos, unsigned int len,
> - struct folio **, void **fsdata);
> + struct address_space *, loff_t pos, unsigned int len,
> + struct folio **, void **fsdata);
> +void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length);
> +bool netfs_release_folio(struct folio *folio, gfp_t gfp);
>
> void netfs_subreq_terminated(struct netfs_io_subrequest *, ssize_t, bool);
> void netfs_get_subrequest(struct netfs_io_subrequest *subreq,
>
Nice cleanup. Might can merge this in advance of the rest of the series.
Reviewed-by: Jeff Layton <jlayton@kernel.org>
next prev parent reply other threads:[~2023-10-16 15:50 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-13 16:03 [RFC PATCH 00/53] netfs, afs, cifs: Delegate high-level I/O to netfslib David Howells
2023-10-13 16:03 ` [RFC PATCH 01/53] netfs: Add a procfile to list in-progress requests David Howells
2023-10-13 16:03 ` [RFC PATCH 02/53] netfs: Track the fpos above which the server has no data David Howells
2023-10-13 16:03 ` [RFC PATCH 03/53] netfs: Note nonblockingness in the netfs_io_request struct David Howells
2023-10-13 16:03 ` [RFC PATCH 04/53] netfs: Allow the netfs to make the io (sub)request alloc larger David Howells
2023-10-13 16:03 ` [RFC PATCH 05/53] netfs: Add a ->free_subrequest() op David Howells
2023-10-13 16:03 ` [RFC PATCH 06/53] afs: Don't use folio->private to record partial modification David Howells
2023-10-13 16:03 ` [RFC PATCH 07/53] netfs: Provide invalidate_folio and release_folio calls David Howells
2023-10-16 15:50 ` Jeff Layton [this message]
2023-10-13 16:03 ` [RFC PATCH 08/53] netfs: Add rsize to netfs_io_request David Howells
2023-10-16 15:54 ` Jeff Layton
2023-10-16 16:19 ` David Howells
2023-10-13 16:03 ` [RFC PATCH 09/53] netfs: Implement unbuffered/DIO vs buffered I/O locking David Howells
2023-10-16 15:56 ` Jeff Layton
2023-10-16 16:09 ` David Howells
2023-10-13 16:03 ` [RFC PATCH 10/53] netfs: Add iov_iters to (sub)requests to describe various buffers David Howells
2023-10-13 16:03 ` [RFC PATCH 11/53] netfs: Add support for DIO buffering David Howells
2023-10-16 16:10 ` Jeff Layton
2023-11-17 20:20 ` David Howells
2023-10-13 16:03 ` [RFC PATCH 12/53] netfs: Provide tools to create a buffer in an xarray David Howells
2023-10-13 17:27 ` Matthew Wilcox
2023-10-18 15:03 ` Jeff Layton
2023-11-17 20:11 ` David Howells
2023-10-13 16:03 ` [RFC PATCH 13/53] netfs: Add bounce buffering support David Howells
2023-10-13 16:03 ` [RFC PATCH 14/53] netfs: Add func to calculate pagecount/size-limited span of an iterator David Howells
2023-10-13 16:03 ` [RFC PATCH 15/53] netfs: Limit subrequest by size or number of segments David Howells
2023-10-13 16:03 ` [RFC PATCH 16/53] netfs: Export netfs_put_subrequest() and some tracepoints David Howells
2023-10-13 16:03 ` [RFC PATCH 17/53] netfs: Extend the netfs_io_*request structs to handle writes David Howells
2023-10-13 16:03 ` [RFC PATCH 18/53] netfs: Add a hook to allow tell the netfs to update its i_size David Howells
2023-10-13 16:03 ` [RFC PATCH 19/53] netfs: Make netfs_put_request() handle a NULL pointer David Howells
2023-10-13 16:03 ` [RFC PATCH 20/53] fscache: Add a function to begin an cache op from a netfslib request David Howells
2023-10-13 16:03 ` [RFC PATCH 21/53] netfs: Make the refcounting of netfs_begin_read() easier to use David Howells
2023-10-13 16:03 ` [RFC PATCH 22/53] netfs: Prep to use folio->private for write grouping and streaming write David Howells
2023-10-13 16:03 ` [RFC PATCH 23/53] netfs: Dispatch write requests to process a writeback slice David Howells
2023-10-13 16:03 ` [RFC PATCH 24/53] netfs: Provide func to copy data to pagecache for buffered write David Howells
2023-10-13 16:03 ` [RFC PATCH 25/53] netfs: Make netfs_read_folio() handle streaming-write pages David Howells
2023-10-13 16:03 ` [RFC PATCH 26/53] netfs: Allocate multipage folios in the writepath David Howells
2023-10-13 16:03 ` [RFC PATCH 27/53] netfs: Implement support for unbuffered/DIO read David Howells
2023-10-13 16:03 ` [RFC PATCH 28/53] netfs: Implement unbuffered/DIO write support David Howells
2023-10-13 16:03 ` [RFC PATCH 29/53] netfs: Implement buffered write API David Howells
2023-10-13 16:03 ` [RFC PATCH 30/53] netfs: Allow buffered shared-writeable mmap through netfs_page_mkwrite() David Howells
2023-10-13 16:04 ` [RFC PATCH 31/53] netfs: Provide netfs_file_read_iter() David Howells
2023-10-13 16:04 ` [RFC PATCH 32/53] netfs: Provide a writepages implementation David Howells
2023-10-13 16:04 ` [RFC PATCH 33/53] netfs: Provide minimum blocksize parameter David Howells
2023-10-13 16:04 ` [RFC PATCH 34/53] netfs: Make netfs_skip_folio_read() take account of blocksize David Howells
2023-10-13 16:04 ` [RFC PATCH 35/53] netfs: Perform content encryption David Howells
2023-10-13 16:04 ` [RFC PATCH 36/53] netfs: Decrypt encrypted content David Howells
2023-10-13 16:04 ` [RFC PATCH 37/53] netfs: Support decryption on ubuffered/DIO read David Howells
2023-10-13 16:04 ` [RFC PATCH 38/53] netfs: Support encryption on Unbuffered/DIO write David Howells
2023-10-13 16:04 ` [RFC PATCH 39/53] netfs: Provide a launder_folio implementation David Howells
2023-10-13 16:04 ` [RFC PATCH 40/53] netfs: Implement a write-through caching option David Howells
2023-10-13 16:04 ` [RFC PATCH 41/53] netfs: Rearrange netfs_io_subrequest to put request pointer first David Howells
2023-10-13 16:04 ` [RFC PATCH 42/53] afs: Use the netfs write helpers David Howells
2023-10-13 16:04 ` [RFC PATCH 43/53] cifs: Replace cifs_readdata with a wrapper around netfs_io_subrequest David Howells
2023-10-13 16:04 ` [RFC PATCH 44/53] cifs: Share server EOF pos with netfslib David Howells
2023-10-13 16:04 ` [RFC PATCH 45/53] cifs: Replace cifs_writedata with a wrapper around netfs_io_subrequest David Howells
2023-10-13 16:04 ` [RFC PATCH 46/53] cifs: Use more fields from netfs_io_subrequest David Howells
2023-10-13 16:04 ` [RFC PATCH 47/53] cifs: Make wait_mtu_credits take size_t args David Howells
2023-10-13 16:04 ` [RFC PATCH 48/53] cifs: Implement netfslib hooks David Howells
2023-10-13 16:04 ` [RFC PATCH 49/53] cifs: Move cifs_loose_read_iter() and cifs_file_write_iter() to file.c David Howells
2023-10-13 16:04 ` [RFC PATCH 50/53] cifs: Cut over to using netfslib David Howells
2023-10-13 16:04 ` [RFC PATCH 51/53] cifs: Remove some code that's no longer used, part 1 David Howells
2023-10-13 16:04 ` [RFC PATCH 52/53] cifs: Remove some code that's no longer used, part 2 David Howells
2023-10-13 16:04 ` [RFC PATCH 53/53] cifs: Remove some code that's no longer used, part 3 David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=01b4b502db610db7e100a6a1371acd8633a5dbb7.camel@kernel.org \
--to=jlayton@kernel.org \
--cc=asmadeus@codewreck.org \
--cc=ceph-devel@vger.kernel.org \
--cc=christian@brauner.io \
--cc=dhowells@redhat.com \
--cc=idryomov@gmail.com \
--cc=linux-afs@lists.infradead.org \
--cc=linux-cachefs@redhat.com \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nfs@vger.kernel.org \
--cc=marc.dionne@auristor.com \
--cc=netdev@vger.kernel.org \
--cc=pc@manguebit.com \
--cc=smfrench@gmail.com \
--cc=sprasad@microsoft.com \
--cc=tom@talpey.com \
--cc=v9fs@lists.linux.dev \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).