diff options
Diffstat (limited to 'src/oom/oomd-manager.h')
-rw-r--r-- | src/oom/oomd-manager.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/oom/oomd-manager.h b/src/oom/oomd-manager.h new file mode 100644 index 0000000..3f3eb5a --- /dev/null +++ b/src/oom/oomd-manager.h @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "conf-parser.h" +#include "oomd-util.h" +#include "sd-event.h" +#include "varlink.h" + +/* Polling interval for monitoring stats */ +#define INTERVAL_USEC (1 * USEC_PER_SEC) + +/* Used to weight the averages */ +#define AVERAGE_SIZE_DECAY 4 + +/* Take action if 10s of memory pressure > 60 for more than 30s. We use the "full" value from PSI so this is the + * percentage of time all tasks were delayed (i.e. unproductive). + * Generally 60 or higher might be acceptable for something like system.slice with no memory.high set; processes in + * system.slice are assumed to be less latency sensitive. */ +#define PRESSURE_DURATION_USEC (30 * USEC_PER_SEC) +#define DEFAULT_MEM_PRESSURE_LIMIT 60 +#define DEFAULT_SWAP_USED_LIMIT 90 + +#define POST_ACTION_DELAY_USEC (15 * USEC_PER_SEC) + +typedef struct Manager Manager; + +struct Manager { + sd_bus *bus; + sd_event *event; + + Hashmap *polkit_registry; + + bool dry_run; + unsigned swap_used_limit; + loadavg_t default_mem_pressure_limit; + + /* k: cgroup paths -> v: OomdCGroupContext + * Used to detect when to take action. */ + Hashmap *monitored_swap_cgroup_contexts; + Hashmap *monitored_mem_pressure_cgroup_contexts; + + OomdSystemContext system_context; + + usec_t post_action_delay_start; + + sd_event_source *cgroup_context_event_source; + + Varlink *varlink; +}; + +void manager_free(Manager *m); +DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); + +int manager_new(Manager **ret); + +int manager_start(Manager *m, bool dry_run, int swap_used_limit, int mem_pressure_limit); + +int manager_get_dump_string(Manager *m, char **ret); + +CONFIG_PARSER_PROTOTYPE(config_parse_oomd_default); |