in src/oomd/CgroupContext.cpp [313:355]
std::optional<double> CgroupContext::getEffectiveSwapUtilPct(Error* err) const {
if (cgroup_.isRoot()) {
const auto& sys = ctx_.getSystemContext();
if (sys.swaptotal == 0) {
return 0;
}
return static_cast<double>(sys.swapused) /
static_cast<double>(sys.swaptotal);
}
auto swap_max_opt = swap_max(err);
if (!swap_max_opt) {
return std::nullopt;
}
if (*swap_max_opt == 0) {
return 0;
}
auto swap_usage_opt = swap_usage(err);
if (!swap_usage_opt) {
return std::nullopt;
}
auto local_util_pct =
static_cast<double>(*swap_usage_opt) / static_cast<double>(*swap_max_opt);
auto parent_cgroup = cgroup_.getParent();
auto parent_ctx = ctx_.addToCacheAndGet(parent_cgroup);
if (!parent_ctx) {
if (err) {
*err = Error::INVALID_CGROUP;
}
return std::nullopt;
}
if (auto parent_effective_swap_util_pct =
parent_ctx->get().effective_swap_util_pct(err);
!parent_effective_swap_util_pct) {
return std::nullopt;
} else {
return std::max(*parent_effective_swap_util_pct, local_util_pct);
}
}