From c366efc19e05c26288c3b260909f4c1593b4d4db Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 18 Jan 2021 13:55:37 +0000 Subject: [PATCH] virtio-devices: block, block_io_uring: Don't assume max queue count Don't assume that the number of queues provided match the number of queues offered. The virtio spec allows the driver to program fewer queues. Signed-off-by: Rob Bradford --- virtio-devices/src/block.rs | 5 +++-- virtio-devices/src/block_io_uring.rs | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 05e3bc3a2..84da8f0fa 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -444,8 +444,9 @@ impl VirtioDevice for Block { self.update_writeback(); let mut epoll_threads = Vec::new(); - for i in 0..self.common.queue_sizes.len() { + for i in 0..queues.len() { let queue_evt = queue_evts.remove(0); + let queue = queues.remove(0); let kill_evt = self .common .kill_evt @@ -467,7 +468,7 @@ impl VirtioDevice for Block { ActivateError::BadActivate })?; let mut handler = BlockEpollHandler { - queue: queues.remove(0), + queue, mem: mem.clone(), disk_image: self.disk_image.clone(), disk_nsectors: self.disk_nsectors, diff --git a/virtio-devices/src/block_io_uring.rs b/virtio-devices/src/block_io_uring.rs index 2d795cb2a..43653b7b2 100644 --- a/virtio-devices/src/block_io_uring.rs +++ b/virtio-devices/src/block_io_uring.rs @@ -493,9 +493,10 @@ impl VirtioDevice for BlockIoUring { self.update_writeback(); let mut epoll_threads = Vec::new(); - for i in 0..self.common.queue_sizes.len() { - let queue_size = self.common.queue_sizes[i] as usize; + for i in 0..queues.len() { let queue_evt = queue_evts.remove(0); + let queue = queues.remove(0); + let queue_size = queue.size; let io_uring = IoUring::new(queue_size as u32).map_err(|e| { error!("failed to create io_uring instance: {}", e); ActivateError::BadActivate @@ -522,7 +523,7 @@ impl VirtioDevice for BlockIoUring { })?; let mut handler = BlockIoUringEpollHandler { - queue: queues.remove(0), + queue, mem: mem.clone(), disk_image_fd: self.disk_image.as_raw_fd(), disk_nsectors: self.disk_nsectors, @@ -538,7 +539,7 @@ impl VirtioDevice for BlockIoUring { error!("failed to create io_uring eventfd: {}", e); ActivateError::BadActivate })?, - request_list: HashMap::with_capacity(queue_size), + request_list: HashMap::with_capacity(queue_size.into()), }; let paused = self.common.paused.clone();