From: Hui Zhu KCSAN reports a data race between page_to_nid()/folio_nid() reading page->flags and folio_trylock()/folio_lock() concurrently doing test_and_set_bit_lock(PG_locked, ...) on the same word, e.g.: BUG: KCSAN: data-race in __lruvec_stat_mod_folio / shmem_get_folio_gfp The node id occupies a fixed bit-range of page->flags that is set once at page init and never modified afterwards, so it can never overlap with the low PG_locked/PG_waiters bits touched by the folio lock path. Use ASSERT_EXCLUSIVE_BITS() in memdesc_nid() to scope the exemption to just the node-id bits, consistent with how memdesc_zonenum() already handles the same class of race for the zone-id bits. Signed-off-by: Hui Zhu --- Changelog: v2: According to the comments of David, remove useless comments and use ASSERT_EXCLUSIVE_BITS() in memdesc_nid() instead of data_race() in page_to_nid(). include/linux/mm.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index 485df9c2dbdd..7518d6364a00 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2290,6 +2290,7 @@ int memdesc_nid(memdesc_flags_t mdf); #else static inline int memdesc_nid(memdesc_flags_t mdf) { + ASSERT_EXCLUSIVE_BITS(mdf.f, NODES_MASK << NODES_PGSHIFT); return (mdf.f >> NODES_PGSHIFT) & NODES_MASK; } #endif -- 2.43.0