mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
vmm: Mark guest RAM pages as mergeable
In case the VM is started with the flag "--memory mergeable=on", it means the user expects the guest RAM pages to be marked as mergeable. This commit relies on the madvise(MADV_MERGEABLE) system call to inform the host kernel about these pages. Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
committed by
Rob Bradford
parent
880f62bab8
commit
e4e8062dda
@@ -301,9 +301,36 @@ impl Vm {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Safe because the guest regions are guaranteed not to overlap.
|
// Safe because the guest regions are guaranteed not to overlap.
|
||||||
unsafe { fd.set_user_memory_region(mem_region) }
|
unsafe { fd.set_user_memory_region(mem_region) }?;
|
||||||
|
|
||||||
|
// Mark the pages as mergeable if explicitly asked for.
|
||||||
|
if config.memory.mergeable {
|
||||||
|
// Safe because the address and size are valid since the
|
||||||
|
// mmap succeeded.
|
||||||
|
let ret = unsafe {
|
||||||
|
libc::madvise(
|
||||||
|
region.as_ptr() as *mut libc::c_void,
|
||||||
|
region.len() as libc::size_t,
|
||||||
|
libc::MADV_MERGEABLE,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
if ret != 0 {
|
||||||
|
let err = io::Error::last_os_error();
|
||||||
|
// Safe to unwrap because the error is constructed with
|
||||||
|
// last_os_error(), which ensures the output will be Some().
|
||||||
|
let errno = err.raw_os_error().unwrap();
|
||||||
|
if errno == libc::EINVAL {
|
||||||
|
warn!("kernel not configured with CONFIG_KSM");
|
||||||
|
} else {
|
||||||
|
warn!("madvise error: {}", err);
|
||||||
|
}
|
||||||
|
warn!("failed to mark pages as mergeable");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::GuestMemory(MmapError::NoMemoryRegion))?;
|
.map_err(|_: io::Error| Error::GuestMemory(MmapError::NoMemoryRegion))?;
|
||||||
|
|
||||||
// Set TSS
|
// Set TSS
|
||||||
fd.set_tss_address(arch::x86_64::layout::KVM_TSS_ADDRESS.raw_value() as usize)
|
fd.set_tss_address(arch::x86_64::layout::KVM_TSS_ADDRESS.raw_value() as usize)
|
||||||
|
|||||||
Reference in New Issue
Block a user