summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-08-11 11:23:37 +0000
committerAlyssa Ross <hi@alyssa.is>2021-05-11 12:19:53 +0000
commit1952e3cfa1861c5671757f505ee81c83bc821ab9 (patch)
treea6631454a88f84ab15648e370772caa3b496b612
parent0f21b0549f00c57557f0702cdde4ac95c87fe57f (diff)
downloadcrosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.tar
crosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.tar.gz
crosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.tar.bz2
crosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.tar.lz
crosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.tar.xz
crosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.tar.zst
crosvm-1952e3cfa1861c5671757f505ee81c83bc821ab9.zip
devices: vhost-user: Vring should be enabled after initialization
Based on cloud-hypervisor 97699a521fbdffd0166bc55be37c13bb6bc1949f.

> vm-virtio: vhost-user: Vring should be enabled after initialization
>
> As mentioned in the vhost-user specification, each ring is initialized
> in a stopped state. This means each ring should be enabled only after
> it has been correctly initialized.
-rw-r--r--devices/src/virtio/vhost_user/mod.rs2
-rw-r--r--devices/src/virtio/vhost_user/vu_common_ctrl.rs13
2 files changed, 4 insertions, 11 deletions
diff --git a/devices/src/virtio/vhost_user/mod.rs b/devices/src/virtio/vhost_user/mod.rs
index a4ebb6d..a032d90 100644
--- a/devices/src/virtio/vhost_user/mod.rs
+++ b/devices/src/virtio/vhost_user/mod.rs
@@ -68,8 +68,6 @@ pub enum Error {
     VhostUserSetVringKick(VhostError),
     /// Set vring enable failed.
     VhostUserSetVringEnable(VhostError),
-    /// Vhost-user setup vring failed.
-    VhostUserSetupVringFailed,
     /// Failed to create vhost eventfd.
     VhostIrqCreate(std::io::Error),
     /// Failed to read vhost eventfd.
diff --git a/devices/src/virtio/vhost_user/vu_common_ctrl.rs b/devices/src/virtio/vhost_user/vu_common_ctrl.rs
index 38b7b4f..b594b17 100644
--- a/devices/src/virtio/vhost_user/vu_common_ctrl.rs
+++ b/devices/src/virtio/vhost_user/vu_common_ctrl.rs
@@ -87,6 +87,9 @@ pub fn setup_vhost_user_vring(
 
         vu.set_vring_kick(queue_index, &queue_evts[queue_index])
             .map_err(Error::VhostUserSetVringKick)?;
+
+        vu.set_vring_enable(queue_index, true)
+            .map_err(Error::VhostUserSetVringEnable)?;
     }
 
     Ok(vu_interrupt_list)
@@ -99,17 +102,9 @@ pub fn setup_vhost_user(
     queue_evts: Vec<EventFd>,
     acked_features: u64,
 ) -> Result<Vec<(vmm_sys_util::eventfd::EventFd, Queue)>> {
-    for i in 0..queues.len() {
-        vu.set_vring_enable(i, true)
-            .map_err(Error::VhostUserSetVringEnable)?;
-    }
-
     let backend_features = vu.get_features().unwrap();
     vu.set_features(acked_features & backend_features)
         .map_err(Error::VhostUserSetFeatures)?;
 
-    match setup_vhost_user_vring(vu, mem, queues, queue_evts) {
-        Ok(vu_interrupt_list) => Ok(vu_interrupt_list),
-        Err(_) => Err(Error::VhostUserSetupVringFailed),
-    }
+    setup_vhost_user_vring(vu, mem, queues, queue_evts)
 }