Re: [PATCH v2 2/2] rust: add a wrapper for the `nr_online_nodes` C function
From: Gary Guo
Date: Mon Jun 08 2026 - 07:58:08 EST
On Mon Jun 8, 2026 at 12:52 PM BST, Andreas Hindborg wrote:
> "Gary Guo" <gary@xxxxxxxxxxx> writes:
>
>> On Fri Jun 5, 2026 at 1:54 PM BST, Andreas Hindborg wrote:
>>> This function returns the number of online NUMA nodes.
>>>
>>> The wrapper is needed by the Rust null block driver.
>>>
>>> Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx>
>>> ---
>>> rust/kernel/lib.rs | 1 +
>>> rust/kernel/numa.rs | 19 +++++++++++++++++++
>>> 2 files changed, 20 insertions(+)
>>>
>>> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
>>> index b72b2fbe046d..00713b2adcac 100644
>>> --- a/rust/kernel/lib.rs
>>> +++ b/rust/kernel/lib.rs
>>> @@ -97,6 +97,7 @@
>>> #[cfg(CONFIG_NET)]
>>> pub mod net;
>>> pub mod num;
>>> +pub mod numa;
>>> pub mod of;
>>> #[cfg(CONFIG_PM_OPP)]
>>> pub mod opp;
>>> diff --git a/rust/kernel/numa.rs b/rust/kernel/numa.rs
>>> new file mode 100644
>>> index 000000000000..760db072a6c1
>>> --- /dev/null
>>> +++ b/rust/kernel/numa.rs
>>> @@ -0,0 +1,19 @@
>>> +// SPDX-License-Identifier: GPL-2.0
>>> +
>>> +//! NUMA topology utilities.
>>> +//!
>>> +//! C header: [`include/linux/nodemask.h`](srctree/include/linux/nodemask.h)
>>> +
>>> +use crate::bindings;
>>> +
>>> +/// Returns the number of online NUMA nodes.
>>> +#[inline]
>>> +pub fn num_online_nodes() -> u32 {
>>> + // NOTE: In some configurations, we can read this variable without an unsafe block.
>>> + // SAFETY: When NUMA is enabled, this is a global mutable static. We do as C and just read it,
>>> + // even though it might race.
>>
>> Can we do better and do a relaxed load instead?
>
> Yes, that sounds reasonable.
>
> But what are the semantics of a relaxed load when other writers are not
> using atomic primitives? Does it make a difference?
This is the whole CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC again.
Technically not okay, but this happens common in C code that people can choose
to ignore it :)
But let's not advocate for that in Rust code.
Best,
Gary