From fe5b2673269e58a652e83172d0ed87d07a665d99 Mon Sep 17 00:00:00 2001 From: Alex Lyn Date: Sun, 12 Apr 2026 16:01:19 +0200 Subject: [PATCH] dragonball: Adapt VFIO DMA calls to vfio-ioctls 0.6 API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The vfio-ioctls 0.6.0 crate changed the vfio_dma_map signature: the host address parameter is now a raw pointer (*mut u8) instead of u64, and the size parameter is usize instead of u64. Since the kernel uses the host address to set up DMA mappings to physical memory — and the caller must guarantee the memory behind that pointer remains valid for the lifetime of the mapping — upstream marked vfio_dma_map as unsafe fn. Wrap vfio_dma_map calls in unsafe blocks and adjust the type casts accordingly. vfio_dma_unmap only needed the usize cast for the size parameter (it does not take a host address, so it remains safe). Bump workspace dependencies: - vfio-bindings 0.6.1 -> 0.6.2 - vfio-ioctls 0.5.0 -> 0.6.0 Signed-off-by: Alex Lyn Signed-off-by: Fabiano Fidêncio --- Cargo.lock | 47 +++++++------------ Cargo.toml | 4 +- src/dragonball/dbs_pci/src/vfio.rs | 28 ++++++----- .../src/device_manager/vfio_dev_mgr/mod.rs | 10 ++-- 4 files changed, 42 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36f85a42a9..b7a6ebf650 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1522,7 +1522,7 @@ checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" name = "dbs-acpi" version = "0.1.0" dependencies = [ - "vm-memory 0.17.1", + "vm-memory", ] [[package]] @@ -1534,7 +1534,7 @@ dependencies = [ "libc", "nix 0.23.2", "thiserror 1.0.69", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -1556,7 +1556,7 @@ dependencies = [ "nix 0.26.4", "test-utils", "thiserror 1.0.69", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -1575,7 +1575,7 @@ dependencies = [ "test-utils", "thiserror 1.0.69", "vm-fdt", - "vm-memory 0.17.1", + "vm-memory", ] [[package]] @@ -1637,7 +1637,7 @@ dependencies = [ "vfio-bindings", "vfio-ioctls", "virtio-queue", - "vm-memory 0.17.1", + "vm-memory", ] [[package]] @@ -1712,7 +1712,7 @@ dependencies = [ "vhost", "virtio-bindings", "virtio-queue", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -1904,7 +1904,7 @@ dependencies = [ "vfio-bindings", "vfio-ioctls", "virtio-queue", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -2320,7 +2320,7 @@ dependencies = [ "nix 0.24.3", "radix_trie", "virtio-queue", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -3978,7 +3978,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de72cb02c55ecffcf75fe78295926f872eb6eb0a58d629c58a8c324dc26380f6" dependencies = [ - "vm-memory 0.17.1", + "vm-memory", ] [[package]] @@ -4647,7 +4647,7 @@ dependencies = [ "serde", "serde_json", "thiserror 1.0.69", - "vm-memory 0.17.1", + "vm-memory", ] [[package]] @@ -4676,7 +4676,7 @@ dependencies = [ "tar", "tokio", "url", - "vm-memory 0.17.1", + "vm-memory", ] [[package]] @@ -8561,15 +8561,15 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vfio-bindings" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4bc5b4aade27640cea4ee1ce50ef3614598050dc97e44714b9daea779d1b59a" +checksum = "188dac3057a0cbc94470085204c84b82ff7ec5dac629a514323cd133d1f9abe0" [[package]] name = "vfio-ioctls" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c85bf46a63452d82e7df8e3ed052f07969507aeb5685ef9bf01d8db3ea74c36" +checksum = "d4b1d98dff7f0d219278e406323e7eda4d426447bd203c7828189baf0d8c07b7" dependencies = [ "byteorder", "kvm-bindings", @@ -8578,7 +8578,7 @@ dependencies = [ "log", "thiserror 2.0.18", "vfio-bindings", - "vm-memory 0.16.2", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -8591,7 +8591,7 @@ dependencies = [ "bitflags 2.11.0", "libc", "uuid 1.22.0", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -8643,7 +8643,7 @@ dependencies = [ "libc", "log", "virtio-bindings", - "vm-memory 0.17.1", + "vm-memory", "vmm-sys-util 0.15.0", ] @@ -8653,17 +8653,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e21282841a059bb62627ce8441c491f09603622cd5a21c43bfedc85a2952f23" -[[package]] -name = "vm-memory" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd5e56d48353c5f54ef50bd158a0452fc82f5383da840f7b8efc31695dd3b9d" -dependencies = [ - "libc", - "thiserror 1.0.69", - "winapi", -] - [[package]] name = "vm-memory" version = "0.17.1" diff --git a/Cargo.toml b/Cargo.toml index f80fa2a74b..95a041c2e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -83,8 +83,8 @@ kvm-bindings = "0.14.0" kvm-ioctls = "0.24.0" linux-loader = "0.13.0" seccompiler = "0.5.0" -vfio-bindings = "0.6.1" -vfio-ioctls = "0.5.0" +vfio-bindings = "0.6.2" +vfio-ioctls = "0.6.0" virtio-bindings = "0.2.0" virtio-queue = "0.17.0" vm-fdt = "0.3.0" diff --git a/src/dragonball/dbs_pci/src/vfio.rs b/src/dragonball/dbs_pci/src/vfio.rs index 99de1414de..d5348ae6b2 100644 --- a/src/dragonball/dbs_pci/src/vfio.rs +++ b/src/dragonball/dbs_pci/src/vfio.rs @@ -706,11 +706,13 @@ impl Region { // FIXME: add readonly flag into vfio_dma_map in future PR when it is needed. // issue #8725 - if let Err(e) = vfio_container.vfio_dma_map( - self.start.raw_value() + self.mmaps[i].mmap_offset, - self.mmaps[i].mmap_size, - host_addr as u64, - ) { + if let Err(e) = unsafe { + vfio_container.vfio_dma_map( + self.start.raw_value() + self.mmaps[i].mmap_offset, + self.mmaps[i].mmap_size as usize, + host_addr as *mut u8, + ) + } { error!("vfio dma map failed, pci p2p dma may not work, due to {e:?}"); } } @@ -744,7 +746,7 @@ impl Region { if let Err(e) = vfio_container.vfio_dma_unmap( self.start.raw_value() + self.mmaps[i].mmap_offset, - self.mmaps[i].mmap_size, + self.mmaps[i].mmap_size as usize, ) { error!("vfio dma unmap failed, pci p2p dma may not work, due to {e:?}"); } @@ -771,7 +773,7 @@ impl Region { for i in 0..self.mmaps.len() { if let Err(e) = vfio_container.vfio_dma_unmap( self.start.raw_value() + self.mmaps[i].mmap_offset, - self.mmaps[i].mmap_size, + self.mmaps[i].mmap_size as usize, ) { error!("vfio dma unmap failed, pci p2p dma may not work, due to {e:?}"); } @@ -779,11 +781,13 @@ impl Region { self.set_user_memory_region(i, true, vm)?; // FIXME: add readonly flag into vfio_dma_map in future PR when it is needed. // issue #8725 - if let Err(e) = vfio_container.vfio_dma_map( - self.start.raw_value() + self.mmaps[i].mmap_offset, - self.mmaps[i].mmap_size, - self.mmaps[i].mmap_host_addr, - ) { + if let Err(e) = unsafe { + vfio_container.vfio_dma_map( + self.start.raw_value() + self.mmaps[i].mmap_offset, + self.mmaps[i].mmap_size as usize, + self.mmaps[i].mmap_host_addr as *mut u8, + ) + } { error!("vfio dma map failed, pci p2p dma may not work, due to {e:?}"); } } diff --git a/src/dragonball/src/device_manager/vfio_dev_mgr/mod.rs b/src/dragonball/src/device_manager/vfio_dev_mgr/mod.rs index f176ffbceb..a9f89a467c 100644 --- a/src/dragonball/src/device_manager/vfio_dev_mgr/mod.rs +++ b/src/dragonball/src/device_manager/vfio_dev_mgr/mod.rs @@ -499,9 +499,11 @@ impl VfioDeviceMgr { "readonly" => readonly, ); //FIXME: add readonly flag when related commit is pushed to upstream vfio-ioctls - self.get_vfio_container()? - .vfio_dma_map(iova, size, user_addr) - .map_err(VfioDeviceError::VfioIoctlError)?; + unsafe { + self.get_vfio_container()? + .vfio_dma_map(iova, size as usize, user_addr as *mut u8) + } + .map_err(VfioDeviceError::VfioIoctlError)?; self.locked_vm_size += size; Ok(()) } @@ -516,7 +518,7 @@ impl VfioDeviceMgr { let size = region.len(); self.get_vfio_container()? - .vfio_dma_unmap(gpa, size) + .vfio_dma_unmap(gpa, size as usize) .map_err(VfioDeviceError::VfioIoctlError)?; self.locked_vm_size -= size;