Using `InPlaceModule` avoids an allocation and an indirection. Signed-off-by: Benoît du Garreau <benoit@xxxxxxxxxxxx> --- drivers/block/rnull.rs | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/drivers/block/rnull.rs b/drivers/block/rnull.rs index 5de7223beb4d5b4224010c86fca826967a019c27..6cdd2589c4621369cd57af66a2b817889321ed15 100644 --- a/drivers/block/rnull.rs +++ b/drivers/block/rnull.rs @@ -31,25 +31,31 @@ license: "GPL v2", } +#[pin_data] struct NullBlkModule { - _disk: Pin<KBox<Mutex<GenDisk<NullBlkDevice>>>>, + #[pin] + _disk: Mutex<GenDisk<NullBlkDevice>>, } -impl kernel::Module for NullBlkModule { - fn init(_module: &'static ThisModule) -> Result<Self> { +impl kernel::InPlaceModule for NullBlkModule { + fn init(_module: &'static ThisModule) -> impl PinInit<Self, Error> { pr_info!("Rust null_blk loaded\n"); - let tagset = Arc::pin_init(TagSet::new(1, 256, 1), flags::GFP_KERNEL)?; - let disk = gen_disk::GenDiskBuilder::new() - .capacity_sectors(4096 << 11) - .logical_block_size(4096)? - .physical_block_size(4096)? - .rotational(false) - .build(format_args!("rnullb{}", 0), tagset)?; + // Use a immediately-called closure as a stable `try` block + let disk = /* try */ (|| { + let tagset = Arc::pin_init(TagSet::new(1, 256, 1), flags::GFP_KERNEL)?; - let disk = KBox::pin_init(new_mutex!(disk, "nullb:disk"), flags::GFP_KERNEL)?; + gen_disk::GenDiskBuilder::new() + .capacity_sectors(4096 << 11) + .logical_block_size(4096)? + .physical_block_size(4096)? + .rotational(false) + .build(format_args!("rnullb{}", 0), tagset) + })(); - Ok(Self { _disk: disk }) + try_pin_init!(Self { + _disk <- new_mutex!(disk?, "nullb:disk"), + }) } } --- base-commit: 4d6f8ba6e0a7b0627b4a559747948ee0d6797a3a change-id: 20241203-rnull_in_place-5e0b73d8300c Best regards, -- Benoît du Garreau <benoit@xxxxxxxxxxxx>