From: Brian Foster <bfoster@redhat.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Matthew Wilcox <willy@infradead.org>,
Hugh Dickins <hughd@google.com>,
linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org,
linux-ext4@vger.kernel.org, cluster-devel@redhat.com,
linux-mm@kvack.org, linux-xfs@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-nilfs@vger.kernel.org
Subject: Re: [PATCH 4/9] shmem: remove shmem_get_partial_folio
Date: Wed, 18 Jan 2023 08:57:05 -0500 [thread overview]
Message-ID: <Y8f6sShghKuFim5E@bfoster> (raw)
In-Reply-To: <20230118094329.9553-5-hch@lst.de>
On Wed, Jan 18, 2023 at 10:43:24AM +0100, Christoph Hellwig wrote:
> Add a new SGP_FIND mode for shmem_get_partial_folio that works like
> SGP_READ, but does not check i_size. Use that instead of open coding
> the page cache lookup in shmem_get_partial_folio. Note that this is
> a behavior change in that it reads in swap cache entries for offsets
> outside i_size, possibly causing a little bit of extra work.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> include/linux/shmem_fs.h | 1 +
> mm/shmem.c | 46 ++++++++++++----------------------------
> 2 files changed, 15 insertions(+), 32 deletions(-)
>
> diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
> index d09d54be4ffd99..7ba160ac066e5e 100644
> --- a/include/linux/shmem_fs.h
> +++ b/include/linux/shmem_fs.h
> @@ -105,6 +105,7 @@ enum sgp_type {
> SGP_CACHE, /* don't exceed i_size, may allocate page */
> SGP_WRITE, /* may exceed i_size, may allocate !Uptodate page */
> SGP_FALLOC, /* like SGP_WRITE, but make existing page Uptodate */
> + SGP_FIND, /* like SGP_READ, but also read outside i_size */
> };
>
> int shmem_get_folio(struct inode *inode, pgoff_t index, struct folio **foliop,
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 9e1015cbad29f9..e9500fea43a8dc 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -877,27 +877,6 @@ void shmem_unlock_mapping(struct address_space *mapping)
> }
> }
>
> -static struct folio *shmem_get_partial_folio(struct inode *inode, pgoff_t index)
> -{
> - struct folio *folio;
> -
> - /*
> - * At first avoid shmem_get_folio(,,,SGP_READ): that fails
> - * beyond i_size, and reports fallocated pages as holes.
> - */
> - folio = __filemap_get_folio(inode->i_mapping, index,
> - FGP_ENTRY | FGP_LOCK, 0);
This all seems reasonable to me at a glance, FWIW, but I am a little
curious why this wouldn't split up into two changes. I.e., switch this
over to filemap_get_entry() to minimally remove the FGP_ENTRY dependency
without a behavior change, then (perhaps after the next patch) introduce
SGP_FIND in a separate patch. That makes it easier to review and
potentially undo if it happens to pose a problem in the future. Hm?
Brian
> - if (!xa_is_value(folio))
> - return folio;
> - /*
> - * But read a page back from swap if any of it is within i_size
> - * (although in some cases this is just a waste of time).
> - */
> - folio = NULL;
> - shmem_get_folio(inode, index, &folio, SGP_READ);
> - return folio;
> -}
> -
> /*
> * Remove range of pages and swap entries from page cache, and free them.
> * If !unfalloc, truncate or punch hole; if unfalloc, undo failed fallocate.
> @@ -957,7 +936,8 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend,
> goto whole_folios;
>
> same_folio = (lstart >> PAGE_SHIFT) == (lend >> PAGE_SHIFT);
> - folio = shmem_get_partial_folio(inode, lstart >> PAGE_SHIFT);
> + folio = NULL;
> + shmem_get_folio(inode, lstart >> PAGE_SHIFT, &folio, SGP_FIND);
> if (folio) {
> same_folio = lend < folio_pos(folio) + folio_size(folio);
> folio_mark_dirty(folio);
> @@ -971,14 +951,16 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend,
> folio = NULL;
> }
>
> - if (!same_folio)
> - folio = shmem_get_partial_folio(inode, lend >> PAGE_SHIFT);
> - if (folio) {
> - folio_mark_dirty(folio);
> - if (!truncate_inode_partial_folio(folio, lstart, lend))
> - end = folio->index;
> - folio_unlock(folio);
> - folio_put(folio);
> + if (!same_folio) {
> + folio = NULL;
> + shmem_get_folio(inode, lend >> PAGE_SHIFT, &folio, SGP_FIND);
> + if (folio) {
> + folio_mark_dirty(folio);
> + if (!truncate_inode_partial_folio(folio, lstart, lend))
> + end = folio->index;
> + folio_unlock(folio);
> + folio_put(folio);
> + }
> }
>
> whole_folios:
> @@ -1900,7 +1882,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
> if (folio_test_uptodate(folio))
> goto out;
> /* fallocated folio */
> - if (sgp != SGP_READ)
> + if (sgp != SGP_READ && sgp != SGP_FIND)
> goto clear;
> folio_unlock(folio);
> folio_put(folio);
> @@ -1911,7 +1893,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
> * SGP_NOALLOC: fail on hole, with NULL folio, letting caller fail.
> */
> *foliop = NULL;
> - if (sgp == SGP_READ)
> + if (sgp == SGP_READ || sgp == SGP_FIND)
> return 0;
> if (sgp == SGP_NOALLOC)
> return -ENOENT;
> --
> 2.39.0
>
>
next prev parent reply other threads:[~2023-01-18 14:16 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 9:43 return an ERR_PTR from __filemap_get_folio Christoph Hellwig
2023-01-18 9:43 ` [PATCH 1/9] mm: don't look at xarray value entries in split_huge_pages_in_file Christoph Hellwig
2023-01-18 13:47 ` Matthew Wilcox
2023-01-18 9:43 ` [PATCH 2/9] mm: make mapping_get_entry available outside of filemap.c Christoph Hellwig
2023-01-18 13:49 ` Matthew Wilcox
2023-01-18 9:43 ` [PATCH 3/9] mm: use filemap_get_entry in filemap_get_incore_folio Christoph Hellwig
2023-01-18 13:49 ` Matthew Wilcox
2023-01-18 9:43 ` [PATCH 4/9] shmem: remove shmem_get_partial_folio Christoph Hellwig
2023-01-18 13:57 ` Brian Foster [this message]
2023-01-18 16:43 ` Christoph Hellwig
2023-01-18 16:50 ` Brian Foster
2023-01-18 9:43 ` [PATCH 5/9] shmem: open code the page cache lookup in shmem_get_folio_gfp Christoph Hellwig
2023-01-18 9:43 ` [PATCH 6/9] mm: remove FGP_ENTRY Christoph Hellwig
2023-01-18 9:43 ` [PATCH 7/9] gfs2: handle a NULL folio in gfs2_jhead_process_page Christoph Hellwig
2023-01-18 16:00 ` Matthew Wilcox
2023-01-18 16:24 ` [Cluster-devel] " Andreas Gruenbacher
2023-01-18 16:42 ` Christoph Hellwig
2023-01-18 9:43 ` [PATCH 8/9] btrfs: handle a NULL folio in extent_range_redirty_for_io Christoph Hellwig
2023-01-18 16:08 ` Matthew Wilcox
2023-01-18 16:42 ` Christoph Hellwig
2023-01-18 9:43 ` [PATCH 9/9] mm: return an ERR_PTR from __filemap_get_folio Christoph Hellwig
2023-01-18 12:39 ` Ryusuke Konishi
2023-01-18 16:42 ` Christoph Hellwig
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=Y8f6sShghKuFim5E@bfoster \
--to=bfoster@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=cluster-devel@redhat.com \
--cc=hch@lst.de \
--cc=hughd@google.com \
--cc=linux-afs@lists.infradead.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nilfs@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--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).