From 6ff107afe4fa287b81d3b39fec97500cb57cae48 Mon Sep 17 00:00:00 2001 From: Arron Wang Date: Wed, 3 Jun 2020 09:56:12 +0000 Subject: [PATCH] vm-device: Switch to use get_host_address_range in vfio-ioctls The API has change to use generic GuestMemory trait: pub fn get_host_address_range( mem: &M, addr: GuestAddress, size: usize, ) -> Option<*mut u8> { Signed-off-by: Arron Wang --- vm-device/src/lib.rs | 69 ---------------------- vm-virtio/src/vhost_user/vu_common_ctrl.rs | 8 +-- vm-virtio/src/vsock/packet.rs | 12 ++-- 3 files changed, 10 insertions(+), 79 deletions(-) diff --git a/vm-device/src/lib.rs b/vm-device/src/lib.rs index 670530efe..65fb3ec4e 100644 --- a/vm-device/src/lib.rs +++ b/vm-device/src/lib.rs @@ -4,11 +4,6 @@ extern crate vm_memory; pub mod interrupt; -use vm_memory::{ - Address, GuestAddress, GuestMemory, GuestMemoryMmap, GuestMemoryRegion, GuestRegionMmap, - MemoryRegionAddress, -}; - /// Type of Message Singaled Interrupt #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub enum MsiIrqType { @@ -41,67 +36,3 @@ pub enum Resource { /// KVM memslot index. KvmMemSlot(u32), } - -fn get_region_host_address_range( - region: &GuestRegionMmap, - addr: MemoryRegionAddress, - size: usize, -) -> Option<*mut u8> { - region.check_address(addr).and_then(|addr| { - region - .checked_offset(addr, size) - .map(|_| region.as_ptr().wrapping_offset(addr.raw_value() as isize)) - }) -} - -/// Convert an absolute address into an address space (GuestMemory) -/// to a host pointer and verify that the provided size define a valid -/// range within a single memory region. -/// Return None if it is out of bounds or if addr+size overlaps a single region. -/// -/// This is a temporary vm-memory wrapper. -pub fn get_host_address_range( - mem: &GuestMemoryMmap, - addr: GuestAddress, - size: usize, -) -> Option<*mut u8> { - mem.to_region_addr(addr) - .and_then(|(r, addr)| get_region_host_address_range(r, addr, size)) -} - -#[cfg(test)] -mod tests { - - use super::*; - use vm_memory::{GuestAddress, GuestMemoryMmap}; - - #[test] - fn test_get_host_address_range() { - let start_addr1 = GuestAddress(0x0); - let start_addr2 = GuestAddress(0x1000); - let guest_mem = - GuestMemoryMmap::from_ranges(&[(start_addr1, 0x400), (start_addr2, 0x400)]).unwrap(); - - assert!(get_host_address_range(&guest_mem, GuestAddress(0x600), 0x100).is_none()); - - // Overlapping range - assert!(get_host_address_range(&guest_mem, GuestAddress(0x1000), 0x500).is_none()); - - // Overlapping range - assert!(get_host_address_range(&guest_mem, GuestAddress(0x1200), 0x500).is_none()); - - let ptr = get_host_address_range(&guest_mem, GuestAddress(0x1000), 0x100).unwrap(); - - let ptr0 = get_host_address_range(&guest_mem, GuestAddress(0x1100), 0x100).unwrap(); - - let ptr1 = guest_mem.get_host_address(GuestAddress(0x1200)).unwrap(); - assert_eq!( - ptr, - guest_mem - .find_region(GuestAddress(0x1100)) - .unwrap() - .as_ptr() - ); - assert_eq!(unsafe { ptr0.offset(0x100) }, ptr1); - } -} diff --git a/vm-virtio/src/vhost_user/vu_common_ctrl.rs b/vm-virtio/src/vhost_user/vu_common_ctrl.rs index ebdfd0da0..527ac53cb 100644 --- a/vm-virtio/src/vhost_user/vu_common_ctrl.rs +++ b/vm-virtio/src/vhost_user/vu_common_ctrl.rs @@ -10,9 +10,9 @@ use std::convert::TryInto; use std::os::unix::io::AsRawFd; use std::sync::Arc; use std::vec::Vec; +use vfio_ioctls::get_host_address_range; use vhost_rs::vhost_user::{Master, VhostUserMaster}; use vhost_rs::{VhostBackend, VhostUserMemoryRegionInfo, VringConfigData}; -use vm_device::get_host_address_range; use vm_memory::{Address, Error as MmapError, GuestMemory, GuestMemoryMmap, GuestMemoryRegion}; use vmm_sys_util::eventfd::EventFd; @@ -74,18 +74,18 @@ pub fn setup_vhost_user_vring( queue_size: queue.actual_size(), flags: 0u32, desc_table_addr: get_host_address_range( - &mem, + mem, queue.desc_table, actual_size * std::mem::size_of::(), ) .ok_or_else(|| Error::DescriptorTableAddress)? as u64, // The used ring is {flags: u16; idx: u16; virtq_used_elem [{id: u16, len: u16}; actual_size]}, // i.e. 4 + (4 + 4) * actual_size. - used_ring_addr: get_host_address_range(&mem, queue.used_ring, 4 + actual_size * 8) + used_ring_addr: get_host_address_range(mem, queue.used_ring, 4 + actual_size * 8) .ok_or_else(|| Error::UsedAddress)? as u64, // The used ring is {flags: u16; idx: u16; elem [u16; actual_size]}, // i.e. 4 + (2) * actual_size. - avail_ring_addr: get_host_address_range(&mem, queue.avail_ring, 4 + actual_size * 2) + avail_ring_addr: get_host_address_range(mem, queue.avail_ring, 4 + actual_size * 2) .ok_or_else(|| Error::AvailAddress)? as u64, log_addr: None, }; diff --git a/vm-virtio/src/vsock/packet.rs b/vm-virtio/src/vsock/packet.rs index 6bb6fc202..168f382bf 100644 --- a/vm-virtio/src/vsock/packet.rs +++ b/vm-virtio/src/vsock/packet.rs @@ -20,7 +20,7 @@ use byteorder::{ByteOrder, LittleEndian}; use super::super::DescriptorChain; use super::defs; use super::{Result, VsockError}; -use vm_device::get_host_address_range; +use vfio_ioctls::get_host_address_range; // The vsock packet header is defined by the C struct: // @@ -117,7 +117,7 @@ impl VsockPacket { } let mut pkt = Self { - hdr: get_host_address_range(&head.mem, head.addr, VSOCK_PKT_HDR_SIZE) + hdr: get_host_address_range(head.mem, head.addr, VSOCK_PKT_HDR_SIZE) .ok_or_else(|| VsockError::GuestMemory)? as *mut u8, buf: None, buf_size: 0, @@ -150,7 +150,7 @@ impl VsockPacket { pkt.buf_size = buf_desc.len as usize; pkt.buf = Some( - get_host_address_range(&buf_desc.mem, buf_desc.addr, pkt.buf_size) + get_host_address_range(buf_desc.mem, buf_desc.addr, pkt.buf_size) .ok_or_else(|| VsockError::GuestMemory)? as *mut u8, ); @@ -182,10 +182,10 @@ impl VsockPacket { let buf_size = buf_desc.len as usize; Ok(Self { - hdr: get_host_address_range(&head.mem, head.addr, VSOCK_PKT_HDR_SIZE) + hdr: get_host_address_range(head.mem, head.addr, VSOCK_PKT_HDR_SIZE) .ok_or_else(|| VsockError::GuestMemory)? as *mut u8, buf: Some( - get_host_address_range(&buf_desc.mem, buf_desc.addr, buf_size) + get_host_address_range(buf_desc.mem, buf_desc.addr, buf_size) .ok_or_else(|| VsockError::GuestMemory)? as *mut u8, ), buf_size, @@ -377,7 +377,7 @@ mod tests { fn set_pkt_len(len: u32, guest_desc: &GuestQDesc, mem: &GuestMemoryMmap) { let hdr_gpa = guest_desc.addr.get(); - let hdr_ptr = get_host_address_range(&mem, GuestAddress(hdr_gpa), VSOCK_PKT_HDR_SIZE) + let hdr_ptr = get_host_address_range(mem, GuestAddress(hdr_gpa), VSOCK_PKT_HDR_SIZE) .unwrap() as *mut u8; let len_ptr = unsafe { hdr_ptr.add(HDROFF_LEN) };