std::optional CgroupContext::getEffectiveSwapFree()

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);
  }
}