[PATCH v2 19/83] block: rust: allow specifying home node when constructing `TagSet`
From: Andreas Hindborg
Date: Tue Jun 09 2026 - 15:35:06 EST
Add a `numa_node` parameter to `TagSet::new` to specify the home NUMA
node for tag set allocations. This allows drivers to optimize memory
placement for NUMA systems.
Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx>
---
drivers/block/rnull/rnull.rs | 11 ++++++++++-
rust/kernel/block/mq.rs | 5 ++++-
rust/kernel/block/mq/tag_set.rs | 4 +++-
3 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/drivers/block/rnull/rnull.rs b/drivers/block/rnull/rnull.rs
index 30de022146ec..6323327d4a5a 100644
--- a/drivers/block/rnull/rnull.rs
+++ b/drivers/block/rnull/rnull.rs
@@ -174,7 +174,16 @@ fn new(options: NullBlkOptions<'_>) -> Result<GenDisk<Self>> {
mq::tag_set::Flags::default()
};
- let tagset = Arc::pin_init(TagSet::new(submit_queues, 256, 1, flags), GFP_KERNEL)?;
+ let tagset = Arc::pin_init(
+ TagSet::new(
+ submit_queues,
+ 256,
+ 1,
+ kernel::alloc::NumaNode::NO_NODE,
+ flags,
+ ),
+ GFP_KERNEL,
+ )?;
let queue_data = Box::pin_init(
pin_init!(QueueData {
diff --git a/rust/kernel/block/mq.rs b/rust/kernel/block/mq.rs
index e556b3bb1191..bac15b509d90 100644
--- a/rust/kernel/block/mq.rs
+++ b/rust/kernel/block/mq.rs
@@ -57,6 +57,7 @@
//!
//! ```rust
//! use kernel::{
+//! alloc::NumaNode,
//! block::mq::{self, *},
//! new_mutex,
//! prelude::*,
@@ -92,7 +93,9 @@
//! }
//!
//! let tagset: Arc<TagSet<MyBlkDevice>> =
-//! Arc::pin_init(TagSet::new(1, 256, 1, mq::tag_set::Flags::default()), GFP_KERNEL)?;
+//! Arc::pin_init(
+//! TagSet::new(1, 256, 1, NumaNode::NO_NODE, mq::tag_set::Flags::default()),
+//! GFP_KERNEL)?;
//! let mut disk = gen_disk::GenDiskBuilder::new()
//! .capacity_sectors(4096)
//! .build(fmt!("myblk"), tagset, ())?;
diff --git a/rust/kernel/block/mq/tag_set.rs b/rust/kernel/block/mq/tag_set.rs
index 5b1a5bcc978d..d6d104adf4aa 100644
--- a/rust/kernel/block/mq/tag_set.rs
+++ b/rust/kernel/block/mq/tag_set.rs
@@ -7,6 +7,7 @@
use core::pin::Pin;
use crate::{
+ alloc::NumaNode,
bindings,
block::mq::{
operations::OperationsVTable,
@@ -57,6 +58,7 @@ pub fn new(
nr_hw_queues: u32,
num_tags: u32,
num_maps: u32,
+ numa_node: NumaNode,
flags: Flags,
) -> impl PinInit<Self, error::Error> {
let tag_set: bindings::blk_mq_tag_set = pin_init::zeroed();
@@ -67,7 +69,7 @@ pub fn new(
ops: OperationsVTable::<T>::build(),
nr_hw_queues,
timeout: 0, // 0 means default which is 30Hz in C
- numa_node: bindings::NUMA_NO_NODE,
+ numa_node: numa_node.id(),
queue_depth: num_tags,
cmd_size,
flags: flags.into(),
--
2.51.2