diff options
| author | Andreas Hindborg <a.hindborg@kernel.org> | 2025-09-02 11:55:11 +0200 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-09-02 05:23:56 -0600 |
| commit | 34585dc649fb255b40075dab56af063c1bfc9933 (patch) | |
| tree | f724d0e44a62ac226fd11cd70bd98e0696e02f56 /drivers/block/rnull/rnull.rs | |
| parent | rust: block: add remote completion to `Request` (diff) | |
| download | linux-34585dc649fb255b40075dab56af063c1bfc9933.tar.gz linux-34585dc649fb255b40075dab56af063c1bfc9933.zip | |
rnull: add soft-irq completion support
rnull currently only supports direct completion. Add option for completing
requests across CPU nodes via soft IRQ or IPI.
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
Link: https://lore.kernel.org/r/20250902-rnull-up-v6-16-v7-17-b5212cc89b98@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block/rnull/rnull.rs')
| -rw-r--r-- | drivers/block/rnull/rnull.rs | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/block/rnull/rnull.rs b/drivers/block/rnull/rnull.rs index a19c55717c4f..1ec694d7f1a6 100644 --- a/drivers/block/rnull/rnull.rs +++ b/drivers/block/rnull/rnull.rs @@ -4,6 +4,7 @@ mod configfs; +use configfs::IRQMode; use kernel::{ block::{ self, @@ -53,35 +54,44 @@ impl NullBlkDevice { block_size: u32, rotational: bool, capacity_mib: u64, + irq_mode: IRQMode, ) -> Result<GenDisk<Self>> { let tagset = Arc::pin_init(TagSet::new(1, 256, 1), GFP_KERNEL)?; + let queue_data = Box::new(QueueData { irq_mode }, GFP_KERNEL)?; + gen_disk::GenDiskBuilder::new() .capacity_sectors(capacity_mib << (20 - block::SECTOR_SHIFT)) .logical_block_size(block_size)? .physical_block_size(block_size)? .rotational(rotational) - .build(fmt!("{}", name.to_str()?), tagset, ()) + .build(fmt!("{}", name.to_str()?), tagset, queue_data) } } +struct QueueData { + irq_mode: IRQMode, +} + #[vtable] impl Operations for NullBlkDevice { - type QueueData = (); + type QueueData = KBox<QueueData>; #[inline(always)] - fn queue_rq(_queue_data: (), rq: ARef<mq::Request<Self>>, _is_last: bool) -> Result { - mq::Request::end_ok(rq) - .map_err(|_e| kernel::error::code::EIO) - // We take no refcounts on the request, so we expect to be able to - // end the request. The request reference must be unique at this - // point, and so `end_ok` cannot fail. - .expect("Fatal error - expected to be able to end request"); - + fn queue_rq(queue_data: &QueueData, rq: ARef<mq::Request<Self>>, _is_last: bool) -> Result { + match queue_data.irq_mode { + IRQMode::None => mq::Request::end_ok(rq) + .map_err(|_e| kernel::error::code::EIO) + // We take no refcounts on the request, so we expect to be able to + // end the request. The request reference must be unique at this + // point, and so `end_ok` cannot fail. + .expect("Fatal error - expected to be able to end request"), + IRQMode::Soft => mq::Request::complete(rq), + } Ok(()) } - fn commit_rqs(_queue_data: ()) {} + fn commit_rqs(_queue_data: &QueueData) {} fn complete(rq: ARef<mq::Request<Self>>) { mq::Request::end_ok(rq) |
