in src/oomd/plugins/Senpai.cpp [551:614]
bool Senpai::tick_immediate_backoff(
const CgroupContext& cgroup_ctx,
CgroupState& state) {
// Wait for interval to prevent making senpai too aggressive
// May wait longer if pressures are too high
if (state.ticks) {
state.ticks--;
return true;
}
auto validate_pressure_maybe = validatePressure(cgroup_ctx);
if (!validate_pressure_maybe) {
return false;
}
auto validate = *validate_pressure_maybe;
if (swap_validation_) {
auto validate_swap_maybe = validateSwap(cgroup_ctx);
if (!validate_swap_maybe) {
return false;
}
validate = validate && *validate_swap_maybe;
}
if (validate) {
auto limit_min_bytes_opt = getLimitMinBytes(cgroup_ctx);
if (!limit_min_bytes_opt) {
return false;
}
auto current_opt = cgroup_ctx.current_usage();
if (!current_opt) {
return false;
}
if (*current_opt > *limit_min_bytes_opt) {
int original_swappiness;
if (modulate_swappiness_) {
original_swappiness =
cgroup_ctx.oomd_ctx().getSystemContext().swappiness;
auto swappiness_factor_maybe = calculateSwappinessFactor(cgroup_ctx);
if (!swappiness_factor_maybe) {
return false;
}
Fs::setSwappiness(original_swappiness * (*swappiness_factor_maybe));
}
OOMD_SCOPE_EXIT {
if (modulate_swappiness_) {
Fs::setSwappiness(original_swappiness);
}
};
// Reclaim slowly towards limit_min_bytes
int64_t reclaim_size = (*current_opt - *limit_min_bytes_opt) * max_probe_;
// Reclaim in number of 4k pages
reclaim_size &= ~0xFFF;
if (!reclaim(cgroup_ctx, reclaim_size)) {
return false;
}
state.probe_count++;
state.probe_bytes += reclaim_size;
state.ticks = interval_;
}
}
return true;
}