From: Zhang Yi <yi.zhang@huaweicloud.com>
To: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, djwong@kernel.org,
hch@infradead.org, brauner@kernel.org, david@fromorbit.com,
jack@suse.cz, yi.zhang@huawei.com, yi.zhang@huaweicloud.com,
chengzhihao1@huawei.com, yukuai3@huawei.com
Subject: [PATCH 5/6] iomap: drop unnecessary state_lock when setting ifs uptodate bits
Date: Wed, 31 Jul 2024 17:13:04 +0800 [thread overview]
Message-ID: <20240731091305.2896873-6-yi.zhang@huaweicloud.com> (raw)
In-Reply-To: <20240731091305.2896873-1-yi.zhang@huaweicloud.com>
From: Zhang Yi <yi.zhang@huawei.com>
Commit '1cea335d1db1 ("iomap: fix sub-page uptodate handling")' fix a
race issue when submitting multiple read bios for a page spans more than
one file system block by adding a spinlock(which names state_lock now)
to make the page uptodate synchronous. However, the race condition only
happened between the read I/O submitting and completeing threads, it's
sufficient to use page lock to protect other paths, e.g. buffered write
path. After large folio is supported, the spinlock could affect more
about the buffered write performance, so drop it could reduce some
unnecessary locking overhead.
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
---
fs/iomap/buffered-io.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index f5668895df66..248f4a586f8f 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -73,14 +73,10 @@ static void iomap_set_range_uptodate(struct folio *folio, size_t off,
size_t len)
{
struct iomap_folio_state *ifs = folio->private;
- unsigned long flags;
bool uptodate = true;
- if (ifs) {
- spin_lock_irqsave(&ifs->state_lock, flags);
+ if (ifs)
uptodate = ifs_set_range_uptodate(folio, ifs, off, len);
- spin_unlock_irqrestore(&ifs->state_lock, flags);
- }
if (uptodate)
folio_mark_uptodate(folio);
@@ -395,7 +391,18 @@ static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
if (iomap_block_needs_zeroing(iter, pos)) {
folio_zero_range(folio, poff, plen);
- iomap_set_range_uptodate(folio, poff, plen);
+ if (ifs) {
+ /*
+ * Hold state_lock to protect from submitting multiple
+ * bios for the same locked folio and then get multiple
+ * callbacks in parallel.
+ */
+ spin_lock_irq(&ifs->state_lock);
+ iomap_set_range_uptodate(folio, poff, plen);
+ spin_unlock_irq(&ifs->state_lock);
+ } else {
+ folio_mark_uptodate(folio);
+ }
goto done;
}
--
2.39.2
next prev parent reply other threads:[~2024-07-31 9:16 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-31 9:12 [PATCH 0/6] iomap: some minor non-critical fixes and improvements when block size < folio size Zhang Yi
2024-07-31 9:13 ` [PATCH 1/6] iomap: correct the range of a partial dirty clear Zhang Yi
2024-07-31 9:13 ` [PATCH 2/6] iomap: support invalidating partial folios Zhang Yi
2024-07-31 9:13 ` [PATCH 3/6] iomap: advance the ifs allocation if we have more than one blocks per folio Zhang Yi
2024-07-31 9:13 ` [PATCH 4/6] iomap: correct the dirty length in page mkwrite Zhang Yi
2024-07-31 9:13 ` Zhang Yi [this message]
2024-07-31 16:52 ` [PATCH 5/6] iomap: drop unnecessary state_lock when setting ifs uptodate bits Matthew Wilcox
2024-08-01 1:52 ` Zhang Yi
2024-08-01 4:24 ` Matthew Wilcox
2024-08-01 9:19 ` Zhang Yi
2024-08-02 0:05 ` Dave Chinner
2024-08-02 2:57 ` Zhang Yi
2024-08-02 6:29 ` Dave Chinner
2024-08-02 11:13 ` Zhang Yi
2024-08-05 12:42 ` Jan Kara
2024-08-05 14:00 ` Jan Kara
2024-08-05 15:48 ` Matthew Wilcox
2024-08-07 11:39 ` Zhang Yi
2024-07-31 9:13 ` [PATCH 6/6] iomap: drop unnecessary state_lock when changing ifs dirty bits Zhang Yi
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=20240731091305.2896873-6-yi.zhang@huaweicloud.com \
--to=yi.zhang@huaweicloud.com \
--cc=brauner@kernel.org \
--cc=chengzhihao1@huawei.com \
--cc=david@fromorbit.com \
--cc=djwong@kernel.org \
--cc=hch@infradead.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=yi.zhang@huawei.com \
--cc=yukuai3@huawei.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).