From 62b89552452eb48bcc1e93e89fce453d6a6a7d19 Mon Sep 17 00:00:00 2001 From: Arafatms Date: Sun, 25 Jul 2021 09:20:19 +0800 Subject: [PATCH] virtio-devices: vhost-user: Enable vrings after all queues ready The vhost-user-net backend needs to prepare all queues before enabling vring. For example, DPVGW will report 'the RX queue can't find' error, if we enable vring immediately after kicking it out. Signed-off-by: Arafatms --- .../src/vhost_user/vu_common_ctrl.rs | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/virtio-devices/src/vhost_user/vu_common_ctrl.rs b/virtio-devices/src/vhost_user/vu_common_ctrl.rs index e6d284f62..41b9ab8d7 100644 --- a/virtio-devices/src/vhost_user/vu_common_ctrl.rs +++ b/virtio-devices/src/vhost_user/vu_common_ctrl.rs @@ -163,6 +163,8 @@ impl VhostUserHandle { .map_err(Error::VhostUserSetInflight)?; } + let num_queues = queues.len() as usize; + for (queue_index, queue) in queues.into_iter().enumerate() { let actual_size: usize = queue.actual_size().try_into().unwrap(); @@ -214,12 +216,10 @@ impl VhostUserHandle { self.vu .set_vring_kick(queue_index, &queue_evts[queue_index]) .map_err(Error::VhostUserSetVringKick)?; - - self.vu - .set_vring_enable(queue_index, true) - .map_err(Error::VhostUserSetVringEnable)?; } + self.enable_vhost_user_vrings(num_queues, true)?; + if let Some(slave_req_handler) = slave_req_handler { self.vu .set_slave_request_fd(&slave_req_handler.get_tx_raw_fd()) @@ -231,14 +231,19 @@ impl VhostUserHandle { Ok(()) } - pub fn reset_vhost_user(&mut self, num_queues: usize) -> Result<()> { + fn enable_vhost_user_vrings(&mut self, num_queues: usize, enable: bool) -> Result<()> { for queue_index in 0..num_queues { - // Disable the vrings. self.vu - .set_vring_enable(queue_index, false) + .set_vring_enable(queue_index, enable) .map_err(Error::VhostUserSetVringEnable)?; } + Ok(()) + } + + pub fn reset_vhost_user(&mut self, num_queues: usize) -> Result<()> { + self.enable_vhost_user_vrings(num_queues, false)?; + // Reset the owner. self.vu.reset_owner().map_err(Error::VhostUserResetOwner) } @@ -340,23 +345,17 @@ impl VhostUserHandle { pub fn pause_vhost_user(&mut self, num_queues: usize) -> Result<()> { if self.ready { - for i in 0..num_queues { - self.vu - .set_vring_enable(i, false) - .map_err(Error::VhostUserSetVringEnable)?; - } + self.enable_vhost_user_vrings(num_queues, false)?; } + Ok(()) } pub fn resume_vhost_user(&mut self, num_queues: usize) -> Result<()> { if self.ready { - for i in 0..num_queues { - self.vu - .set_vring_enable(i, true) - .map_err(Error::VhostUserSetVringEnable)?; - } + self.enable_vhost_user_vrings(num_queues, true)?; } + Ok(()) } }