chore: bump virtio-queue and some related dependencies

virtio-queue v0.15 introduces a new Descriptor API supporting both
split and packed virtqueue.
Update our dependencies and code to work with the new version
of the crate, including updating vhost-user-backend and virtio-vsock.

Updates `vhost-user-backend` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/rust-vmm/vhost/releases)
- [Commits](rust-vmm/vhost@vhost-user-backend-v0.18.0...vhost-user-backend-v0.19.0)

Updates `virtio-queue` from 0.14.0 to 0.15.0
- [Release notes](https://github.com/rust-vmm/vm-virtio/releases)
- [Commits](rust-vmm/vm-virtio@virtio-queue-v0.14.0...virtio-queue-v0.15.0)

Updates `virtio-vsock` from 0.8.0 to 0.9.0
- [Release notes](https://github.com/rust-vmm/vm-virtio/releases)
- [Commits](rust-vmm/vm-virtio@virtio-vsock-v0.8.0...virtio-vsock-v0.9.0)

Signed-off-by: Wenyu Huang <huangwenyuu@outlook.com>
This commit is contained in:
Wenyu Huang 2025-04-21 11:01:13 -04:00 committed by Stefano Garzarella
parent 3e98e89aaa
commit 91a625603f
34 changed files with 377 additions and 238 deletions

56
Cargo.lock generated
View File

@ -1925,7 +1925,7 @@ dependencies = [
"libc",
"uuid",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -1944,7 +1944,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -1965,7 +1965,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -1984,7 +1984,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2007,7 +2007,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2025,7 +2025,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2048,7 +2048,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2069,7 +2069,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2087,7 +2087,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2107,7 +2107,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2129,7 +2129,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2148,7 +2148,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2166,7 +2166,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2190,15 +2190,15 @@ dependencies = [
"virtio-queue",
"virtio-vsock",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
"vsock",
]
[[package]]
name = "vhost-user-backend"
version = "0.18.0"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76e8acbdaf760efa37dbd414870c81717a65a64d3351b1a93d03bc249a3e987"
checksum = "c8cc4fc4d33a521e1d912b61da986aba6f04c8b67cc1af0adaac21da3ce59fa6"
dependencies = [
"libc",
"log",
@ -2206,7 +2206,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -2220,21 +2220,21 @@ dependencies = [
[[package]]
name = "virtio-queue"
version = "0.14.0"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "872e2f3fbd70a7e6f01689720cce3d5c2c5efe52b484dd07b674246ada0e9a8d"
checksum = "efd3ef6079fc0de4d687a6ff364a5f5633f3aabcd29982ef866bc49fba0349a4"
dependencies = [
"log",
"virtio-bindings",
"vm-memory",
"vmm-sys-util 0.12.1",
"vmm-sys-util",
]
[[package]]
name = "virtio-vsock"
version = "0.8.0"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4118ce26599dc8a238c6ee795d90250c88d8ebfece9e65c1f01dec6e4e2aeb67"
checksum = "cf6ab06b1894d6c4198de00df8af8715d080d3c7c6b82ea570ad78642990d89b"
dependencies = [
"virtio-bindings",
"virtio-queue",
@ -2251,20 +2251,10 @@ dependencies = [
"bitflags 2.9.1",
"libc",
"thiserror 1.0.69",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
"winapi",
]
[[package]]
name = "vmm-sys-util"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d1435039746e20da4f8d507a72ee1b916f7b4b05af7a91c093d2c6561934ede"
dependencies = [
"bitflags 1.3.2",
"libc",
]
[[package]]
name = "vmm-sys-util"
version = "0.14.0"

28
staging/Cargo.lock generated
View File

@ -903,7 +903,7 @@ dependencies = [
"libc",
"uuid",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -928,14 +928,14 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
name = "vhost-user-backend"
version = "0.18.0"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76e8acbdaf760efa37dbd414870c81717a65a64d3351b1a93d03bc249a3e987"
checksum = "c8cc4fc4d33a521e1d912b61da986aba6f04c8b67cc1af0adaac21da3ce59fa6"
dependencies = [
"libc",
"log",
@ -943,7 +943,7 @@ dependencies = [
"virtio-bindings",
"virtio-queue",
"vm-memory",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
]
[[package]]
@ -957,14 +957,14 @@ dependencies = [
[[package]]
name = "virtio-queue"
version = "0.14.0"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "872e2f3fbd70a7e6f01689720cce3d5c2c5efe52b484dd07b674246ada0e9a8d"
checksum = "efd3ef6079fc0de4d687a6ff364a5f5633f3aabcd29982ef866bc49fba0349a4"
dependencies = [
"log",
"virtio-bindings",
"vm-memory",
"vmm-sys-util 0.12.1",
"vmm-sys-util",
]
[[package]]
@ -977,20 +977,10 @@ dependencies = [
"bitflags 2.9.1",
"libc",
"thiserror 1.0.69",
"vmm-sys-util 0.14.0",
"vmm-sys-util",
"winapi",
]
[[package]]
name = "vmm-sys-util"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d1435039746e20da4f8d507a72ee1b916f7b4b05af7a91c093d2c6561934ede"
dependencies = [
"bitflags 1.3.2",
"libc",
]
[[package]]
name = "vmm-sys-util"
version = "0.14.0"

View File

@ -27,9 +27,9 @@ libc = "0.2.172"
thiserror = "2.0"
futures-executor = { version = "0.3", features = ["thread-pool"] }
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.0"
vmm-sys-util = "0.14"
v4l2r = { git = "https://github.com/Gnurou/v4l2r", rev = "110fd77", optional = true }
@ -38,5 +38,5 @@ v4l2r = { git = "https://github.com/Gnurou/v4l2r", rev = "110fd77", optional =
assert_matches = "1.5"
rstest = "0.25.0"
tempfile = "3.20.0"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.0", features = ["backend-mmap", "backend-atomic"] }

View File

@ -11,7 +11,7 @@ use std::{
use futures_executor::{ThreadPool, ThreadPoolBuilder};
use log::{debug, warn};
use vhost_user_backend::{VringEpollHandler, VringRwLock, VringT};
use virtio_queue::{Descriptor, QueueOwnedT};
use virtio_queue::{desc::split::Descriptor as SplitDescriptor, QueueOwnedT};
use vm_memory::{
ByteValued, Bytes, GuestAddress, GuestAddressSpace, GuestMemory, GuestMemoryAtomic,
GuestMemoryMmap,
@ -198,7 +198,7 @@ pub(crate) struct VhostUserVideoThread {
fn write_descriptor_data<T: ToBytes>(
resp: T,
desc_response: &Descriptor,
desc_response: &SplitDescriptor,
desc_chain: &VideoDescriptorChain,
vring: &VringRwLock,
) {
@ -577,7 +577,7 @@ mod tests {
use rstest::*;
use tempfile::TempDir;
use virtio_bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Queue};
use virtio_queue::{desc::RawDescriptor, mock::MockSplitQueue, Queue};
use vm_memory::{Address, GuestAddress};
use vmm_sys_util::eventfd::EventFd;
@ -605,14 +605,18 @@ mod tests {
// Descriptor for the video request
let desc_request =
Descriptor::new(next_addr, request_size, VRING_DESC_F_NEXT as u16, index + 1);
SplitDescriptor::new(next_addr, request_size, VRING_DESC_F_NEXT as u16, index + 1);
mem.write_slice(request, desc_request.addr()).unwrap();
vq.desc_table().store(index, desc_request).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_request))
.unwrap();
next_addr += u64::from(desc_request.len());
index += 1;
// Descriptor for the video response
let desc_response = Descriptor::new(next_addr, 0x100, VRING_DESC_F_WRITE as u16, 0);
vq.desc_table().store(index, desc_response).unwrap();
let desc_response = SplitDescriptor::new(next_addr, 0x100, VRING_DESC_F_WRITE as u16, 0);
vq.desc_table()
.store(index, RawDescriptor::from(desc_response))
.unwrap();
// Put the descriptor index 0 in the first available ring position.
mem.write_obj(0u16, vq.avail_addr().unchecked_add(4))

View File

@ -946,7 +946,11 @@ impl ToBytes for virtio_video_event {
pub mod tests {
use assert_matches::assert_matches;
use rstest::*;
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue, QueueOwnedT};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue, QueueOwnedT,
};
use vm_memory::{
Address, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic, GuestMemoryMmap,
};
@ -961,9 +965,12 @@ pub mod tests {
let flags = 0;
let request = request.as_slice();
let desc = Descriptor::new(addr, request.len() as u32, flags as u16, 1);
let desc = SplitDescriptor::new(addr, request.len() as u32, flags as u16, 1);
mem.write(request, desc.addr()).unwrap();
assert!(virt_queue.desc_table().store(0, desc).is_ok());
assert!(virt_queue
.desc_table()
.store(0, RawDescriptor::from(desc))
.is_ok());
// Put the descriptor index 0 in the first available ring position.
mem.write_obj(0u16, virt_queue.avail_addr().unchecked_add(4))

View File

@ -22,13 +22,13 @@ thiserror = "2.0"
queues = "1.0.2"
socketcan = "3.5.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -724,7 +724,11 @@ mod tests {
use crate::virtio_can::{VirtioCanCtrlResponse, VirtioCanTxResponse};
use std::mem::size_of;
use virtio_bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Bytes, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap, Le16, Le32};
#[test]
@ -831,7 +835,12 @@ mod tests {
flags[i as usize] & !VRING_DESC_F_NEXT as u16
};
let desc = Descriptor::new((0x100 * (i + 1)) as u64, len, desc_flags, i + 1);
let desc = RawDescriptor::from(SplitDescriptor::new(
(0x100 * (i + 1)) as u64,
len,
desc_flags,
i + 1,
));
desc_vec.push(desc);
}

View File

@ -24,13 +24,13 @@ epoll = "4.3"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -860,7 +860,11 @@ mod tests {
use std::io::Cursor;
use virtio_bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Bytes, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::*;
@ -972,7 +976,12 @@ mod tests {
flags[i as usize] & !VRING_DESC_F_NEXT as u16
};
let desc = Descriptor::new(u64::from(0x100 * (i + 1)), len, desc_flags, i + 1);
let desc = RawDescriptor::from(SplitDescriptor::new(
u64::from(0x100 * (i + 1)),
len,
desc_flags,
i + 1,
));
desc_vec.push(desc);
}

View File

@ -22,9 +22,9 @@ libc = "0.2"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
@ -33,5 +33,5 @@ libgpiod = "0.2"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -502,7 +502,11 @@ impl<D: 'static + GpioDevice + Sync + Send> VhostUserBackendMut for VhostUserGpi
#[cfg(test)]
mod tests {
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Address, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::Error;
@ -523,7 +527,7 @@ mod tests {
let mut next_addr = vq.desc_table().total_size() + 0x100;
let mut index = 0;
let desc_out = Descriptor::new(
let desc_out = SplitDescriptor::new(
next_addr,
size_of::<R>() as u32,
VRING_DESC_F_NEXT as u16,
@ -531,12 +535,19 @@ mod tests {
);
mem.write_obj::<R>(out_hdr, desc_out.addr()).unwrap();
vq.desc_table().store(index, desc_out).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_out))
.unwrap();
next_addr += desc_out.len() as u64;
index += 1;
// In response descriptor
let desc_in = Descriptor::new(next_addr, response_len, VRING_DESC_F_WRITE as u16, 0);
let desc_in = RawDescriptor::from(SplitDescriptor::new(
next_addr,
response_len,
VRING_DESC_F_WRITE as u16,
0,
));
vq.desc_table().store(index, desc_in).unwrap();
// Put the descriptor index 0 in the first available ring position.
@ -610,7 +621,7 @@ mod tests {
_ => 0x100,
};
let desc = Descriptor::new(offset, len[i], f, (i + 1) as u16);
let desc = RawDescriptor::from(SplitDescriptor::new(offset, len[i], f, (i + 1) as u16));
vq.desc_table().store(i as u16, desc).unwrap();
}

View File

@ -28,9 +28,9 @@ log = "0.4"
rutabaga_gfx = { version = "0.1.5", features = ["virgl_renderer"] }
thiserror = "2.0.12"
vhost = { version = "0.14.0", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14.0"
virtio-queue = "0.15.0"
vm-memory = "0.16.1"
vmm-sys-util = "0.14.0"
bitflags = "2.9.1"
@ -40,5 +40,5 @@ assert_matches = "1.5"
mockall = "0.13.0"
rusty-fork = "0.3.0"
tempfile = "3.20"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -724,7 +724,11 @@ mod tests {
use vhost::vhost_user::gpu_message::{VhostUserGpuScanout, VhostUserGpuUpdate};
use vhost_user_backend::{VhostUserDaemon, VringRwLock, VringT};
use virtio_bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue, QueueT};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue, QueueT,
};
use vm_memory::{
ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryAtomic, GuestMemoryMmap,
};
@ -972,7 +976,7 @@ mod tests {
assert_matches!(result, Ok(OkNoData));
}
fn make_descriptors_into_a_chain(start_idx: u16, descriptors: &mut [Descriptor]) {
fn make_descriptors_into_a_chain(start_idx: u16, descriptors: &mut [SplitDescriptor]) {
let last_idx = start_idx + descriptors.len() as u16 - 1;
for (idx, desc) in zip(start_idx.., descriptors.iter_mut()) {
if idx == last_idx {
@ -1011,7 +1015,7 @@ mod tests {
mem.memory()
.check_address(GuestAddress(next_addr))
.expect("Readable descriptor's buffer address is not valid!");
let desc = Descriptor::new(
let desc = SplitDescriptor::new(
next_addr,
buf.len()
.try_into()
@ -1028,7 +1032,7 @@ mod tests {
mem.memory()
.check_address(GuestAddress(next_addr))
.expect("Writable descriptor's buffer address is not valid!");
let desc = Descriptor::new(next_addr, desc_len, VRING_DESC_F_WRITE as u16, 0);
let desc = SplitDescriptor::new(next_addr, desc_len, VRING_DESC_F_WRITE as u16, 0);
writable_descriptor_adresses.push(desc.addr());
descriptors.push(desc);
next_addr += u64::from(desc_len);
@ -1043,7 +1047,11 @@ mod tests {
assert!(descriptors.len() < queue_size as usize);
if !descriptors.is_empty() {
vq.build_multiple_desc_chains(&descriptors)
let descs_raw = descriptors
.into_iter()
.map(RawDescriptor::from)
.collect::<Vec<RawDescriptor>>();
vq.build_multiple_desc_chains(&descs_raw)
.expect("Failed to build descriptor chain");
}

View File

@ -1151,7 +1151,10 @@ impl GpuResponse {
#[cfg(test)]
mod tests {
use virtio_bindings::virtio_ring::VRING_DESC_F_WRITE;
use virtio_queue::{mock::MockSplitQueue, Descriptor};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
};
use vm_memory::GuestMemoryMmap;
use super::*;
@ -1337,7 +1340,12 @@ mod tests {
let vq = MockSplitQueue::new(&mem, 8);
let desc_chain = vq
.build_desc_chain(&[Descriptor::new(0x1000, 8192, VRING_DESC_F_WRITE as u16, 0)])
.build_desc_chain(&[RawDescriptor::from(SplitDescriptor::new(
0x1000,
8192,
VRING_DESC_F_WRITE as u16,
0,
))])
.unwrap();
let mut writer = desc_chain

View File

@ -21,13 +21,13 @@ libc = "0.2"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -361,7 +361,11 @@ impl<D: 'static + I2cDevice + Sync + Send> VhostUserBackendMut for VhostUserI2cB
#[cfg(test)]
mod tests {
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Address, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::Error;
@ -388,7 +392,7 @@ mod tests {
flags: From::from(flag),
};
let desc_out = Descriptor::new(
let desc_out = SplitDescriptor::new(
next_addr,
size_of::<VirtioI2cOutHdr>() as u32,
VRING_DESC_F_NEXT as u16,
@ -397,7 +401,9 @@ mod tests {
mem.write_obj::<VirtioI2cOutHdr>(out_hdr, desc_out.addr())
.unwrap();
vq.desc_table().store(index, desc_out).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_out))
.unwrap();
next_addr += desc_out.len() as u64;
index += 1;
@ -411,26 +417,30 @@ mod tests {
VRING_DESC_F_WRITE
};
let desc_buf = Descriptor::new(
let desc_buf = SplitDescriptor::new(
next_addr,
buf.len() as u32,
(flag | VRING_DESC_F_NEXT) as u16,
index + 1,
);
mem.write(buf, desc_buf.addr()).unwrap();
vq.desc_table().store(index, desc_buf).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_buf))
.unwrap();
next_addr += desc_buf.len() as u64;
index += 1;
}
// In response descriptor
let desc_in = Descriptor::new(
let desc_in = SplitDescriptor::new(
next_addr,
size_of::<u8>() as u32,
VRING_DESC_F_WRITE as u16,
0,
);
vq.desc_table().store(index, desc_in).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_in))
.unwrap();
// Put the descriptor index 0 in the first available ring position.
mem.write_obj(0u16, vq.avail_addr().unchecked_add(4))
@ -503,7 +513,7 @@ mod tests {
_ => 0x100,
};
let desc = Descriptor::new(offset, len[i], f, (i + 1) as u16);
let desc = RawDescriptor::from(SplitDescriptor::new(offset, len[i], f, (i + 1) as u16));
vq.desc_table().store(i as u16, desc).unwrap();
}

View File

@ -23,9 +23,9 @@ rand = "0.9.1"
tempfile = "3.20"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
evdev = "0.13"
@ -33,5 +33,5 @@ nix = { version = "0.30", features = ["ioctl"] }
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16", features = ["backend-mmap", "backend-atomic"] }

View File

@ -430,7 +430,7 @@ mod tests {
use std::mem;
use std::os::fd::RawFd;
use std::path::PathBuf;
use virtio_queue::Descriptor;
use virtio_queue::desc::{split::Descriptor as SplitDescriptor, RawDescriptor};
use vm_memory::{Address, Bytes, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::*;
@ -588,10 +588,10 @@ mod tests {
vring.set_queue_info(0x100, 0x200, 0x300).unwrap();
// Create a descriptor chain with two descriptors.
let desc = Descriptor::new(0x400_u64, 0x100, 0, 0);
let desc = RawDescriptor::from(SplitDescriptor::new(0x400_u64, 0x100, 0, 0));
mem_map.write_obj(desc, GuestAddress(0x100)).unwrap();
let desc = Descriptor::new(0x500_u64, 0x100, 0, 0);
let desc = RawDescriptor::from(SplitDescriptor::new(0x500_u64, 0x100, 0, 0));
mem_map.write_obj(desc, GuestAddress(0x100 + 16)).unwrap();
// Put the descriptor index 0 in the first available ring position.

View File

@ -22,13 +22,13 @@ rand = "0.9.1"
tempfile = "3.20"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16", features = ["backend-mmap", "backend-atomic"] }

View File

@ -291,7 +291,11 @@ mod tests {
use std::io::ErrorKind;
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Address, Bytes, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
// Add VuRngBackend accessor to artificially manipulate internal fields
@ -359,7 +363,12 @@ mod tests {
flags & !VRING_DESC_F_NEXT as u16
};
let desc = Descriptor::new((0x100 * (i + 1)) as u64, 0x200, desc_flags, i + 1);
let desc = RawDescriptor::from(SplitDescriptor::new(
(0x100 * (i + 1)) as u64,
0x200,
desc_flags,
i + 1,
));
vq.desc_table().store(i, desc).unwrap();
}

View File

@ -16,12 +16,12 @@ itertools = "0.14"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }

View File

@ -538,7 +538,11 @@ impl VhostUserBackendMut for VuScmiBackend {
#[cfg(test)]
mod tests {
use virtio_bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Address, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::*;
@ -560,7 +564,7 @@ mod tests {
// Descriptor for the SCMI request
let desc_request =
Descriptor::new(next_addr, request_size, VRING_DESC_F_NEXT as u16, index + 1);
SplitDescriptor::new(next_addr, request_size, VRING_DESC_F_NEXT as u16, index + 1);
let mut bytes: Vec<u8> = vec![];
bytes.append(&mut scmi_header(message_id, protocol_id).to_le_bytes().to_vec());
for p in parameters {
@ -568,13 +572,17 @@ mod tests {
}
mem.write_slice(bytes.as_slice(), desc_request.addr())
.unwrap();
vq.desc_table().store(index, desc_request).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_request))
.unwrap();
next_addr += u64::from(desc_request.len());
index += 1;
// Descriptor for the SCMI response
let desc_response = Descriptor::new(next_addr, 0x100, VRING_DESC_F_WRITE as u16, 0);
vq.desc_table().store(index, desc_response).unwrap();
let desc_response = SplitDescriptor::new(next_addr, 0x100, VRING_DESC_F_WRITE as u16, 0);
vq.desc_table()
.store(index, RawDescriptor::from(desc_response))
.unwrap();
// Put the descriptor index 0 in the first available ring position.
mem.write_obj(0u16, vq.avail_addr().unchecked_add(4))
@ -597,8 +605,10 @@ mod tests {
let next_addr = vq.desc_table().total_size() + 0x100;
// Descriptor for the SCMI event
let desc_response = Descriptor::new(next_addr, 0x100, VRING_DESC_F_WRITE as u16, 0);
vq.desc_table().store(0, desc_response).unwrap();
let desc_response = SplitDescriptor::new(next_addr, 0x100, VRING_DESC_F_WRITE as u16, 0);
vq.desc_table()
.store(0, RawDescriptor::from(desc_response))
.unwrap();
// Put the descriptor index 0 in the first available ring position.
mem.write_obj(0u16, vq.avail_addr().unchecked_add(4))
@ -636,7 +646,7 @@ mod tests {
Some(addr) => addr,
_ => 0x100,
};
let desc = Descriptor::new(offset, p.len, f, (i + 1) as u16);
let desc = RawDescriptor::from(SplitDescriptor::new(offset, p.len, f, (i + 1) as u16));
vq.desc_table().store(i as u16, desc).unwrap();
}

View File

@ -22,9 +22,9 @@ log = "0.4"
num_enum = "0.7"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"

View File

@ -334,7 +334,10 @@ mod tests {
VIRTIO_SCSI_S_FAILURE, VIRTIO_SCSI_S_OK,
},
};
use virtio_queue::{mock::MockSplitQueue, Descriptor};
use virtio_queue::{
desc::{split::Descriptor, RawDescriptor},
mock::MockSplitQueue,
};
use vm_memory::{
Address, ByteValued, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic,
GuestMemoryMmap,
@ -426,8 +429,13 @@ mod tests {
);
// The `build_desc_chain` function will populate the `NEXT` related flags and field.
let v = vec![
Descriptor::new(0x10_0000, 0x100, 0, 0), // request
Descriptor::new(0x20_0000, 0x100, VRING_DESC_F_WRITE as u16, 0), // response
RawDescriptor::from(Descriptor::new(0x10_0000, 0x100, 0, 0)), // request
RawDescriptor::from(Descriptor::new(
0x20_0000,
0x100,
VRING_DESC_F_WRITE as u16,
0,
)), // response
];
mem.memory()

View File

@ -14,7 +14,7 @@ use std::{
use log::error;
use virtio_bindings::virtio_scsi::virtio_scsi_cmd_req;
use virtio_queue::{Descriptor, DescriptorChain, DescriptorChainRwIter};
use virtio_queue::{desc::split::Descriptor, DescriptorChain, DescriptorChainRwIter};
use vm_memory::{Bytes, GuestAddress, GuestMemory};
/// virtio-scsi has its own format for LUNs, documented in 5.6.6.1 of virtio
@ -315,7 +315,7 @@ where
#[cfg(test)]
pub(crate) mod tests {
use virtio_bindings::virtio_scsi::{virtio_scsi_cmd_req, virtio_scsi_cmd_resp};
use virtio_queue::{mock::MockSplitQueue, Descriptor};
use virtio_queue::{desc::RawDescriptor, mock::MockSplitQueue};
use vm_memory::{ByteValued, GuestAddress, GuestMemoryMmap};
use super::*;
@ -353,7 +353,7 @@ pub(crate) mod tests {
// The `build_desc_chain` function will populate the `NEXT` related flags and field.
let v = vec![
// A device-writable request header descriptor.
Descriptor::new(0x10_0000, 0x100, 0, 0),
RawDescriptor::from(Descriptor::new(0x10_0000, 0x100, 0, 0)),
];
let req = report_luns_command();

View File

@ -22,9 +22,9 @@ env_logger = "0.11"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
@ -36,7 +36,7 @@ pw = { package = "pipewire", version = "0.8", optional = true }
[dev-dependencies]
rstest = "0.25.0"
tempfile = "3.20"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }
[target.'cfg(target_env = "gnu")'.dev-dependencies]

View File

@ -678,7 +678,10 @@ mod tests {
use std::path::PathBuf;
use tempfile::tempdir;
use virtio_bindings::virtio_ring::VRING_DESC_F_WRITE;
use virtio_queue::{mock::MockSplitQueue, Descriptor};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
};
use vm_memory::{
Address, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic, GuestMemoryMmap,
};
@ -688,7 +691,7 @@ mod tests {
const SOCKET_PATH: &str = "vsound.socket";
fn setup_descs(descs: &[Descriptor]) -> (VringRwLock, GuestMemoryAtomic<GuestMemoryMmap>) {
fn setup_descs(descs: &[RawDescriptor]) -> (VringRwLock, GuestMemoryAtomic<GuestMemoryMmap>) {
let mem = GuestMemoryAtomic::new(
GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x1000_0000)]).unwrap(),
);
@ -774,9 +777,19 @@ mod tests {
};
let addr_req = 0x10_0000;
let descs = [
Descriptor::new(addr_req, 0x100, 0, 0), // request
Descriptor::new(0x20_0000, 0x100, VRING_DESC_F_WRITE as u16, 0),
Descriptor::new(0x20_0000, 0x100, VRING_DESC_F_WRITE as u16, 0), // response
RawDescriptor::from(SplitDescriptor::new(addr_req, 0x100, 0, 0)), // request
RawDescriptor::from(SplitDescriptor::new(
0x20_0000,
0x100,
VRING_DESC_F_WRITE as u16,
0,
)),
RawDescriptor::from(SplitDescriptor::new(
0x20_0000,
0x100,
VRING_DESC_F_WRITE as u16,
0,
)), // response
];
let (vring, mem) = setup_descs(&descs);
@ -802,8 +815,13 @@ mod tests {
};
let addr_req = 0x10_0000;
let descs = [
Descriptor::new(addr_req, 0x100, 0, 0), // request
Descriptor::new(0x20_0000, 0x100, VRING_DESC_F_WRITE as u16, 0),
RawDescriptor::from(SplitDescriptor::new(addr_req, 0x100, 0, 0)), // request
RawDescriptor::from(SplitDescriptor::new(
0x20_0000,
0x100,
VRING_DESC_F_WRITE as u16,
0,
)),
];
let (vring, mem) = setup_descs(&descs);
@ -850,7 +868,7 @@ mod tests {
// single descriptor request shall fail
let descs = [
Descriptor::new(0, 0, 0, 0), // request
RawDescriptor::from(SplitDescriptor::new(0, 0, 0, 0)), // request
];
let (vring, mem) = setup_descs(&descs);
t.mem = Some(mem);
@ -858,15 +876,18 @@ mod tests {
// a request with the first descriptor write-only shall fail
let descs = [
Descriptor::new(0, 0, VRING_DESC_F_WRITE as u16, 0),
Descriptor::new(0, 0, VRING_DESC_F_WRITE as u16, 0),
RawDescriptor::from(SplitDescriptor::new(0, 0, VRING_DESC_F_WRITE as u16, 0)),
RawDescriptor::from(SplitDescriptor::new(0, 0, VRING_DESC_F_WRITE as u16, 0)),
];
let (vring, mem) = setup_descs(&descs);
t.mem = Some(mem);
t.process_control(&vring, &audio_backend).unwrap_err();
// a request with the second descriptor read-only shall fail
let descs = [Descriptor::new(0, 0, 0, 0), Descriptor::new(0, 0, 0, 0)];
let descs = [
RawDescriptor::from(SplitDescriptor::new(0, 0, 0, 0)),
RawDescriptor::from(SplitDescriptor::new(0, 0, 0, 0)),
];
let (vring, mem) = setup_descs(&descs);
t.mem = Some(mem);
t.process_control(&vring, &audio_backend).unwrap_err();
@ -883,13 +904,18 @@ mod tests {
};
let addr_req = 0x10_0000;
let descs = [
Descriptor::new(addr_req, size_of::<VirtioSoundHeader>() as u32, 0, 0), // request
Descriptor::new(
RawDescriptor::from(SplitDescriptor::new(
addr_req,
size_of::<VirtioSoundHeader>() as u32,
0,
0,
)), // request
RawDescriptor::from(SplitDescriptor::new(
0x20_0000,
size_of::<VirtioSoundHeader>() as u32,
VRING_DESC_F_WRITE as u16,
0,
), // response
)), // response
];
let (vring, mem) = setup_descs(&descs);
mem.memory()

View File

@ -374,7 +374,11 @@ mod tests {
use vhost_user_backend::{VringRwLock, VringT};
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue, QueueOwnedT};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue, QueueOwnedT,
};
use vm_memory::{
Address, ByteValued, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic,
GuestMemoryMmap,
@ -395,7 +399,7 @@ mod tests {
let mut next_addr = vq.desc_table().total_size() + 0x100;
let mut index = 0;
let desc_out = Descriptor::new(
let desc_out = SplitDescriptor::new(
next_addr,
(std::mem::size_of::<R>() as u32)
.checked_add(payload_len)
@ -405,12 +409,19 @@ mod tests {
);
mem.write_obj::<R>(hdr, desc_out.addr()).unwrap();
vq.desc_table().store(index, desc_out).unwrap();
vq.desc_table()
.store(index, RawDescriptor::from(desc_out))
.unwrap();
next_addr += u64::from(desc_out.len());
index += 1;
// In response descriptor
let desc_in = Descriptor::new(next_addr, response_len, VRING_DESC_F_WRITE as u16, 0);
let desc_in = RawDescriptor::from(SplitDescriptor::new(
next_addr,
response_len,
VRING_DESC_F_WRITE as u16,
0,
));
vq.desc_table().store(index, desc_in).unwrap();
// Put the descriptor index 0 in the first available ring position.

View File

@ -22,14 +22,14 @@ libc = "0.2"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
bitflags = "2.9.1"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -491,7 +491,10 @@ mod tests {
use std::path::PathBuf;
use std::slice::from_raw_parts;
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
};
use vm_memory::{Bytes, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::Error;
@ -499,7 +502,7 @@ mod tests {
use crate::spi::tests::{verify_rdwr_buf, DummyDevice};
// Prepares descriptor chains
fn setup_descs(descs: &[Descriptor]) -> (VringRwLock, GuestMemoryAtomic<GuestMemoryMmap>) {
fn setup_descs(descs: &[SplitDescriptor]) -> (VringRwLock, GuestMemoryAtomic<GuestMemoryMmap>) {
let mem = GuestMemoryAtomic::new(
GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x1000_0000)]).unwrap(),
);
@ -507,7 +510,7 @@ mod tests {
let queue = MockSplitQueue::new(&*mem_handle, 16);
let mut modified_descs: Vec<Descriptor> = Vec::with_capacity(descs.len());
let mut modified_descs: Vec<RawDescriptor> = Vec::with_capacity(descs.len());
// Use this tag to indicate the start of request
let mut request_head: bool = true;
@ -533,12 +536,12 @@ mod tests {
idx as u16 + 1
};
modified_descs.push(Descriptor::new(
modified_descs.push(RawDescriptor::from(SplitDescriptor::new(
desc.addr().0,
desc.len(),
desc.flags(),
next,
));
)));
}
queue
@ -604,14 +607,14 @@ mod tests {
// Valid single write request
let to_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -653,19 +656,19 @@ mod tests {
// Valid single read request
let ro_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
rx_buf_addr1,
30,
(VRING_DESC_F_NEXT | VRING_DESC_F_WRITE) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -709,20 +712,20 @@ mod tests {
// Valid mixed read-write request
let tx_rx_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr1,
30,
(VRING_DESC_F_NEXT | VRING_DESC_F_WRITE) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -766,39 +769,39 @@ mod tests {
// Valid multiple requests
let multi_reqs_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr1,
30,
(VRING_DESC_F_NEXT | VRING_DESC_F_WRITE) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_header_addr2,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr2, 16, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr2, 16, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr2,
16,
(VRING_DESC_F_NEXT | VRING_DESC_F_WRITE) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr2,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -854,14 +857,14 @@ mod tests {
// unsupported LOOP mode, should filter by parameter check
let mode_invalid_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -903,14 +906,14 @@ mod tests {
// unsupported tx_nbits, should filter by parameter check
let mode_invalid_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -952,39 +955,39 @@ mod tests {
// Valid multiple requests which contains invalid request header
let multi_reqs_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr1,
30,
(VRING_DESC_F_NEXT | VRING_DESC_F_WRITE) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_header_addr2,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr2, 16, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr2, 16, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr2,
16,
(VRING_DESC_F_NEXT | VRING_DESC_F_WRITE) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr2,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -1066,14 +1069,14 @@ mod tests {
// Backend mem must be set properly before transmit.
let writable_head_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
(VRING_DESC_F_WRITE | VRING_DESC_F_NEXT) as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -1111,14 +1114,14 @@ mod tests {
// Set request head descriptor as writable, which is invalid.
let writable_head_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
(VRING_DESC_F_WRITE | VRING_DESC_F_NEXT) as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -1157,14 +1160,14 @@ mod tests {
// Set request result descriptor as readable, which is invalid.
let readable_result_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
0,
@ -1203,20 +1206,20 @@ mod tests {
// Set tx_buf len and rx_buf len different, which is invalid.
let tx_rx_len_diff_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr1,
20,
(VRING_DESC_F_WRITE | VRING_DESC_F_NEXT) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -1255,13 +1258,13 @@ mod tests {
// At lease one buf needed, either tx_buf or rx_buf.
let no_buf_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -1300,20 +1303,20 @@ mod tests {
// The address range is from 0 to 0x1000_1000, set head address out of range.
let head_addr_invalid_descs = [
Descriptor::new(
SplitDescriptor::new(
0x2000_0000,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr1,
30,
(VRING_DESC_F_WRITE | VRING_DESC_F_NEXT) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
trans_result_addr1,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,
@ -1331,20 +1334,20 @@ mod tests {
// The address range is from 0 to 0x1000_1000, set result address out of range.
let result_addr_invalid_descs = [
Descriptor::new(
SplitDescriptor::new(
trans_header_addr1,
size_of::<VirtioSpiTransferHead>() as u32,
VRING_DESC_F_NEXT as u16,
0,
),
Descriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
Descriptor::new(
SplitDescriptor::new(tx_buf_addr1, 30, VRING_DESC_F_NEXT as u16, 0),
SplitDescriptor::new(
rx_buf_addr1,
30,
(VRING_DESC_F_WRITE | VRING_DESC_F_NEXT) as u16,
0,
),
Descriptor::new(
SplitDescriptor::new(
0x2000_0000,
size_of::<VirtioSpiTransferResult>() as u32,
VRING_DESC_F_WRITE as u16,

View File

@ -22,13 +22,13 @@ libc = "0.2"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-queue = "0.15"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
vm-memory = { version = "0.16.1", features = ["backend-mmap", "backend-atomic"] }

View File

@ -223,7 +223,11 @@ mod tests {
use std::mem::size_of;
use vhost_user_backend::{VhostUserBackendMut, VringRwLock, VringT};
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, Queue};
use virtio_queue::{
desc::{split::Descriptor as SplitDescriptor, RawDescriptor},
mock::MockSplitQueue,
Queue,
};
use vm_memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
use super::*;
@ -267,7 +271,7 @@ mod tests {
mut next_addr: u64,
mem: &GuestMemoryLoadGuard<GuestMemoryMmap<()>>,
buf: &mut [u8],
) -> Vec<Descriptor> {
) -> Vec<SplitDescriptor> {
let mut descriptors = Vec::new();
let mut index = 0;
@ -278,7 +282,7 @@ mod tests {
c: 0x20,
};
let desc_out = Descriptor::new(
let desc_out = SplitDescriptor::new(
next_addr,
size_of::<VirtioFooOutHdr>() as u32,
VRING_DESC_F_NEXT as u16,
@ -293,7 +297,7 @@ mod tests {
// Buf descriptor: optional
if !buf.is_empty() {
let desc_buf = Descriptor::new(
let desc_buf = SplitDescriptor::new(
next_addr,
buf.len() as u32,
(VRING_DESC_F_WRITE | VRING_DESC_F_NEXT) as u16,
@ -306,7 +310,7 @@ mod tests {
}
// In response descriptor
let desc_in = Descriptor::new(
let desc_in = SplitDescriptor::new(
next_addr,
size_of::<VirtioFooInHdr>() as u32,
VRING_DESC_F_WRITE as u16,
@ -325,7 +329,13 @@ mod tests {
let descriptors = prepare_descriptors(next_addr, &mem_handle, buf);
vq.build_desc_chain(&descriptors).unwrap();
vq.build_desc_chain(
&descriptors
.into_iter()
.map(RawDescriptor::from)
.collect::<Vec<RawDescriptor>>(),
)
.unwrap();
// Put the descriptor index 0 in the first available ring position.
mem_handle
@ -360,7 +370,9 @@ mod tests {
let descriptors = prepare_descriptors(next_addr, &mem_handle, buf);
for (idx, desc) in descriptors.iter().enumerate() {
vq.desc_table().store(idx as u16, *desc).unwrap();
vq.desc_table()
.store(idx as u16, RawDescriptor::from(*desc))
.unwrap();
}
// Put the descriptor index 0 in the first available ring position.

View File

@ -22,10 +22,10 @@ epoll = "4.3.2"
log = "0.4"
thiserror = "2.0"
vhost = { version = "0.14", features = ["vhost-user-backend"] }
vhost-user-backend = "0.18"
vhost-user-backend = "0.19"
virtio-bindings = "0.2.5"
virtio-queue = "0.14"
virtio-vsock = "0.8"
virtio-queue = "0.15"
virtio-vsock = "0.9"
vm-memory = "0.16.1"
vmm-sys-util = "0.14"
figment = { version = "0.10.19", features = ["yaml"] }
@ -35,5 +35,5 @@ serde = { version = "1", features = ["derive"] }
[dev-dependencies]
assert_matches = "1.5"
virtio-queue = { version = "0.14", features = ["test-utils"] }
virtio-queue = { version = "0.15", features = ["test-utils"] }
tempfile = "3.20.0"

View File

@ -402,7 +402,10 @@ mod tests {
use std::ops::Deref;
use std::sync::{Arc, Mutex};
use virtio_bindings::bindings::virtio_ring::{VRING_DESC_F_NEXT, VRING_DESC_F_WRITE};
use virtio_queue::{mock::MockSplitQueue, Descriptor, DescriptorChain, Queue, QueueOwnedT};
use virtio_queue::{
desc::split::Descriptor as SplitDescriptor, desc::RawDescriptor, mock::MockSplitQueue,
DescriptorChain, Queue, QueueOwnedT,
};
use vm_memory::{
Address, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic, GuestMemoryLoadGuard,
GuestMemoryMmap,
@ -457,9 +460,14 @@ mod tests {
// vsock packet header
// let header = vec![0 as u8; head_params.head_len];
let header = head_params.construct_head();
let head_desc =
Descriptor::new(next_addr, head_params.head_len as u32, head_flags as u16, 1);
mem.write(&header, head_desc.addr()).unwrap();
let head_desc = RawDescriptor::from(SplitDescriptor::new(
next_addr,
head_params.head_len as u32,
head_flags as u16,
1,
));
mem.write(&header, SplitDescriptor::from(head_desc).addr())
.unwrap();
assert!(virt_queue.desc_table().store(0, head_desc).is_ok());
next_addr += head_params.head_len as u64;
@ -479,8 +487,14 @@ mod tests {
}
// vsock data
let data = vec![0_u8; head_data_len as usize];
let data_desc = Descriptor::new(next_addr, data.len() as u32, head_flags as u16, i + 2);
mem.write(&data, data_desc.addr()).unwrap();
let data_desc = RawDescriptor::from(SplitDescriptor::new(
next_addr,
data.len() as u32,
head_flags as u16,
i + 2,
));
mem.write(&data, SplitDescriptor::from(data_desc).addr())
.unwrap();
assert!(virt_queue.desc_table().store(i + 1, data_desc).is_ok());
next_addr += head_data_len as u64;
}