diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 80e685a15..ef4ae85ff 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -3531,6 +3531,7 @@ dependencies = [ "maplit", "models", "num_cpus", + "pciclient", "percent-encoding", "pest", "pest_derive", diff --git a/sources/api/schnauzer/Cargo.toml b/sources/api/schnauzer/Cargo.toml index c29e773b4..a1dfacd87 100644 --- a/sources/api/schnauzer/Cargo.toml +++ b/sources/api/schnauzer/Cargo.toml @@ -29,6 +29,7 @@ log.workspace = true maplit.workspace = true models.workspace = true num_cpus.workspace = true +pciclient.workspace = true percent-encoding.workspace = true pest.workspace = true pest_derive.workspace = true diff --git a/sources/api/schnauzer/src/helpers/mod.rs b/sources/api/schnauzer/src/helpers/mod.rs index 7c9f865ec..c665233da 100644 --- a/sources/api/schnauzer/src/helpers/mod.rs +++ b/sources/api/schnauzer/src/helpers/mod.rs @@ -258,6 +258,9 @@ mod error { source: std::net::AddrParseError, }, + #[snafu(display("Failed to check if EFA device is attached: {}", source))] + CheckEfaFailure { source: pciclient::Error }, + #[snafu(display( "Expected an absolute URL, got '{}' in template '{}': '{}'", url_str, @@ -1311,7 +1314,21 @@ fn oci_spec_capabilities(value: &Value) -> Result { fn oci_spec_resource_limits( value: &Value, ) -> Result, RenderError> { - Ok(serde_json::from_value(value.clone())?) + let mut rlimits: HashMap = + serde_json::from_value(value.clone())?; + if !rlimits.contains_key(&OciDefaultsResourceLimitType::MaxLockedMemory) { + if pciclient::is_efa_attached().context(error::CheckEfaFailureSnafu)? { + let max_locked_memory_limits = OciDefaultsResourceLimitV1 { + soft_limit: -1, + hard_limit: -1, + }; + rlimits.insert( + OciDefaultsResourceLimitType::MaxLockedMemory, + max_locked_memory_limits, + ); + } + } + Ok(rlimits) } // =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^=