[PATCH v2 45/83] block: rnull: add blocking queue mode
From: Andreas Hindborg
Date: Tue Jun 09 2026 - 15:13:53 EST
Add support for blocking queue mode via the `blocking` configfs
attribute. When enabled, the tag set is created with the
`BLK_MQ_F_BLOCKING` flag.
Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxx>
---
drivers/block/rnull/configfs.rs | 7 ++++++-
drivers/block/rnull/rnull.rs | 9 ++++++++-
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/drivers/block/rnull/configfs.rs b/drivers/block/rnull/configfs.rs
index 59217d75f46b..5e6bcf9d31d8 100644
--- a/drivers/block/rnull/configfs.rs
+++ b/drivers/block/rnull/configfs.rs
@@ -69,7 +69,7 @@ impl AttributeOperations<0> for Config {
let mut writer = kernel::str::Formatter::new(page);
writer.write_str(
"blocksize,size,rotational,irqmode,completion_nsec,memory_backed,\
- submit_queues,use_per_node_hctx\n",
+ submit_queues,use_per_node_hctx,discard,blocking\n",
)?;
Ok(writer.bytes_written())
}
@@ -105,6 +105,7 @@ fn make_group(
badblocks_partial_io: 14,
cache_size_mib: 15,
mbps: 16,
+ blocking: 17,
],
};
@@ -137,6 +138,7 @@ fn make_group(
)?,
cache_size_mib: 0,
mbps: 0,
+ blocking: false,
}),
}),
core::iter::empty(),
@@ -212,6 +214,7 @@ struct DeviceConfigInner {
cache_size_mib: u64,
disk_storage: Arc<DiskStorage>,
mbps: u32,
+ blocking: bool,
}
#[vtable]
@@ -252,6 +255,7 @@ fn store(this: &DeviceConfig, page: &[u8]) -> Result {
bad_blocks_partial_io: guard.bad_blocks_partial_io,
storage: guard.disk_storage.clone(),
bandwidth_limit: u64::from(guard.mbps) * 2u64.pow(20),
+ blocking: guard.blocking,
})?);
guard.powered = true;
} else if guard.powered && !power_op {
@@ -422,3 +426,4 @@ fn store(this: &DeviceConfig, page: &[u8]) -> Result {
);
configfs_simple_field!(DeviceConfig, 16, mbps, u32);
+configfs_simple_bool_field!(DeviceConfig, 17, blocking);
diff --git a/drivers/block/rnull/rnull.rs b/drivers/block/rnull/rnull.rs
index 1dda8d717b95..181fce551a91 100644
--- a/drivers/block/rnull/rnull.rs
+++ b/drivers/block/rnull/rnull.rs
@@ -139,6 +139,10 @@
default: 0,
description: "Max bandwidth in MiB/s. 0 means no limit.",
},
+ blocking: bool {
+ default: false,
+ description: "Register as a blocking blk-mq driver device",
+ },
},
}
@@ -185,6 +189,7 @@ fn init(_module: &'static ThisModule) -> impl PinInit<Self, Error> {
bad_blocks_partial_io: false,
storage: Arc::pin_init(DiskStorage::new(0, block_size as usize), GFP_KERNEL)?,
bandwidth_limit: u64::from(module_parameters::mbps.value()) * 2u64.pow(20),
+ blocking: module_parameters::blocking.value(),
})?;
disks.push(disk, GFP_KERNEL)?;
}
@@ -216,6 +221,7 @@ struct NullBlkOptions<'a> {
bad_blocks_partial_io: bool,
storage: Arc<DiskStorage>,
bandwidth_limit: u64,
+ blocking: bool,
}
#[pin_data]
@@ -258,11 +264,12 @@ fn new(options: NullBlkOptions<'_>) -> Result<Arc<GenDisk<Self>>> {
bad_blocks_partial_io,
storage,
bandwidth_limit,
+ blocking,
} = options;
let mut flags = mq::tag_set::Flags::default();
- if memory_backed {
+ if blocking || memory_backed {
flags |= mq::tag_set::Flag::Blocking;
}
--
2.51.2