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 --- 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> { 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> = -//! 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 { let tag_set: bindings::blk_mq_tag_set = pin_init::zeroed(); @@ -67,7 +69,7 @@ pub fn new( ops: OperationsVTable::::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