From: Daniel Gomez <da.gomez@samsung.com>
To: "viro@zeniv.linux.org.uk" <viro@zeniv.linux.org.uk>,
"brauner@kernel.org" <brauner@kernel.org>,
"jack@suse.cz" <jack@suse.cz>,
"hughd@google.com" <hughd@google.com>,
"akpm@linux-foundation.org" <akpm@linux-foundation.org>
Cc: "dagmcr@gmail.com" <dagmcr@gmail.com>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"willy@infradead.org" <willy@infradead.org>,
"hch@infradead.org" <hch@infradead.org>,
"mcgrof@kernel.org" <mcgrof@kernel.org>,
Pankaj Raghav <p.raghav@samsung.com>,
"gost.dev@samsung.com" <gost.dev@samsung.com>,
"Daniel Gomez" <da.gomez@samsung.com>
Subject: [RFC PATCH 7/9] shmem: check if a block is uptodate before splice into pipe
Date: Fri, 9 Feb 2024 14:29:04 +0000 [thread overview]
Message-ID: <20240209142901.126894-8-da.gomez@samsung.com> (raw)
In-Reply-To: <20240209142901.126894-1-da.gomez@samsung.com>
The splice_read() path assumes folios are always uptodate. Make sure
all blocks in the given range are uptodate or else, splice zeropage into
the pipe. Maximize the number of blocks that can be spliced into pipe at
once by increasing the 'part' to the latest uptodate block found.
Signed-off-by: Daniel Gomez <da.gomez@samsung.com>
---
mm/shmem.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/mm/shmem.c b/mm/shmem.c
index 9fa86cb82da9..2d2eeb40f19b 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -3196,8 +3196,30 @@ static ssize_t shmem_file_splice_read(struct file *in, loff_t *ppos,
if (unlikely(*ppos >= isize))
break;
part = min_t(loff_t, isize - *ppos, len);
+ if (folio && folio_test_large(folio) &&
+ folio_test_private(folio)) {
+ unsigned long from = offset_in_folio(folio, *ppos);
+ unsigned int bfirst = from >> inode->i_blkbits;
+ unsigned int blast, blast_upd;
+
+ len = min(folio_size(folio) - from, len);
+ blast = (from + len - 1) >> inode->i_blkbits;
+
+ blast_upd = sfs_get_last_block_uptodate(folio, bfirst,
+ blast);
+ if (blast_upd <= blast) {
+ unsigned int bsize = 1 << inode->i_blkbits;
+ unsigned int blks = blast_upd - bfirst + 1;
+ unsigned int bbytes = blks << inode->i_blkbits;
+ unsigned int boff = (*ppos % bsize);
+
+ part = min_t(loff_t, bbytes - boff, len);
+ }
+ }
- if (folio) {
+ if (folio && shmem_is_block_uptodate(
+ folio, offset_in_folio(folio, *ppos) >>
+ inode->i_blkbits)) {
/*
* If users can be writing to this page using arbitrary
* virtual addresses, take care about potential aliasing
--
2.43.0
next prev parent reply other threads:[~2024-02-09 14:29 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20240209142903eucas1p1f211ca6fc40a788e833de062e2772c41@eucas1p1.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 0/9] shmem: fix llseek in hugepages Daniel Gomez
[not found] ` <CGME20240209142903eucas1p17f73779c6b38276cd7cefbe0a40f355e@eucas1p1.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 1/9] splice: don't check for uptodate if partially uptodate is impl Daniel Gomez
[not found] ` <CGME20240209142905eucas1p2df56a08287a84a5fa004142100926bb4@eucas1p2.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 3/9] shmem: move folio zero operation to write_begin() Daniel Gomez
[not found] ` <CGME20240209142904eucas1p20a388be8e43b756b84b5a586d5a88f18@eucas1p2.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 2/9] shmem: add per-block uptodate tracking for hugepages Daniel Gomez
[not found] ` <CGME20240209142905eucas1p14498619591475e416a8163dbc96c90e4@eucas1p1.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 5/9] shmem: clear_highpage() if block is not uptodate Daniel Gomez
[not found] ` <CGME20240209142906eucas1p2c31598bf448077f04eef66319ae2f3a1@eucas1p2.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 6/9] shmem: set folio uptodate when reclaim Daniel Gomez
[not found] ` <CGME20240209142905eucas1p150b096fab4b8a684b416d3beb0df901b@eucas1p1.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 4/9] shmem: exit shmem_get_folio_gfp() if block is uptodate Daniel Gomez
[not found] ` <CGME20240209142907eucas1p12155b2fb002df5e0cd617fa74de757b7@eucas1p1.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 9/9] shmem: enable per-block uptodate Daniel Gomez
[not found] ` <CGME20240209142907eucas1p2c61ae37b2a1ca2caeccc48b2169226f2@eucas1p2.samsung.com>
2024-02-09 14:29 ` [RFC PATCH 8/9] shmem: clear uptodate blocks after PUNCH_HOLE Daniel Gomez
[not found] ` <CGME20240209142907eucas1p2024d2809a150c6e58082de0937596290@eucas1p2.samsung.com>
2024-02-09 14:29 ` Daniel Gomez [this message]
[not found] ` <CGME20240214194911eucas1p187ae3bc5b2be4e0d2155f9ce792fdf8b@eucas1p1.samsung.com>
2024-02-14 19:49 ` [RFC PATCH 0/9] shmem: fix llseek in hugepages Daniel Gomez
2024-02-19 10:15 ` Hugh Dickins
2024-02-20 10:26 ` Daniel Gomez
2024-02-20 12:39 ` Jan Kara
2024-02-27 11:42 ` Daniel Gomez
2024-02-28 15:50 ` Daniel Gomez
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=20240209142901.126894-8-da.gomez@samsung.com \
--to=da.gomez@samsung.com \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=dagmcr@gmail.com \
--cc=gost.dev@samsung.com \
--cc=hch@infradead.org \
--cc=hughd@google.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mcgrof@kernel.org \
--cc=p.raghav@samsung.com \
--cc=viro@zeniv.linux.org.uk \
--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