From: Hui Zhu <hui.zhu@linux.dev>
To: Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R\. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Cc: Hui Zhu <zhuhui@kylinos.cn>
Subject: [PATCH] mm: avoid KCSAN false positive in page_to_nid()
Date: Tue, 23 Jun 2026 15:41:57 +0800 [thread overview]
Message-ID: <20260623074157.578113-1-hui.zhu@linux.dev> (raw)
From: Hui Zhu <zhuhui@kylinos.cn>
KCSAN reports a data race between page_to_nid() reading page->flags
and folio_trylock()/folio_lock() doing test_and_set_bit_lock(PG_locked,
...) on the same word from another CPU, e.g.:
BUG: KCSAN: data-race in __lruvec_stat_mod_folio / shmem_get_folio_gfp
The node id occupies a fixed, high bit-range of page->flags that is
set once when the page is initialized and never modified afterwards,
so it can never overlap with the low PG_locked/PG_waiters bits touched
by the folio lock path. The race is therefore harmless: page_to_nid()
always returns a consistent value regardless of how the read
interleaves with the lock bit ops.
Wrap the flags read with data_race() to tell KCSAN this race is
intentional and benign, consistent with how page->page_type is
already annotated for similar packed-field accesses.
Signed-off-by: Hui Zhu <zhuhui@kylinos.cn>
---
include/linux/mm.h | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 485df9c2dbdd..122d3b39369f 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2296,7 +2296,14 @@ static inline int memdesc_nid(memdesc_flags_t mdf)
static inline int page_to_nid(const struct page *page)
{
- return memdesc_nid(PF_POISONED_CHECK(page)->flags);
+ /*
+ * The node id occupies a fixed high bit-range of page->flags
+ * that is set once at page init and never changed afterwards.
+ * It cannot overlap with the low PG_locked/PG_waiters bits
+ * that folio_lock()/folio_unlock() concurrently update, so
+ * this data race is benign.
+ */
+ return memdesc_nid(data_race(PF_POISONED_CHECK(page)->flags));
}
static inline int folio_nid(const struct folio *folio)
--
2.43.0
next reply other threads:[~2026-06-23 7:42 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-23 7:41 Hui Zhu [this message]
2026-06-23 7:59 ` [PATCH] mm: avoid KCSAN false positive in page_to_nid() David Hildenbrand (Arm)
2026-06-23 10:25 ` Lorenzo Stoakes
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=20260623074157.578113-1-hui.zhu@linux.dev \
--to=hui.zhu@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=david@kernel.org \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
--cc=zhuhui@kylinos.cn \
/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.