1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
4 #include "conf-parser.h"
9 /* Polling interval for monitoring stats */
10 #define INTERVAL_USEC (1 * USEC_PER_SEC)
12 /* Used to weight the averages */
13 #define AVERAGE_SIZE_DECAY 4
15 /* Take action if 10s of memory pressure > 60 for more than 30s. We use the "full" value from PSI so this is the
16 * percentage of time all tasks were delayed (i.e. unproductive).
17 * Generally 60 or higher might be acceptable for something like system.slice with no memory.high set; processes in
18 * system.slice are assumed to be less latency sensitive. */
19 #define DEFAULT_MEM_PRESSURE_DURATION_USEC (30 * USEC_PER_SEC)
20 #define DEFAULT_MEM_PRESSURE_LIMIT_PERCENT 60
21 #define DEFAULT_SWAP_USED_LIMIT_PERCENT 90
23 #define RECLAIM_DURATION_USEC (30 * USEC_PER_SEC)
24 #define POST_ACTION_DELAY_USEC (15 * USEC_PER_SEC)
26 typedef struct Manager Manager
;
32 Hashmap
*polkit_registry
;
35 int swap_used_limit_permyriad
;
36 loadavg_t default_mem_pressure_limit
;
37 usec_t default_mem_pressure_duration_usec
;
39 /* k: cgroup paths -> v: OomdCGroupContext
40 * Used to detect when to take action. */
41 Hashmap
*monitored_swap_cgroup_contexts
;
42 Hashmap
*monitored_mem_pressure_cgroup_contexts
;
44 OomdSystemContext system_context
;
46 usec_t last_reclaim_at
;
47 usec_t post_action_delay_start
;
49 sd_event_source
*cgroup_context_event_source
;
54 Manager
* manager_free(Manager
*m
);
55 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
57 int manager_new(Manager
**ret
);
59 int manager_start(Manager
*m
, bool dry_run
, int swap_used_limit_permyriad
, int mem_pressure_limit_permyriad
, usec_t mem_pressure_usec
);
61 int manager_get_dump_string(Manager
*m
, char **ret
);
63 CONFIG_PARSER_PROTOTYPE(config_parse_oomd_default
);