Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 27 additions & 16 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/acpi-tables/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ bench = false
[dependencies]
displaydoc = "0.2.5"
thiserror = "2.0.17"
vm-memory = { version = "0.16.2", features = ["backend-mmap", "backend-bitmap"] }
vm-memory = { version = "0.17.0", features = ["backend-mmap", "backend-bitmap"] }
zerocopy = { version = "0.8.27", features = ["derive"] }

[lints]
Expand Down
10 changes: 5 additions & 5 deletions src/vmm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ displaydoc = "0.2.5"
event-manager = "0.4.1"
gdbstub = { version = "0.7.7", optional = true }
gdbstub_arch = { version = "0.3.2", optional = true }
kvm-bindings = { version = "0.13.0", features = ["fam-wrappers", "serde"] }
kvm-ioctls = "0.23.0"
kvm-bindings = { version = "0.14.0", features = ["fam-wrappers", "serde"] }
kvm-ioctls = "0.24.0"
libc = "0.2.176"
linux-loader = "0.13.0"
linux-loader = "0.13.1"
log = { version = "0.4.28", features = ["std", "serde"] }
log-instrument = { path = "../log-instrument", optional = true }
memfd = "0.6.5"
Expand All @@ -53,11 +53,11 @@ utils = { path = "../utils" }
uuid = "1.18.1"
vhost = { version = "0.14.0", features = ["vhost-user-frontend"] }
vm-allocator = { version = "0.1.3", features = ["serde"] }
vm-memory = { version = "0.16.2", features = [
vm-memory = { version = "0.17.0", features = [
"backend-mmap",
"backend-bitmap",
] }
vm-superio = "0.8.0"
vm-superio = "0.8.1"
vmm-sys-util = { version = "0.14.0", features = ["with-serde"] }
zerocopy = { version = "0.8.27" }

Expand Down
10 changes: 4 additions & 6 deletions src/vmm/src/devices/virtio/vhost_user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use std::sync::Arc;
use vhost::vhost_user::message::*;
use vhost::vhost_user::{Frontend, VhostUserFrontend};
use vhost::{Error as VhostError, VhostBackend, VhostUserMemoryRegionInfo, VringConfigData};
use vm_memory::{Address, Error as MmapError, GuestMemory, GuestMemoryError, GuestMemoryRegion};
use vm_memory::{Address, GuestMemory, GuestMemoryError, GuestMemoryRegion};
use vmm_sys_util::eventfd::EventFd;

use crate::devices::virtio::queue::Queue;
Expand Down Expand Up @@ -51,8 +51,8 @@ pub enum VhostUserError {
VhostUserSetVringKick(VhostError),
/// Set vring enable failed: {0}
VhostUserSetVringEnable(VhostError),
/// Failed to read vhost eventfd: {0}
VhostUserMemoryRegion(MmapError),
/// Failed to read vhost eventfd: No memory region found
VhostUserNoMemoryRegion,
/// Invalid used address
UsedAddress(GuestMemoryError),
}
Expand Down Expand Up @@ -371,9 +371,7 @@ impl<T: VhostUserHandleBackend> VhostUserHandleImpl<T> {
let (mmap_handle, mmap_offset) = match region.file_offset() {
Some(_file_offset) => (_file_offset.file().as_raw_fd(), _file_offset.start()),
None => {
return Err(VhostUserError::VhostUserMemoryRegion(
MmapError::NoMemoryRegion,
));
return Err(VhostUserError::VhostUserNoMemoryRegion);
}
};

Expand Down
46 changes: 19 additions & 27 deletions src/vmm/src/vstate/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@ pub use vm_memory::{
Address, ByteValued, Bytes, FileOffset, GuestAddress, GuestMemory, GuestMemoryRegion,
GuestUsize, MemoryRegionAddress, MmapRegion, address,
};
use vm_memory::{Error as VmMemoryError, GuestMemoryError, WriteVolatile};
use vm_memory::{GuestMemoryError, WriteVolatile};
use vmm_sys_util::errno;

use crate::DirtyBitmap;
use crate::utils::{get_page_size, u64_to_usize};
use crate::vmm_config::machine_config::HugePageConfig;

/// Type of GuestMemoryMmap.
pub type GuestMemoryMmap = vm_memory::GuestMemoryMmap<Option<AtomicBitmap>>;
/// Type of GuestRegionMmap.
pub type GuestRegionMmap = vm_memory::GuestRegionMmap<Option<AtomicBitmap>>;
/// Type of GuestMemoryMmap.
pub type GuestMemoryMmap = vm_memory::GuestRegionCollection<GuestRegionMmap>;
/// Type of GuestMmapRegion.
pub type GuestMmapRegion = vm_memory::MmapRegion<Option<AtomicBitmap>>;

Expand All @@ -40,8 +40,8 @@ pub enum MemoryError {
WriteMemory(GuestMemoryError),
/// Cannot create mmap region: {0}
MmapRegionError(MmapRegionError),
/// Cannot create guest memory: {0}
VmMemoryError(VmMemoryError),
/// Cannot create guest memory
VmMemoryError,
/// Cannot create memfd: {0}
Memfd(memfd::Error),
/// Cannot resize memfd file: {0}
Expand Down Expand Up @@ -86,7 +86,7 @@ pub fn create(
builder.build().map_err(MemoryError::MmapRegionError)?,
start,
)
.map_err(MemoryError::VmMemoryError)
.ok_or(MemoryError::VmMemoryError)
})
.collect::<Result<Vec<_>, _>>()
}
Expand Down Expand Up @@ -203,12 +203,10 @@ impl GuestMemoryExtension for GuestMemoryMmap {

/// Mark memory range as dirty
fn mark_dirty(&self, addr: GuestAddress, len: usize) {
let _ = self.try_access(len, addr, |_total, count, caddr, region| {
if let Some(bitmap) = region.bitmap() {
bitmap.mark_dirty(u64_to_usize(caddr.0), count);
}
Ok(count)
});
// ignore invalid ranges using .flatten()
for slice in self.get_slices(addr, len).flatten() {
slice.bitmap().mark_dirty(0, slice.len());
}
}

/// Dumps all contents of GuestMemoryMmap to a writer.
Expand Down Expand Up @@ -283,7 +281,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
/// Resets all the memory region bitmaps
fn reset_dirty(&self) {
self.iter().for_each(|region| {
if let Some(bitmap) = region.bitmap() {
if let Some(bitmap) = (**region).bitmap() {
bitmap.reset();
}
})
Expand Down Expand Up @@ -413,20 +411,14 @@ mod tests {

// Check that the dirty memory was set correctly
for (addr, len, dirty) in &dirty_map {
guest_memory
.try_access(
*len,
GuestAddress(*addr as u64),
|_total, count, caddr, region| {
let offset = usize::try_from(caddr.0).unwrap();
let bitmap = region.bitmap().as_ref().unwrap();
for i in offset..offset + count {
assert_eq!(bitmap.dirty_at(i), *dirty);
}
Ok(count)
},
)
.unwrap();
for slice in guest_memory
.get_slices(GuestAddress(*addr as u64), *len)
.flatten()
{
for i in 0..slice.len() {
assert_eq!(slice.bitmap().dirty_at(i), *dirty);
}
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/vmm/src/vstate/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ pub enum VmError {
CreateVcpu(VcpuError),
/// The number of configured slots is bigger than the maximum reported by KVM: {0}
NotEnoughMemorySlots(u32),
/// Memory Error: {0}
VmMemory(#[from] vm_memory::Error),
/// Failed to add a memory region: {0}
InsertRegion(#[from] vm_memory::GuestRegionCollectionError),
/// Error calling mincore: {0}
Mincore(vmm_sys_util::errno::Error),
/// ResourceAllocator error: {0}
Expand Down
Loading