#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct GlobalHugePagePoolSize
{
pub static_pool_maximum_size: u64,
dynamic_pool_maximum_size: Option<u64>,
base_path: PathBuf,
}
impl GlobalHugePagePoolSize
{
const NumberOfHugePagesFileName: &'static str = "nr_hugepages";
const NumberOfOvercommitHugePagesFileName: &'static str = "nr_overcommit_hugepages";
#[inline(always)]
pub(crate) fn new(sys_path: &SysPath, huge_page_size: HugePageSize, base_path: impl FnOnce(&SysPath, HugePageSize) -> PathBuf) -> Option<Self>
{
let base_path = base_path(sys_path, huge_page_size);
if !base_path.exists()
{
return None
}
let base_path_ref = base_path.as_path();
#[inline(always)]
fn read(base_path: &Path, file_name: &str) -> u64
{
base_path.to_path_buf().append(file_name).read_value().unwrap()
}
Some
(
Self
{
static_pool_maximum_size: read(base_path_ref, Self::NumberOfHugePagesFileName),
dynamic_pool_maximum_size: if huge_page_size.is_a_gigantic_huge_page()
{
None
}
else
{
Some(read(base_path_ref, Self::NumberOfOvercommitHugePagesFileName))
},
base_path,
}
)
}
#[inline(always)]
pub fn dynamic_pool_maximum_size(&self) -> u64
{
self.dynamic_pool_maximum_size.unwrap_or(0)
}
#[inline(always)]
pub fn maximum_number_of_huge_pages_possible(&self) -> u64
{
self.static_pool_maximum_size + self.dynamic_pool_maximum_size()
}
#[inline(always)]
pub fn change_static_pool_maximum_size(self, maximum_size: u64)
{
assert_effective_user_id_is_root(&format!("change_static_pool_maximum_size '{:?}'", maximum_size));
self.write(Self::NumberOfHugePagesFileName, maximum_size);
}
#[inline(always)]
pub fn change_dynamic_pool_maximum_size(self, maximum_size: u64)
{
assert_effective_user_id_is_root(&format!("change_dynamic_pool_maximum_size '{:?}'", maximum_size));
if self.dynamic_pool_maximum_size.is_some()
{
self.write(Self::NumberOfOvercommitHugePagesFileName, maximum_size)
}
}
#[inline(always)]
fn write(self, file_name: &str, number: u64)
{
self.base_path.append(file_name).write_value(UnpaddedDecimalInteger(number)).unwrap()
}
}