From 05cd8b2ad3c7bb1a84f15b629711d1886b97b7ce Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 16 Mar 2021 07:02:11 +0000 Subject: build(deps): bump rust-vmm-ci from `ebc7016` to `24d66cd` Bumps [rust-vmm-ci](https://github.com/rust-vmm/rust-vmm-ci) from `ebc7016` to `24d66cd`. - [Release notes](https://github.com/rust-vmm/rust-vmm-ci/releases) - [Commits](https://github.com/rust-vmm/rust-vmm-ci/compare/ebc701641fa57f78d03f3f5ecac617b7bf7470b4...24d66cdae63d4aa7f8de01b616c015b97604a116) Signed-off-by: dependabot-preview[bot] --- rust-vmm-ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-vmm-ci b/rust-vmm-ci index ebc7016..24d66cd 160000 --- a/rust-vmm-ci +++ b/rust-vmm-ci @@ -1 +1 @@ -Subproject commit ebc701641fa57f78d03f3f5ecac617b7bf7470b4 +Subproject commit 24d66cdae63d4aa7f8de01b616c015b97604a116 -- cgit v1.2.3 From 88aafc03a8a10b163e49657101e7342005b23d61 Mon Sep 17 00:00:00 2001 From: Dylan Reid Date: Tue, 16 Mar 2021 16:46:21 -0700 Subject: vhost_user: config offset matches qemu Modify the interpretation of the set and get config offset field to match qemu. The wording in the vhost user spec is ambiguous, bet lets defer to qemu's implementation so vhost based devices can be used with qemu as a VMM. Fixes #29. Signed-off-by: Dylan Reid Change-Id: Ib1b909d02c3b7dab1964799f0a4d960f1ef308fa --- src/vhost_user/master.rs | 12 ++++++++---- src/vhost_user/message.rs | 20 ++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/vhost_user/master.rs b/src/vhost_user/master.rs index 227f1d7..6833684 100644 --- a/src/vhost_user/master.rs +++ b/src/vhost_user/master.rs @@ -874,10 +874,14 @@ mod tests { } master - .set_config(0x100, VhostUserConfigFlags::WRITABLE, &buf[0..4]) + .set_config(0, VhostUserConfigFlags::WRITABLE, &buf[0..4]) .unwrap(); master - .set_config(0x0, VhostUserConfigFlags::WRITABLE, &buf[0..4]) + .set_config( + VHOST_USER_CONFIG_SIZE, + VhostUserConfigFlags::WRITABLE, + &buf[0..4], + ) .unwrap_err(); master .set_config(0x1000, VhostUserConfigFlags::WRITABLE, &buf[0..4]) @@ -890,10 +894,10 @@ mod tests { ) .unwrap_err(); master - .set_config(0x100, VhostUserConfigFlags::WRITABLE, &buf) + .set_config(VHOST_USER_CONFIG_SIZE, VhostUserConfigFlags::WRITABLE, &buf) .unwrap_err(); master - .set_config(0x100, VhostUserConfigFlags::WRITABLE, &[]) + .set_config(VHOST_USER_CONFIG_SIZE, VhostUserConfigFlags::WRITABLE, &[]) .unwrap_err(); } diff --git a/src/vhost_user/message.rs b/src/vhost_user/message.rs index ea2df4e..32b2f8c 100644 --- a/src/vhost_user/message.rs +++ b/src/vhost_user/message.rs @@ -657,14 +657,13 @@ impl VhostUserConfig { impl VhostUserMsgValidator for VhostUserConfig { #[allow(clippy::if_same_then_else)] fn is_valid(&self) -> bool { + let end_addr = match self.size.checked_add(self.offset) { + Some(addr) => addr, + None => return false, + }; if (self.flags & !VhostUserConfigFlags::all().bits()) != 0 { return false; - } else if self.offset < 0x100 { - return false; - } else if self.size == 0 - || self.size > VHOST_USER_CONFIG_SIZE - || self.size + self.offset > VHOST_USER_CONFIG_SIZE - { + } else if self.size == 0 || end_addr > VHOST_USER_CONFIG_SIZE { return false; } true @@ -997,18 +996,15 @@ mod tests { #[test] fn check_user_config_msg() { - let mut msg = VhostUserConfig::new( - VHOST_USER_CONFIG_OFFSET, - VHOST_USER_CONFIG_SIZE - VHOST_USER_CONFIG_OFFSET, - VhostUserConfigFlags::WRITABLE, - ); + let mut msg = + VhostUserConfig::new(0, VHOST_USER_CONFIG_SIZE, VhostUserConfigFlags::WRITABLE); assert!(msg.is_valid()); msg.size = 0; assert!(!msg.is_valid()); msg.size = 1; assert!(msg.is_valid()); - msg.offset = 0; + msg.offset = u32::MAX; assert!(!msg.is_valid()); msg.offset = VHOST_USER_CONFIG_SIZE; assert!(!msg.is_valid()); -- cgit v1.2.3 From 0e9fed2d75fe85aefb7bc8d0aea7d515b39316f0 Mon Sep 17 00:00:00 2001 From: Stefano Garzarella Date: Wed, 24 Mar 2021 17:00:53 +0100 Subject: Fix typos in the error messages Replace 'virtque' with 'virtqueue' and 'talbe' with 'table'. Signed-off-by: Stefano Garzarella --- src/lib.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b7ed15c..83d8782 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -85,11 +85,13 @@ impl std::fmt::Display for Error { Error::InvalidOperation => write!(f, "invalid vhost operations"), Error::InvalidGuestMemory => write!(f, "invalid guest memory object"), Error::InvalidGuestMemoryRegion => write!(f, "invalid guest memory region"), - Error::InvalidQueue => write!(f, "invalid virtque"), - Error::DescriptorTableAddress => write!(f, "invalid virtque descriptor talbe address"), - Error::UsedAddress => write!(f, "invalid virtque used talbe address"), - Error::AvailAddress => write!(f, "invalid virtque available table address"), - Error::LogAddress => write!(f, "invalid virtque log address"), + Error::InvalidQueue => write!(f, "invalid virtqueue"), + Error::DescriptorTableAddress => { + write!(f, "invalid virtqueue descriptor table address") + } + Error::UsedAddress => write!(f, "invalid virtqueue used table address"), + Error::AvailAddress => write!(f, "invalid virtqueue available table address"), + Error::LogAddress => write!(f, "invalid virtqueue log address"), Error::IOError(e) => write!(f, "IO error: {}", e), #[cfg(feature = "vhost-kern")] Error::VhostOpen(e) => write!(f, "failure in opening vhost file: {}", e), @@ -121,7 +123,7 @@ mod tests { fn test_error() { assert_eq!( format!("{}", Error::AvailAddress), - "invalid virtque available table address" + "invalid virtqueue available table address" ); assert_eq!( format!("{}", Error::InvalidOperation), @@ -135,18 +137,18 @@ mod tests { format!("{}", Error::InvalidGuestMemoryRegion), "invalid guest memory region" ); - assert_eq!(format!("{}", Error::InvalidQueue), "invalid virtque"); + assert_eq!(format!("{}", Error::InvalidQueue), "invalid virtqueue"); assert_eq!( format!("{}", Error::DescriptorTableAddress), - "invalid virtque descriptor talbe address" + "invalid virtqueue descriptor table address" ); assert_eq!( format!("{}", Error::UsedAddress), - "invalid virtque used talbe address" + "invalid virtqueue used table address" ); assert_eq!( format!("{}", Error::LogAddress), - "invalid virtque log address" + "invalid virtqueue log address" ); assert_eq!(format!("{:?}", Error::AvailAddress), "AvailAddress"); -- cgit v1.2.3 From c4cd1d375e386069d0b781174de9f62ef41812e2 Mon Sep 17 00:00:00 2001 From: Keiichi Watanabe Date: Thu, 8 Apr 2021 02:53:31 +0900 Subject: vhost_user: Fix check for SET_VRING_ENABLE We should allow to receive SET_VRING_ENABLE request with non-zero index even if MQ protocol feature is disabled because some device can have multiple queues without the MQ feature. e.g. virtio-net means that it supports multiple pairs of tx/rx queues. So, the slave must support at least one pair of queues regardless of whether MQ is supported. Instead, make it check if VHOST_USER_F_PROTOCOL_FEATURES has been negotiated. Signed-off-by: Keiichi Watanabe --- src/vhost_user/slave_req_handler.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vhost_user/slave_req_handler.rs b/src/vhost_user/slave_req_handler.rs index 18459a2..9d7ea10 100644 --- a/src/vhost_user/slave_req_handler.rs +++ b/src/vhost_user/slave_req_handler.rs @@ -400,8 +400,8 @@ impl SlaveReqHandler { } MasterReq::SET_VRING_ENABLE => { let msg = self.extract_request_body::(&hdr, size, &buf)?; - if self.acked_protocol_features & VhostUserProtocolFeatures::MQ.bits() == 0 - && msg.index > 0 + if self.acked_virtio_features & VhostUserVirtioFeatures::PROTOCOL_FEATURES.bits() + == 0 { return Err(Error::InvalidOperation); } -- cgit v1.2.3