From 86918e91b3948518949dc15325a1b2758d6966e9 Mon Sep 17 00:00:00 2001 From: Xuewei Niu Date: Tue, 12 Dec 2023 17:24:20 +0800 Subject: [PATCH] dragonball: Disable packed virtqueue for vhost-user devices The layout of packed virtqueue isn't supported by `Endpoint::negotiate()`. Communication between device and driver will be failed due to the failure of parsing virtqueue if we don't disable the packed feature. This patch fixes this issue. Fixes: #8633 Signed-off-by: Xuewei Niu --- .../dbs_virtio_devices/src/vhost/vhost_user/connection.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dragonball/src/dbs_virtio_devices/src/vhost/vhost_user/connection.rs b/src/dragonball/src/dbs_virtio_devices/src/vhost/vhost_user/connection.rs index 7eeeef1ba..afab31510 100644 --- a/src/dragonball/src/dbs_virtio_devices/src/vhost/vhost_user/connection.rs +++ b/src/dragonball/src/dbs_virtio_devices/src/vhost/vhost_user/connection.rs @@ -13,6 +13,7 @@ use vhost_rs::vhost_user::{ Error as VhostUserError, Listener as VhostUserListener, Master, VhostUserMaster, }; use vhost_rs::{VhostBackend, VhostUserMemoryRegionInfo, VringConfigData}; +use virtio_bindings::bindings::virtio_net::VIRTIO_F_RING_PACKED; use virtio_queue::QueueT; use vm_memory::{ Address, GuestAddress, GuestAddressSpace, GuestMemory, GuestMemoryRegion, MemoryRegionAddress, @@ -50,7 +51,12 @@ impl Listener { pub fn accept(&self) -> VirtioResult<(Master, u64)> { loop { match self.try_accept() { - Ok(Some((master, feature))) => return Ok((master, feature)), + Ok(Some((master, mut feature))) => { + // Disable VIRTIO_F_RING_PACKED since the layout of packed virtqueue isn't + // supported by `Endpoint::negotiate()`. + feature &= !(1 << VIRTIO_F_RING_PACKED); + return Ok((master, feature)); + } Ok(None) => continue, Err(e) => return Err(e), }