[PATCH 62/79] block: rust: add `TagSet::update_hw_queue_count`

Andreas Hindborg
2026-02-15T23:42:48Z

Add a method to `TagSet` that allows changing the number of hardware queues
dynamically.

Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
---
rust/kernel/block/mq/tag_set.rs | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/rust/kernel/block/mq/tag_set.rs b/rust/kernel/block/mq/tag_set.rs
index 4d00979a83dbd..47a162360e628 100644
--- a/rust/kernel/block/mq/tag_set.rs
+++ b/rust/kernel/block/mq/tag_set.rs
@@ -8,6 +8,7 @@
bindings,
block::mq::{operations::OperationsVTable, request::RequestDataWrapper, Operations},
error::{self, Result},
+ prelude::*,
try_pin_init,
types::{ForeignOwnable, Opaque},
};
@@ -34,7 +35,7 @@ pub struct TagSet<T: Operations> {
}

impl<T: Operations> TagSet<T> {
- /// Try to create a new tag set
+ /// Try to create a new tag se }t
pub fn new(
nr_hw_queues: u32,
tagset_data: T::TagSetData,
@@ -142,6 +143,20 @@ pub fn hw_queue_count(&self) -> u32 {
unsafe { (*self.inner.get()).nr_hw_queues }
}

+ /// Update the number of hardware queues for this tag set.
+ ///
+ /// This operation may fail if memory for tags cannot be allocated.
+ pub fn update_hw_queue_count(&self, nr_hw_queues: u32) -> Result {
+ // SAFETY: blk_mq_update_nr_hw_queues applies internal synchronization.
+ unsafe { bindings::blk_mq_update_nr_hw_queues(self.inner.get(), nr_hw_queues) }
+
+ if self.hw_queue_count() == nr_hw_queues {
+ Ok(())
+ } else {
+ Err(ENOMEM)
+ }
+ }
+
/// Borrow the [`T::TagSetData`] associated with this tag set.
pub fn data(&self) -> <T::TagSetData as ForeignOwnable>::Borrowed<'_> {
// SAFETY: By type invariant, `self.inner` is valid.

--
2.51.2