linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mike Marshall <hubcap@omnibond.com>
To: Elliot Berman <quic_eberman@quicinc.com>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	 Mike Marshall <hubcap@omnibond.com>,
	devel@lists.orangefs.org
Subject: Re: [PATCH v5 1/2] filemap: Pass address_space mapping to ->free_folio()
Date: Wed, 4 Dec 2024 07:44:31 -0500	[thread overview]
Message-ID: <CAOg9mSRqCnSManMT38-EdbSTHotAg9KFbEpg9feCDQPFWrgHzw@mail.gmail.com> (raw)
In-Reply-To: <20241122-guestmem-library-v5-1-450e92951a15@quicinc.com>

Hi Elliot...

I added your "v5 1/2" patch to "Linux 6.13-rc1" and ran it through
xfstests with no regressions.

you can add my Tested-by: Mike Marshall <hubcap@omnibond.com>

-Mike

On Fri, Nov 22, 2024 at 12:30 PM Elliot Berman <quic_eberman@quicinc.com> wrote:
>
> When guest_memfd becomes a library, a callback will need to be made to
> the owner (KVM SEV) to update the RMP entry for the page back to shared
> state. This is currently being done as part of .free_folio() operation,
> but this callback shouldn't assume that folio->mapping is set/valid.
>
> The mapping is well-known to callers of .free_folio(), so pass that
> mapping so the callback can access the mapping's private data.
>
> Link: https://lore.kernel.org/all/15f665b4-2d33-41ca-ac50-fafe24ade32f@redhat.com/
> Suggested-by: David Hildenbrand <david@redhat.com>
> Acked-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> ---
>  Documentation/filesystems/locking.rst |  2 +-
>  fs/nfs/dir.c                          | 11 ++++++-----
>  fs/orangefs/inode.c                   |  3 ++-
>  include/linux/fs.h                    |  2 +-
>  mm/filemap.c                          |  9 +++++----
>  mm/secretmem.c                        |  3 ++-
>  mm/vmscan.c                           |  4 ++--
>  virt/kvm/guest_memfd.c                |  3 ++-
>  8 files changed, 21 insertions(+), 16 deletions(-)
>
> diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst
> index f5e3676db954b5bce4c23a0bf723a79d66181fcd..f1a20ad5edbee70c1a3c8d8a9bfc0f008a68985b 100644
> --- a/Documentation/filesystems/locking.rst
> +++ b/Documentation/filesystems/locking.rst
> @@ -258,7 +258,7 @@ prototypes::
>         sector_t (*bmap)(struct address_space *, sector_t);
>         void (*invalidate_folio) (struct folio *, size_t start, size_t len);
>         bool (*release_folio)(struct folio *, gfp_t);
> -       void (*free_folio)(struct folio *);
> +       void (*free_folio)(struct address_space *, struct folio *);
>         int (*direct_IO)(struct kiocb *, struct iov_iter *iter);
>         int (*migrate_folio)(struct address_space *, struct folio *dst,
>                         struct folio *src, enum migrate_mode);
> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> index 492cffd9d3d845723b5f3d0eea3874b1f1773fe1..54e7069013ef2a63db24491fa65059e5ad68057a 100644
> --- a/fs/nfs/dir.c
> +++ b/fs/nfs/dir.c
> @@ -55,7 +55,7 @@ static int nfs_closedir(struct inode *, struct file *);
>  static int nfs_readdir(struct file *, struct dir_context *);
>  static int nfs_fsync_dir(struct file *, loff_t, loff_t, int);
>  static loff_t nfs_llseek_dir(struct file *, loff_t, int);
> -static void nfs_readdir_clear_array(struct folio *);
> +static void nfs_readdir_clear_array(struct address_space *, struct folio *);
>  static int nfs_do_create(struct inode *dir, struct dentry *dentry,
>                          umode_t mode, int open_flags);
>
> @@ -218,7 +218,8 @@ static void nfs_readdir_folio_init_array(struct folio *folio, u64 last_cookie,
>  /*
>   * we are freeing strings created by nfs_add_to_readdir_array()
>   */
> -static void nfs_readdir_clear_array(struct folio *folio)
> +static void nfs_readdir_clear_array(struct address_space *mapping,
> +                                   struct folio *folio)
>  {
>         struct nfs_cache_array *array;
>         unsigned int i;
> @@ -233,7 +234,7 @@ static void nfs_readdir_clear_array(struct folio *folio)
>  static void nfs_readdir_folio_reinit_array(struct folio *folio, u64 last_cookie,
>                                            u64 change_attr)
>  {
> -       nfs_readdir_clear_array(folio);
> +       nfs_readdir_clear_array(folio->mapping, folio);
>         nfs_readdir_folio_init_array(folio, last_cookie, change_attr);
>  }
>
> @@ -249,7 +250,7 @@ nfs_readdir_folio_array_alloc(u64 last_cookie, gfp_t gfp_flags)
>  static void nfs_readdir_folio_array_free(struct folio *folio)
>  {
>         if (folio) {
> -               nfs_readdir_clear_array(folio);
> +               nfs_readdir_clear_array(folio->mapping, folio);
>                 folio_put(folio);
>         }
>  }
> @@ -391,7 +392,7 @@ static void nfs_readdir_folio_init_and_validate(struct folio *folio, u64 cookie,
>         if (folio_test_uptodate(folio)) {
>                 if (nfs_readdir_folio_validate(folio, cookie, change_attr))
>                         return;
> -               nfs_readdir_clear_array(folio);
> +               nfs_readdir_clear_array(folio->mapping, folio);
>         }
>         nfs_readdir_folio_init_array(folio, cookie, change_attr);
>         folio_mark_uptodate(folio);
> diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c
> index aae6d2b8767df04714647db5fe1e5ce54c092fce..2d554102ba9ac83acd2b637d4568090717e87f94 100644
> --- a/fs/orangefs/inode.c
> +++ b/fs/orangefs/inode.c
> @@ -470,7 +470,8 @@ static bool orangefs_release_folio(struct folio *folio, gfp_t foo)
>         return !folio_test_private(folio);
>  }
>
> -static void orangefs_free_folio(struct folio *folio)
> +static void orangefs_free_folio(struct address_space *mapping,
> +                               struct folio *folio)
>  {
>         kfree(folio_detach_private(folio));
>  }
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index e3c603d01337650d562405500013f5c4cfed8eb6..6e5b5cc99750a685b217cb8273c38e7f6bf5ae86 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -417,7 +417,7 @@ struct address_space_operations {
>         sector_t (*bmap)(struct address_space *, sector_t);
>         void (*invalidate_folio) (struct folio *, size_t offset, size_t len);
>         bool (*release_folio)(struct folio *, gfp_t);
> -       void (*free_folio)(struct folio *folio);
> +       void (*free_folio)(struct address_space *, struct folio *folio);
>         ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter);
>         /*
>          * migrate the contents of a folio to the specified target. If
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 36d22968be9a1e10da42927dd627d3f22c3a747b..2c8d92dd9d5dd433acbf1b87156eb2e68337332d 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -235,12 +235,12 @@ void __filemap_remove_folio(struct folio *folio, void *shadow)
>
>  void filemap_free_folio(struct address_space *mapping, struct folio *folio)
>  {
> -       void (*free_folio)(struct folio *);
> +       void (*free_folio)(struct address_space *, struct folio *);
>         int refs = 1;
>
>         free_folio = mapping->a_ops->free_folio;
>         if (free_folio)
> -               free_folio(folio);
> +               free_folio(mapping, folio);
>
>         if (folio_test_large(folio))
>                 refs = folio_nr_pages(folio);
> @@ -814,7 +814,8 @@ EXPORT_SYMBOL(file_write_and_wait_range);
>  void replace_page_cache_folio(struct folio *old, struct folio *new)
>  {
>         struct address_space *mapping = old->mapping;
> -       void (*free_folio)(struct folio *) = mapping->a_ops->free_folio;
> +       void (*free_folio)(struct address_space *, struct folio *) =
> +               mapping->a_ops->free_folio;
>         pgoff_t offset = old->index;
>         XA_STATE(xas, &mapping->i_pages, offset);
>
> @@ -843,7 +844,7 @@ void replace_page_cache_folio(struct folio *old, struct folio *new)
>                 __lruvec_stat_add_folio(new, NR_SHMEM);
>         xas_unlock_irq(&xas);
>         if (free_folio)
> -               free_folio(old);
> +               free_folio(mapping, old);
>         folio_put(old);
>  }
>  EXPORT_SYMBOL_GPL(replace_page_cache_folio);
> diff --git a/mm/secretmem.c b/mm/secretmem.c
> index 3afb5ad701e14ad87b6e5173b2974f1309399b8e..8643d073b8f3554a18d419353fa604864de224c1 100644
> --- a/mm/secretmem.c
> +++ b/mm/secretmem.c
> @@ -152,7 +152,8 @@ static int secretmem_migrate_folio(struct address_space *mapping,
>         return -EBUSY;
>  }
>
> -static void secretmem_free_folio(struct folio *folio)
> +static void secretmem_free_folio(struct address_space *mapping,
> +                                struct folio *folio)
>  {
>         set_direct_map_default_noflush(&folio->page);
>         folio_zero_segment(folio, 0, folio_size(folio));
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 749cdc110c745944cd455ae9c5a4c373f631341d..419dc63de05095be298fee724891f0665a397a7b 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -765,7 +765,7 @@ static int __remove_mapping(struct address_space *mapping, struct folio *folio,
>                 xa_unlock_irq(&mapping->i_pages);
>                 put_swap_folio(folio, swap);
>         } else {
> -               void (*free_folio)(struct folio *);
> +               void (*free_folio)(struct address_space *, struct folio *);
>
>                 free_folio = mapping->a_ops->free_folio;
>                 /*
> @@ -794,7 +794,7 @@ static int __remove_mapping(struct address_space *mapping, struct folio *folio,
>                 spin_unlock(&mapping->host->i_lock);
>
>                 if (free_folio)
> -                       free_folio(folio);
> +                       free_folio(mapping, folio);
>         }
>
>         return 1;
> diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
> index 47a9f68f7b247f4cba0c958b4c7cd9458e7c46b4..24dcbad0cb76e353509cf4718837a1999f093414 100644
> --- a/virt/kvm/guest_memfd.c
> +++ b/virt/kvm/guest_memfd.c
> @@ -358,7 +358,8 @@ static int kvm_gmem_error_folio(struct address_space *mapping, struct folio *fol
>  }
>
>  #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE
> -static void kvm_gmem_free_folio(struct folio *folio)
> +static void kvm_gmem_free_folio(struct address_space *mapping,
> +                               struct folio *folio)
>  {
>         struct page *page = folio_page(folio, 0);
>         kvm_pfn_t pfn = page_to_pfn(page);
>
> --
> 2.34.1
>

  parent reply	other threads:[~2024-12-04 12:44 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-22 17:29 [PATCH v5 0/2] mm: Refactor KVM guest_memfd to introduce guestmem library Elliot Berman
2024-11-22 17:29 ` [PATCH v5 1/2] filemap: Pass address_space mapping to ->free_folio() Elliot Berman
2024-11-22 18:22   ` Matthew Wilcox
2024-12-04 12:44   ` Mike Marshall [this message]
2024-11-22 17:29 ` [PATCH v5 2/2] mm: guestmem: Convert address_space operations to guestmem library Elliot Berman
2024-11-22 18:33   ` Matthew Wilcox
2025-04-03 14:48     ` Sean Christopherson
2024-11-25 18:04 ` [PATCH v5 0/2] mm: Refactor KVM guest_memfd to introduce " Mike Day

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=CAOg9mSRqCnSManMT38-EdbSTHotAg9KFbEpg9feCDQPFWrgHzw@mail.gmail.com \
    --to=hubcap@omnibond.com \
    --cc=devel@lists.orangefs.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=quic_eberman@quicinc.com \
    /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).