From bb06db93ce405a2171bc2916202bbc22588db73b Mon Sep 17 00:00:00 2001 From: R Aadarsh Date: Fri, 10 Jul 2026 15:39:54 +0530 Subject: [PATCH] Add support for querying numa info from userspace --- src/numa.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/scheme/sys/mod.rs | 2 ++ 2 files changed, 40 insertions(+) diff --git a/src/numa.rs b/src/numa.rs index 1102842226..4844ed8ff7 100644 --- a/src/numa.rs +++ b/src/numa.rs @@ -9,6 +9,7 @@ use alloc::{sync::Arc, vec::Vec}; use hashbrown::HashMap; use rmm::{Arch, BumpAllocator, MemoryArea, PhysicalAddress}; use spin::once::Once; +use syscall::{Error, Result, ENODATA, EOPNOTSUPP}; pub const MAX_DOMAINS: usize = 128; @@ -184,3 +185,40 @@ pub fn nearest_preceding_memory_region(addr: usize, overlap: bool) -> Option<&'s }) .max_by_key(|e| e.start) } + +pub fn get_numa_info(token: &mut CleanLockToken) -> Result> { + let cpu_info = NUMA_CPUS + .get() + .ok_or(Error::new(EOPNOTSUPP))? + .iter() + .map(|e| e.to_ne_bytes()) + .flatten() + .collect::>(); + let mem_info = NUMA_MEMORY + .get() + .ok_or(Error::new(EOPNOTSUPP))? + .iter() + .map(|e| { + [ + e.start.to_ne_bytes(), + e.length.to_ne_bytes(), + (e.node_id as usize).to_ne_bytes(), + ] + }) + .flatten() + .flatten() + .collect::>(); + let mut numa_info = Vec::new(); + numa_info.extend(cpu_info); + numa_info.extend(mem_info); + Ok(numa_info) +} + +pub fn get_numa_distance_info(token: &mut CleanLockToken) -> Result> { + Ok(DISTANCES + .get() + .ok_or(Error::new(ENODATA))? + .iter() + .map(|e| *e) + .collect()) +} diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index fa44c95cbb..85aee697c1 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -76,6 +76,8 @@ const FILES: &[(&str, Kind)] = &[ ("iostat", Rd(iostat::resource)), ("irq", Rd(irq::resource)), ("log", Rd(log::resource)), + ("numa", Rd(crate::numa::get_numa_info)), + ("numa_dist", Rd(crate::numa::get_numa_distance_info)), ("syscall", Rd(syscall::resource)), ("uname", Rd(uname::resource)), ("env", Rd(|_| Ok(Vec::from(crate::startup::init_env())))),