diff --git a/Cargo.lock b/Cargo.lock index 969857013..dede7fb8d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2403,6 +2403,7 @@ dependencies = [ "serde", "thiserror 2.0.12", "vfio-ioctls", + "vm-memory", "vmm-sys-util", ] diff --git a/fuzz/fuzz_targets/pmem.rs b/fuzz/fuzz_targets/pmem.rs index e8cb488e7..e9247fb63 100644 --- a/fuzz/fuzz_targets/pmem.rs +++ b/fuzz/fuzz_targets/pmem.rs @@ -12,8 +12,9 @@ use std::{ffi, io}; use libc::{MAP_NORESERVE, MAP_PRIVATE, PROT_READ, PROT_WRITE}; use libfuzzer_sys::{fuzz_target, Corpus}; use seccompiler::SeccompAction; -use virtio_devices::{Pmem, UserspaceMapping, VirtioDevice, VirtioInterrupt, VirtioInterruptType}; +use virtio_devices::{Pmem, VirtioDevice, VirtioInterrupt, VirtioInterruptType}; use virtio_queue::{Queue, QueueT}; +use vm_device::UserspaceMapping; use vm_memory::bitmap::AtomicBitmap; use vm_memory::guest_memory::FileOffset; use vm_memory::{Bytes, GuestAddress, GuestMemoryAtomic, MmapRegion}; diff --git a/virtio-devices/src/device.rs b/virtio-devices/src/device.rs index 06b245e27..c0d24902a 100644 --- a/virtio-devices/src/device.rs +++ b/virtio-devices/src/device.rs @@ -15,6 +15,7 @@ use std::thread; use libc::EFD_NONBLOCK; use virtio_queue::Queue; +use vm_device::UserspaceMapping; use vm_memory::{GuestAddress, GuestMemoryAtomic, GuestUsize}; use vm_migration::{MigratableError, Pausable}; use vm_virtio::{AccessPlatform, VirtioDeviceType}; @@ -37,15 +38,6 @@ pub trait VirtioInterrupt: Send + Sync { } } -#[derive(Clone)] -pub struct UserspaceMapping { - pub host_addr: u64, - pub mem_slot: u32, - pub addr: GuestAddress, - pub len: GuestUsize, - pub mergeable: bool, -} - #[derive(Clone)] pub struct VirtioSharedMemory { pub offset: u64, diff --git a/virtio-devices/src/lib.rs b/virtio-devices/src/lib.rs index 6a21eb273..a59661eb6 100644 --- a/virtio-devices/src/lib.rs +++ b/virtio-devices/src/lib.rs @@ -47,8 +47,8 @@ pub use self::balloon::Balloon; pub use self::block::{Block, BlockState}; pub use self::console::{Console, ConsoleResizer, Endpoint}; pub use self::device::{ - DmaRemapping, UserspaceMapping, VirtioCommon, VirtioDevice, VirtioInterrupt, - VirtioInterruptType, VirtioSharedMemoryList, + DmaRemapping, VirtioCommon, VirtioDevice, VirtioInterrupt, VirtioInterruptType, + VirtioSharedMemoryList, }; pub use self::epoll_helper::{ EpollHelper, EpollHelperError, EpollHelperHandler, EPOLL_HELPER_EVENT_LAST, diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index 5f7ee9457..1e4353477 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -18,6 +18,7 @@ use seccompiler::SeccompAction; use serde::{Deserialize, Serialize}; use thiserror::Error; use virtio_queue::{DescriptorChain, Queue, QueueT}; +use vm_device::UserspaceMapping; use vm_memory::{ Address, ByteValued, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic, GuestMemoryError, GuestMemoryLoadGuard, @@ -28,8 +29,8 @@ use vmm_sys_util::eventfd::EventFd; use super::{ ActivateError, ActivateResult, EpollHelper, EpollHelperError, EpollHelperHandler, - Error as DeviceError, UserspaceMapping, VirtioCommon, VirtioDevice, VirtioDeviceType, - EPOLL_HELPER_EVENT_LAST, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_VERSION_1, + Error as DeviceError, VirtioCommon, VirtioDevice, VirtioDeviceType, EPOLL_HELPER_EVENT_LAST, + VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_VERSION_1, }; use crate::seccomp_filters::Thread; use crate::thread_helper::spawn_virtio_thread; diff --git a/virtio-devices/src/vhost_user/fs.rs b/virtio-devices/src/vhost_user/fs.rs index 1a24f1c2d..4aa692047 100644 --- a/virtio-devices/src/vhost_user/fs.rs +++ b/virtio-devices/src/vhost_user/fs.rs @@ -11,6 +11,7 @@ use serde_with::{serde_as, Bytes}; use vhost::vhost_user::message::{VhostUserProtocolFeatures, VhostUserVirtioFeatures}; use vhost::vhost_user::{FrontendReqHandler, VhostUserFrontend, VhostUserFrontendReqHandler}; use virtio_queue::Queue; +use vm_device::UserspaceMapping; use vm_memory::{ByteValued, GuestMemoryAtomic}; use vm_migration::protocol::MemoryRangeTable; use vm_migration::{Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable}; @@ -22,9 +23,8 @@ use crate::seccomp_filters::Thread; use crate::thread_helper::spawn_virtio_thread; use crate::vhost_user::VhostUserCommon; use crate::{ - ActivateResult, GuestMemoryMmap, GuestRegionMmap, MmapRegion, UserspaceMapping, VirtioCommon, - VirtioDevice, VirtioDeviceType, VirtioInterrupt, VirtioSharedMemoryList, - VIRTIO_F_IOMMU_PLATFORM, + ActivateResult, GuestMemoryMmap, GuestRegionMmap, MmapRegion, VirtioCommon, VirtioDevice, + VirtioDeviceType, VirtioInterrupt, VirtioSharedMemoryList, VIRTIO_F_IOMMU_PLATFORM, }; const NUM_QUEUE_OFFSET: usize = 1; diff --git a/vm-device/Cargo.toml b/vm-device/Cargo.toml index 9df6af3a0..ca1d38807 100644 --- a/vm-device/Cargo.toml +++ b/vm-device/Cargo.toml @@ -14,4 +14,5 @@ hypervisor = { path = "../hypervisor" } serde = { workspace = true, features = ["derive", "rc"] } thiserror = { workspace = true } vfio-ioctls = { workspace = true, default-features = false } +vm-memory = { workspace = true, features = ["backend-mmap"] } vmm-sys-util = { workspace = true } diff --git a/vm-device/src/lib.rs b/vm-device/src/lib.rs index c10731ea9..f484e9f14 100644 --- a/vm-device/src/lib.rs +++ b/vm-device/src/lib.rs @@ -4,6 +4,7 @@ // use serde::{Deserialize, Serialize}; +use vm_memory::{GuestAddress, GuestUsize}; mod bus; pub mod dma_mapping; @@ -58,3 +59,12 @@ pub enum Resource { /// KVM memslot index. KvmMemSlot(u32), } + +#[derive(Clone)] +pub struct UserspaceMapping { + pub host_addr: u64, + pub mem_slot: u32, + pub addr: GuestAddress, + pub len: GuestUsize, + pub mergeable: bool, +} diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index f43c50b11..ac1c0a406 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -95,7 +95,7 @@ use vm_device::dma_mapping::ExternalDmaMapping; use vm_device::interrupt::{ InterruptIndex, InterruptManager, LegacyIrqGroupConfig, MsiIrqGroupConfig, }; -use vm_device::{Bus, BusDevice, BusDeviceSync, Resource}; +use vm_device::{Bus, BusDevice, BusDeviceSync, Resource, UserspaceMapping}; use vm_memory::guest_memory::FileOffset; use vm_memory::{Address, GuestAddress, GuestMemoryRegion, GuestUsize, MmapRegion}; #[cfg(target_arch = "x86_64")] @@ -3231,7 +3231,7 @@ impl DeviceManager { .create_userspace_mapping(region_base, region_size, host_addr, false, false, false) .map_err(DeviceManagerError::MemoryManager)?; - let mapping = virtio_devices::UserspaceMapping { + let mapping = UserspaceMapping { host_addr, mem_slot, addr: GuestAddress(region_base),