From: <gregkh@linuxfoundation.org>
To: gregkh@linuxfoundation.org,hsiangkao@linux.alibaba.com,jan.kiszka@siemens.com,linux-erofs@lists.ozlabs.org,s.kerkmann@pengutronix.de
Cc: <stable-commits@vger.kernel.org>
Subject: Patch "erofs: address D-cache aliasing" has been added to the 6.1-stable tree
Date: Wed, 30 Jul 2025 10:55:13 +0200 [thread overview]
Message-ID: <2025073013-tried-democrat-cb97@gregkh> (raw)
In-Reply-To: <20250722100029.3052177-6-hsiangkao@linux.alibaba.com>
This is a note to let you know that I've just added the patch titled
erofs: address D-cache aliasing
to the 6.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
erofs-address-d-cache-aliasing.patch
and it can be found in the queue-6.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.
From hsiangkao@linux.alibaba.com Tue Jul 22 12:00:48 2025
From: Gao Xiang <hsiangkao@linux.alibaba.com>
Date: Tue, 22 Jul 2025 18:00:29 +0800
Subject: erofs: address D-cache aliasing
To: stable@vger.kernel.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Jan Kiszka <jan.kiszka@siemens.com>, Stefan Kerkmann <s.kerkmann@pengutronix.de>
Cc: linux-erofs@lists.ozlabs.org, LKML <linux-kernel@vger.kernel.org>, Gao Xiang <hsiangkao@linux.alibaba.com>
Message-ID: <20250722100029.3052177-6-hsiangkao@linux.alibaba.com>
From: Gao Xiang <hsiangkao@linux.alibaba.com>
commit 27917e8194f91dffd8b4825350c63cb68e98ce58 upstream.
Flush the D-cache before unlocking folios for compressed inodes, as
they are dirtied during decompression.
Avoid calling flush_dcache_folio() on every CPU write, since it's more
like playing whack-a-mole without real benefit.
It has no impact on x86 and arm64/risc-v: on x86, flush_dcache_folio()
is a no-op, and on arm64/risc-v, PG_dcache_clean (PG_arch_1) is clear
for new page cache folios. However, certain ARM boards are affected,
as reported.
Fixes: 3883a79abd02 ("staging: erofs: introduce VLE decompression support")
Closes: https://lore.kernel.org/r/c1e51e16-6cc6-49d0-a63e-4e9ff6c4dd53@pengutronix.de
Closes: https://lore.kernel.org/r/38d43fae-1182-4155-9c5b-ffc7382d9917@siemens.com
Tested-by: Jan Kiszka <jan.kiszka@siemens.com>
Tested-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>
Link: https://lore.kernel.org/r/20250709034614.2780117-2-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
fs/erofs/decompressor.c | 6 ++----
fs/erofs/zdata.c | 32 +++++++++++++++++++-------------
2 files changed, 21 insertions(+), 17 deletions(-)
--- a/fs/erofs/decompressor.c
+++ b/fs/erofs/decompressor.c
@@ -342,14 +342,12 @@ static int z_erofs_transform_plain(struc
if (outpages > inpages) {
DBG_BUGON(!rq->out[outpages - 1]);
- if (rq->out[outpages - 1] != rq->in[inpages - 1]) {
+ if (rq->out[outpages - 1] != rq->in[inpages - 1])
memcpy_to_page(rq->out[outpages - 1], 0, src +
(interlaced_offset ? 0 : righthalf),
lefthalf);
- } else if (!interlaced_offset) {
+ else if (!interlaced_offset)
memmove(src, src + righthalf, lefthalf);
- flush_dcache_page(rq->in[inpages - 1]);
- }
}
kunmap_local(src);
return 0;
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -123,9 +123,11 @@ static inline unsigned int z_erofs_pclus
/*
* bit 30: I/O error occurred on this page
+ * bit 29: CPU has dirty data in D-cache (needs aliasing handling);
* bit 0 - 29: remaining parts to complete this page
*/
-#define Z_EROFS_PAGE_EIO (1 << 30)
+#define Z_EROFS_ONLINEPAGE_EIO 30
+#define Z_EROFS_ONLINEPAGE_DIRTY 29
static inline void z_erofs_onlinepage_init(struct page *page)
{
@@ -144,7 +146,7 @@ static inline void z_erofs_onlinepage_sp
atomic_inc((atomic_t *)&page->private);
}
-static void z_erofs_onlinepage_endio(struct page *page, int err)
+static void z_erofs_onlinepage_end(struct page *page, int err, bool dirty)
{
int orig, v;
@@ -152,16 +154,20 @@ static void z_erofs_onlinepage_endio(str
do {
orig = atomic_read((atomic_t *)&page->private);
- v = (orig - 1) | (err ? Z_EROFS_PAGE_EIO : 0);
+ DBG_BUGON(orig <= 0);
+ v = dirty << Z_EROFS_ONLINEPAGE_DIRTY;
+ v |= (orig - 1) | (!!err << Z_EROFS_ONLINEPAGE_EIO);
} while (atomic_cmpxchg((atomic_t *)&page->private, orig, v) != orig);
- if (!(v & ~Z_EROFS_PAGE_EIO)) {
- set_page_private(page, 0);
- ClearPagePrivate(page);
- if (!(v & Z_EROFS_PAGE_EIO))
- SetPageUptodate(page);
- unlock_page(page);
- }
+ if (v & (BIT(Z_EROFS_ONLINEPAGE_DIRTY) - 1))
+ return;
+ set_page_private(page, 0);
+ ClearPagePrivate(page);
+ if (v & BIT(Z_EROFS_ONLINEPAGE_DIRTY))
+ flush_dcache_page(page);
+ if (!(v & BIT(Z_EROFS_ONLINEPAGE_EIO)))
+ SetPageUptodate(page);
+ unlock_page(page);
}
#define Z_EROFS_ONSTACK_PAGES 32
@@ -925,7 +931,7 @@ next_part:
goto repeat;
out:
- z_erofs_onlinepage_endio(page, err);
+ z_erofs_onlinepage_end(page, err, false);
return err;
}
@@ -1028,7 +1034,7 @@ static void z_erofs_fill_other_copies(st
cur += len;
}
kunmap_local(dst);
- z_erofs_onlinepage_endio(bvi->bvec.page, err);
+ z_erofs_onlinepage_end(bvi->bvec.page, err, true);
list_del(p);
kfree(bvi);
}
@@ -1196,7 +1202,7 @@ out:
/* recycle all individual short-lived pages */
if (z_erofs_put_shortlivedpage(be->pagepool, page))
continue;
- z_erofs_onlinepage_endio(page, err);
+ z_erofs_onlinepage_end(page, err, true);
}
if (be->decompressed_pages != be->onstack_pages)
Patches currently in stable-queue which might be from hsiangkao@linux.alibaba.com are
queue-6.1/erofs-sunset-erofs_dbg.patch
queue-6.1/erofs-simplify-z_erofs_transform_plain.patch
queue-6.1/erofs-get-rid-of-debug_one_dentry.patch
queue-6.1/erofs-drop-z_erofs_page_mark_eio.patch
queue-6.1/erofs-address-d-cache-aliasing.patch
prev parent reply other threads:[~2025-07-30 8:55 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-22 10:00 [PATCH 6.1.y 0/5] erofs: backport for `erofs: address D-cache aliasing` Gao Xiang
2025-07-22 10:00 ` [PATCH 6.1.y 1/5] erofs: get rid of debug_one_dentry() Gao Xiang
2025-07-23 4:34 ` Sasha Levin
2025-07-30 8:55 ` Patch "erofs: get rid of debug_one_dentry()" has been added to the 6.1-stable tree gregkh
2025-07-22 10:00 ` [PATCH 6.1.y 2/5] erofs: sunset erofs_dbg() Gao Xiang
2025-07-23 4:34 ` Sasha Levin
2025-07-30 8:55 ` Patch "erofs: sunset erofs_dbg()" has been added to the 6.1-stable tree gregkh
2025-07-22 10:00 ` [PATCH 6.1.y 3/5] erofs: drop z_erofs_page_mark_eio() Gao Xiang
2025-07-23 4:34 ` Sasha Levin
2025-07-30 8:55 ` Patch "erofs: drop z_erofs_page_mark_eio()" has been added to the 6.1-stable tree gregkh
2025-07-22 10:00 ` [PATCH 6.1.y 4/5] erofs: simplify z_erofs_transform_plain() Gao Xiang
2025-07-23 4:34 ` Sasha Levin
2025-07-30 8:55 ` Patch "erofs: simplify z_erofs_transform_plain()" has been added to the 6.1-stable tree gregkh
2025-07-22 10:00 ` [PATCH 6.1.y 5/5] erofs: address D-cache aliasing Gao Xiang
2025-07-23 4:34 ` Sasha Levin
2025-07-30 8:55 ` gregkh [this message]
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=2025073013-tried-democrat-cb97@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=hsiangkao@linux.alibaba.com \
--cc=jan.kiszka@siemens.com \
--cc=linux-erofs@lists.ozlabs.org \
--cc=s.kerkmann@pengutronix.de \
--cc=stable-commits@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.