mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-02 21:00:55 +00:00
xenclient: implement page claims for early low memory warning
This commit is contained in:
parent
001c22fd69
commit
7d9652636f
@ -10,7 +10,7 @@ use crate::sys::{
|
|||||||
XEN_DOMCTL_GETDOMAININFO, XEN_DOMCTL_GETPAGEFRAMEINFO3, XEN_DOMCTL_GETVCPUCONTEXT,
|
XEN_DOMCTL_GETDOMAININFO, XEN_DOMCTL_GETPAGEFRAMEINFO3, XEN_DOMCTL_GETVCPUCONTEXT,
|
||||||
XEN_DOMCTL_HYPERCALL_INIT, XEN_DOMCTL_INTERFACE_VERSION, XEN_DOMCTL_MAX_MEM,
|
XEN_DOMCTL_HYPERCALL_INIT, XEN_DOMCTL_INTERFACE_VERSION, XEN_DOMCTL_MAX_MEM,
|
||||||
XEN_DOMCTL_MAX_VCPUS, XEN_DOMCTL_PAUSEDOMAIN, XEN_DOMCTL_SETVCPUCONTEXT,
|
XEN_DOMCTL_MAX_VCPUS, XEN_DOMCTL_PAUSEDOMAIN, XEN_DOMCTL_SETVCPUCONTEXT,
|
||||||
XEN_DOMCTL_SET_ADDRESS_SIZE, XEN_DOMCTL_UNPAUSEDOMAIN, XEN_MEM_MEMORY_MAP,
|
XEN_DOMCTL_SET_ADDRESS_SIZE, XEN_DOMCTL_UNPAUSEDOMAIN, XEN_MEM_CLAIM_PAGES, XEN_MEM_MEMORY_MAP,
|
||||||
XEN_MEM_POPULATE_PHYSMAP,
|
XEN_MEM_POPULATE_PHYSMAP,
|
||||||
};
|
};
|
||||||
use libc::{c_int, mmap, usleep, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE};
|
use libc::{c_int, mmap, usleep, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE};
|
||||||
@ -644,6 +644,28 @@ impl XenCall {
|
|||||||
Ok(extents)
|
Ok(extents)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn claim_pages(&self, domid: u32, pages: u64) -> Result<(), XenCallError> {
|
||||||
|
trace!(
|
||||||
|
"memory fd={} claim_pages domid={} pages={}",
|
||||||
|
self.handle.as_raw_fd(),
|
||||||
|
domid,
|
||||||
|
pages
|
||||||
|
);
|
||||||
|
let mut reservation = MemoryReservation {
|
||||||
|
extent_start: 0,
|
||||||
|
nr_extents: pages,
|
||||||
|
extent_order: 0,
|
||||||
|
mem_flags: 0,
|
||||||
|
domid: domid as u16,
|
||||||
|
};
|
||||||
|
self.hypercall2(
|
||||||
|
HYPERVISOR_MEMORY_OP,
|
||||||
|
XEN_MEM_CLAIM_PAGES as c_ulong,
|
||||||
|
addr_of_mut!(reservation) as c_ulong,
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn mmuext(
|
pub fn mmuext(
|
||||||
&self,
|
&self,
|
||||||
domid: u32,
|
domid: u32,
|
||||||
|
@ -365,6 +365,7 @@ pub struct MultiCallEntry {
|
|||||||
|
|
||||||
pub const XEN_MEM_POPULATE_PHYSMAP: u32 = 6;
|
pub const XEN_MEM_POPULATE_PHYSMAP: u32 = 6;
|
||||||
pub const XEN_MEM_MEMORY_MAP: u32 = 9;
|
pub const XEN_MEM_MEMORY_MAP: u32 = 9;
|
||||||
|
pub const XEN_MEM_CLAIM_PAGES: u32 = 24;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
@ -478,6 +478,7 @@ impl ArchBootSetup for X86BootSetup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn meminit(&mut self, setup: &mut BootSetup, total_pages: u64) -> Result<(), XenClientError> {
|
fn meminit(&mut self, setup: &mut BootSetup, total_pages: u64) -> Result<(), XenClientError> {
|
||||||
|
setup.call.claim_pages(setup.domid, total_pages)?;
|
||||||
let mut vmemranges: Vec<VmemRange> = Vec::new();
|
let mut vmemranges: Vec<VmemRange> = Vec::new();
|
||||||
let stub = VmemRange {
|
let stub = VmemRange {
|
||||||
start: 0,
|
start: 0,
|
||||||
@ -584,6 +585,7 @@ impl ArchBootSetup for X86BootSetup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setup.phys.load_p2m(p2m);
|
setup.phys.load_p2m(p2m);
|
||||||
|
setup.call.claim_pages(setup.domid, 0)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user