aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Senozhatsky <senozhatsky@chromium.org>2021-04-13 20:59:58 +0900
committerCommit Bot <commit-bot@chromium.org>2021-04-20 13:24:17 +0000
commitd78d05bf7fc0df39da69df04eecad75f75b6af5c (patch)
tree330f045e144dd0a8da86529ea806bdf74045b070
parent0b6065aafa609d3567a827de3c5082ee4c0fdee8 (diff)
downloadcrosvm-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.rs7
-rw-r--r--src/plugin/mod.rs7
-rw-r--r--vm_memory/Cargo.toml1
-rw-r--r--vm_memory/src/guest_memory.rs22
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: