diff options
author | Sergey Senozhatsky <senozhatsky@chromium.org> | 2021-04-13 20:59:58 +0900 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-20 13:24:17 +0000 |
commit | d78d05bf7fc0df39da69df04eecad75f75b6af5c (patch) | |
tree | 330f045e144dd0a8da86529ea806bdf74045b070 | |
parent | 0b6065aafa609d3567a827de3c5082ee4c0fdee8 (diff) | |
download | crosvm-d78d05bf7fc0df39da69df04eecad75f75b6af5c.tar.gz |
guest_memory: Introduce set_memory_policy() method
set_memory_policy() method accepts MemoryPolicy bitmask - a
set of hints what kind of memory advices GuestMemory can
provide to the kernel. For the time being we support only
one advice - MADV_HUGEPAGE.
BUG=b:174206107
TEST=arc.Boot.vm on hatch-arc-r
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Change-Id: Ibc3e4a2bb2ac7059de80dfba45e1cee3af4c3bcc
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2812546
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
-rw-r--r-- | src/linux.rs | 7 | ||||
-rw-r--r-- | src/plugin/mod.rs | 7 | ||||
-rw-r--r-- | vm_memory/Cargo.toml | 1 | ||||
-rw-r--r-- | vm_memory/src/guest_memory.rs | 22 |
4 files changed, 35 insertions, 2 deletions
diff --git a/src/linux.rs b/src/linux.rs index b78d4ea17..5efa2bb1f 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -55,7 +55,7 @@ use resources::{Alloc, MmioType, SystemAllocator}; use rutabaga_gfx::RutabagaGralloc; use sync::Mutex; use vm_control::*; -use vm_memory::{GuestAddress, GuestMemory}; +use vm_memory::{GuestAddress, GuestMemory, MemoryPolicy}; #[cfg(all(target_arch = "x86_64", feature = "gdb"))] use crate::gdb::{gdb_thread, GdbStub}; @@ -2291,6 +2291,11 @@ pub fn run_config(cfg: Config) -> Result<()> { let guest_mem_layout = Arch::guest_memory_layout(&components).map_err(Error::GuestMemoryLayout)?; let guest_mem = GuestMemory::new(&guest_mem_layout).unwrap(); + let mut mem_policy = MemoryPolicy::empty(); + if components.hugepages { + mem_policy |= MemoryPolicy::USE_HUGEPAGES; + } + guest_mem.set_memory_policy(mem_policy); let kvm = Kvm::new_with_path(&cfg.kvm_device_path).map_err(Error::CreateKvm)?; let vm = KvmVm::new(&kvm, guest_mem).map_err(Error::CreateVm)?; diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index 7da482b3d..8236425c0 100644 --- a/src/plugin/mod.rs +++ b/src/plugin/mod.rs @@ -34,7 +34,7 @@ use base::{ use kvm::{Cap, Datamatch, IoeventAddress, Kvm, Vcpu, VcpuExit, Vm}; use minijail::{self, Minijail}; use net_util::{Error as TapError, Tap, TapT}; -use vm_memory::GuestMemory; +use vm_memory::{GuestMemory, MemoryPolicy}; use self::process::*; use self::vcpu::*; @@ -691,6 +691,11 @@ pub fn run_config(cfg: Config) -> Result<()> { }; let vcpu_count = cfg.vcpu_count.unwrap_or(1) as u32; let mem = GuestMemory::new(&[]).unwrap(); + let mut mem_policy = MemoryPolicy::empty(); + if cfg.hugepages { + mem_policy |= MemoryPolicy::USE_HUGEPAGES; + } + mem.set_memory_policy(mem_policy); let kvm = Kvm::new_with_path(&cfg.kvm_device_path).map_err(Error::CreateKvm)?; let mut vm = Vm::new(&kvm, mem).map_err(Error::CreateVm)?; vm.create_irq_chip().map_err(Error::CreateIrqChip)?; diff --git a/vm_memory/Cargo.toml b/vm_memory/Cargo.toml index df599aacc..a1f569d1b 100644 --- a/vm_memory/Cargo.toml +++ b/vm_memory/Cargo.toml @@ -11,5 +11,6 @@ data_model = { path = "../data_model" } # provided by ebuild libc = "*" base = { path = "../base" } # provided by ebuild syscall_defines = { path = "../syscall_defines" } # provided by ebuild +bitflags = "1" [workspace] diff --git a/vm_memory/src/guest_memory.rs b/vm_memory/src/guest_memory.rs index bb5d11649..62ba134e7 100644 --- a/vm_memory/src/guest_memory.rs +++ b/vm_memory/src/guest_memory.rs @@ -22,6 +22,8 @@ use cros_async::{mem, BackingMemory}; use data_model::volatile_memory::*; use data_model::DataInit; +use bitflags::bitflags; + #[derive(Debug)] pub enum Error { DescriptorChainOverflow, @@ -85,6 +87,12 @@ impl Display for Error { } } +bitflags! { + pub struct MemoryPolicy: u32 { + const USE_HUGEPAGES = 1; + } +} + struct MemoryRegion { mapping: MemoryMapping, guest_base: GuestAddress, @@ -259,6 +267,20 @@ impl GuestMemory { }) } + /// Handles guest memory policy hints/advices. + pub fn set_memory_policy(&self, mem_policy: MemoryPolicy) { + if mem_policy.contains(MemoryPolicy::USE_HUGEPAGES) { + for (_, region) in self.regions.iter().enumerate() { + let ret = region.mapping.use_hugepages(); + + match ret { + Err(err) => println!("Failed to enable HUGEPAGE for mapping {}", err), + Ok(_) => (), + } + } + } + } + /// Perform the specified action on each region's addresses. /// /// Callback is called with arguments: |