From: "Pankaj Raghav (Samsung)" <kernel@pankajraghav.com>
To: linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org
Cc: djwong@kernel.org, mcgrof@kernel.org, linux-mm@kvack.org,
hare@suse.de, david@fromorbit.com, akpm@linux-foundation.org,
gost.dev@samsung.com, linux-kernel@vger.kernel.org,
chandan.babu@oracle.com, willy@infradead.org,
Pankaj Raghav <p.raghav@samsung.com>
Subject: [PATCH v2 03/13] filemap: align the index to mapping_min_order in the page cache
Date: Fri, 1 Mar 2024 17:44:34 +0100 [thread overview]
Message-ID: <20240301164444.3799288-4-kernel@pankajraghav.com> (raw)
In-Reply-To: <20240301164444.3799288-1-kernel@pankajraghav.com>
From: Luis Chamberlain <mcgrof@kernel.org>
Supporting mapping_min_order implies that we guarantee each folio in the
page cache has at least an order of mapping_min_order. So when adding new
folios to the page cache we must ensure the index used is aligned to the
mapping_min_order as the page cache requires the index to be aligned to
the order of the folio.
A higher order folio than min_order by definition is a multiple of the
min_order. If an index is aligned to an order higher than a min_order, it
will also be aligned to the min order.
This effectively introduces no new functional changes when min order is
not set other than a few rounding computations that should result in the
same value.
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
---
include/linux/pagemap.h | 10 +++++++++-
mm/filemap.c | 16 ++++++++++------
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index fc8eb9c94e9c..b3cf8ef89826 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -1328,6 +1328,14 @@ struct readahead_control {
._index = i, \
}
+#define DEFINE_READAHEAD_ALIGNED(ractl, f, r, m, i) \
+ struct readahead_control ractl = { \
+ .file = f, \
+ .mapping = m, \
+ .ra = r, \
+ ._index = mapping_align_start_index(m, i), \
+ }
+
#define VM_READAHEAD_PAGES (SZ_128K / PAGE_SIZE)
void page_cache_ra_unbounded(struct readahead_control *,
@@ -1356,7 +1364,7 @@ void page_cache_sync_readahead(struct address_space *mapping,
struct file_ra_state *ra, struct file *file, pgoff_t index,
unsigned long req_count)
{
- DEFINE_READAHEAD(ractl, file, ra, mapping, index);
+ DEFINE_READAHEAD_ALIGNED(ractl, file, ra, mapping, index);
page_cache_sync_ra(&ractl, req_count);
}
diff --git a/mm/filemap.c b/mm/filemap.c
index 2b00442b9d19..96fe5c7fe094 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2416,11 +2416,13 @@ static int filemap_update_page(struct kiocb *iocb,
}
static int filemap_create_folio(struct file *file,
- struct address_space *mapping, pgoff_t index,
+ struct address_space *mapping, loff_t pos,
struct folio_batch *fbatch)
{
struct folio *folio;
int error;
+ unsigned int min_order = mapping_min_folio_order(mapping);
+ pgoff_t index;
folio = filemap_alloc_folio(mapping_gfp_mask(mapping), 0);
if (!folio)
@@ -2440,6 +2442,8 @@ static int filemap_create_folio(struct file *file,
* well to keep locking rules simple.
*/
filemap_invalidate_lock_shared(mapping);
+ /* index in PAGE units but aligned to min_order number of pages. */
+ index = (pos >> (PAGE_SHIFT + min_order)) << min_order;
error = filemap_add_folio(mapping, folio, index,
mapping_gfp_constraint(mapping, GFP_KERNEL));
if (error == -EEXIST)
@@ -2500,8 +2504,7 @@ static int filemap_get_pages(struct kiocb *iocb, size_t count,
if (!folio_batch_count(fbatch)) {
if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ))
return -EAGAIN;
- err = filemap_create_folio(filp, mapping,
- iocb->ki_pos >> PAGE_SHIFT, fbatch);
+ err = filemap_create_folio(filp, mapping, iocb->ki_pos, fbatch);
if (err == AOP_TRUNCATED_PAGE)
goto retry;
return err;
@@ -3093,7 +3096,7 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)
struct file *file = vmf->vma->vm_file;
struct file_ra_state *ra = &file->f_ra;
struct address_space *mapping = file->f_mapping;
- DEFINE_READAHEAD(ractl, file, ra, mapping, vmf->pgoff);
+ DEFINE_READAHEAD_ALIGNED(ractl, file, ra, mapping, vmf->pgoff);
struct file *fpin = NULL;
unsigned long vm_flags = vmf->vma->vm_flags;
unsigned int mmap_miss;
@@ -3147,7 +3150,7 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)
ra->start = max_t(long, 0, vmf->pgoff - ra->ra_pages / 2);
ra->size = ra->ra_pages;
ra->async_size = ra->ra_pages / 4;
- ractl._index = ra->start;
+ ractl._index = mapping_align_start_index(mapping, ra->start);
page_cache_ra_order(&ractl, ra, 0);
return fpin;
}
@@ -3162,7 +3165,7 @@ static struct file *do_async_mmap_readahead(struct vm_fault *vmf,
{
struct file *file = vmf->vma->vm_file;
struct file_ra_state *ra = &file->f_ra;
- DEFINE_READAHEAD(ractl, file, ra, file->f_mapping, vmf->pgoff);
+ DEFINE_READAHEAD_ALIGNED(ractl, file, ra, file->f_mapping, vmf->pgoff);
struct file *fpin = NULL;
unsigned int mmap_miss;
@@ -3657,6 +3660,7 @@ static struct folio *do_read_cache_folio(struct address_space *mapping,
struct folio *folio;
int err;
+ index = mapping_align_start_index(mapping, index);
if (!filler)
filler = mapping->a_ops->read_folio;
repeat:
--
2.43.0
next prev parent reply other threads:[~2024-03-01 16:45 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-01 16:44 [PATCH v2 00/13] enable bs > ps in XFS Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 01/13] mm: Support order-1 folios in the page cache Pankaj Raghav (Samsung)
2024-03-01 17:08 ` Hannes Reinecke
2024-03-01 16:44 ` [PATCH v2 02/13] fs: Allow fine-grained control of folio sizes Pankaj Raghav (Samsung)
2024-03-01 17:09 ` Hannes Reinecke
2024-03-01 16:44 ` Pankaj Raghav (Samsung) [this message]
2024-03-01 19:26 ` [PATCH v2 03/13] filemap: align the index to mapping_min_order in the page cache Matthew Wilcox
2024-03-01 20:04 ` Kent Overstreet
2024-03-04 15:38 ` Pankaj Raghav (Samsung)
2024-03-04 15:36 ` Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 04/13] filemap: use mapping_min_order while allocating folios Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 05/13] readahead: round up file_ra_state->ra_pages to mapping_min_nrpages Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 06/13] readahead: align index to mapping_min_order in ondemand_ra and force_ra Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 07/13] readahead: rework loop in page_cache_ra_unbounded() Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 08/13] readahead: allocate folios with mapping_min_order in ra_(unbounded|order) Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 09/13] mm: do not split a folio if it has minimum folio order requirement Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 10/13] iomap: fix iomap_dio_zero() for fs bs > system page size Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 11/13] xfs: expose block size in stat Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 12/13] xfs: make the calculation generic in xfs_sb_validate_fsb_count() Pankaj Raghav (Samsung)
2024-03-01 16:44 ` [PATCH v2 13/13] xfs: enable block size larger than page size support Pankaj Raghav (Samsung)
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=20240301164444.3799288-4-kernel@pankajraghav.com \
--to=kernel@pankajraghav.com \
--cc=akpm@linux-foundation.org \
--cc=chandan.babu@oracle.com \
--cc=david@fromorbit.com \
--cc=djwong@kernel.org \
--cc=gost.dev@samsung.com \
--cc=hare@suse.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mcgrof@kernel.org \
--cc=p.raghav@samsung.com \
--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