All of lore.kernel.org
 help / color / mirror / Atom feed
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



             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.