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 --- 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, 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 { 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, bandwidth_limit: u64, + blocking: bool, } #[pin_data] @@ -258,11 +264,12 @@ fn new(options: NullBlkOptions<'_>) -> Result>> { 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