From: Christoph Hellwig <hch@lst.de>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 4/7] shmem: remove shmem_get_partial_folio
Date: Tue, 7 Mar 2023 15:34:07 +0100 [thread overview]
Message-ID: <20230307143410.28031-5-hch@lst.de> (raw)
In-Reply-To: <20230307143410.28031-1-hch@lst.de>
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 103d1000a5a2e2..b87df1b137d3e5 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 448f393d8ab2b1..3705437c5757ba 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);
- 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.1
next prev parent reply other threads:[~2023-03-07 14:34 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-07 14:34 [Cluster-devel] return an ERR_PTR from __filemap_get_folio v3 Christoph Hellwig
2023-03-07 14:34 ` [Cluster-devel] [PATCH 1/7] mm: don't look at xarray value entries in split_huge_pages_in_file Christoph Hellwig
2023-03-07 14:34 ` [Cluster-devel] [PATCH 2/7] mm: make mapping_get_entry available outside of filemap.c Christoph Hellwig
2023-03-07 14:34 ` [Cluster-devel] [PATCH 3/7] mm: use filemap_get_entry in filemap_get_incore_folio Christoph Hellwig
2023-03-07 14:34 ` Christoph Hellwig [this message]
2023-03-20 5:19 ` [Cluster-devel] [PATCH 4/7] shmem: remove shmem_get_partial_folio Hugh Dickins
2023-03-20 13:58 ` Christoph Hellwig
2023-03-07 14:34 ` [Cluster-devel] [PATCH 5/7] shmem: open code the page cache lookup in shmem_get_folio_gfp Christoph Hellwig
2023-03-20 5:23 ` Hugh Dickins
2023-03-07 14:34 ` [Cluster-devel] [PATCH 6/7] mm: remove FGP_ENTRY Christoph Hellwig
2023-03-07 14:34 ` [Cluster-devel] [PATCH 7/7] mm: return an ERR_PTR from __filemap_get_folio Christoph Hellwig
2023-03-07 15:23 ` [Cluster-devel] return an ERR_PTR from __filemap_get_folio v3 Andreas Gruenbacher
-- strict thread matches above, loose matches on Subject: below --
2023-01-21 6:57 [Cluster-devel] return an ERR_PTR from __filemap_get_folio v2 Christoph Hellwig
2023-01-21 6:57 ` [Cluster-devel] [PATCH 4/7] shmem: remove shmem_get_partial_folio 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=20230307143410.28031-5-hch@lst.de \
--to=hch@lst.de \
/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).