Skip to main content

qemu_command_builder/args/
overcommit.rs

1use crate::common::OnOff;
2use crate::parsers::ARG_OVERCOMMIT;
3use crate::to_command::{ToArg, ToCommand};
4use proptest_derive::Arbitrary;
5use std::str::FromStr;
6
7/// Supported values for `mem-lock=`.
8#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
9pub enum OnOffOnfault {
10    On,
11    Off,
12    Onfault,
13}
14
15impl ToArg for OnOffOnfault {
16    fn to_arg(&self) -> &str {
17        match self {
18            OnOffOnfault::On => "on",
19            OnOffOnfault::Off => "off",
20            OnOffOnfault::Onfault => "on-fault",
21        }
22    }
23}
24
25/// Host overcommit hints for QEMU.
26#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
27pub enum Overcommit {
28    MemLock(OnOffOnfault),
29    CpuPm(OnOff),
30}
31
32impl ToCommand for Overcommit {
33    fn command(&self) -> String {
34        ARG_OVERCOMMIT.to_string()
35    }
36    fn to_args(&self) -> Vec<String> {
37        let mut args = vec![];
38
39        match self {
40            Overcommit::MemLock(memlock) => {
41                args.push(format!("mem-lock={}", memlock.to_arg()));
42            }
43            Overcommit::CpuPm(cpupm) => {
44                args.push(format!("cpu-pm={}", cpupm.to_arg()));
45            }
46        }
47
48        args
49    }
50}
51
52impl FromStr for Overcommit {
53    type Err = String;
54
55    fn from_str(s: &str) -> Result<Self, Self::Err> {
56        let (key, value) = s.split_once('=').ok_or_else(|| format!("invalid -overcommit argument: {s}"))?;
57        match key {
58            "mem-lock" => match value {
59                "on" => Ok(Self::MemLock(OnOffOnfault::On)),
60                "off" => Ok(Self::MemLock(OnOffOnfault::Off)),
61                "on-fault" => Ok(Self::MemLock(OnOffOnfault::Onfault)),
62                _ => Err(format!("invalid mem-lock value: {value}")),
63            },
64            "cpu-pm" => Ok(Self::CpuPm(value.parse::<OnOff>().map_err(|_| format!("invalid cpu-pm value: {value}"))?)),
65            other => Err(format!("unsupported -overcommit option: {other}")),
66        }
67    }
68}