mirror of
https://github.com/rust-vmm/vhost-device.git
synced 2026-01-02 22:52:15 +00:00
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:
parent
3e98e89aaa
commit
91a625603f
56
Cargo.lock
generated
56
Cargo.lock
generated
@ -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
28
staging/Cargo.lock
generated
@ -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"
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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");
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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"] }
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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]
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user