in src/oomd/CgroupContext.cpp [275:308]
std::optional<int64_t> CgroupContext::getEffectiveSwapFree(Error* err) const {
if (cgroup_.isRoot()) {
const auto& sys = ctx_.getSystemContext();
return sys.swaptotal - sys.swapused;
}
auto swap_max_opt = swap_max(err);
if (!swap_max_opt) {
return std::nullopt;
}
auto swap_usage_opt = swap_usage(err);
if (!swap_usage_opt) {
return std::nullopt;
}
auto local_free = *swap_max_opt - *swap_usage_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_free =
parent_ctx->get().effective_swap_free(err);
!parent_effective_swap_free) {
return std::nullopt;
} else {
return std::min(*parent_effective_swap_free, local_free);
}
}