summaryrefslogtreecommitdiff
path: root/src/oom
diff options
context:
space:
mode:
authorAnita Zhang <the.anitazha@gmail.com>2020-10-22 02:03:20 -0700
committerAnita Zhang <the.anitazha@gmail.com>2020-10-22 17:04:26 -0700
commit532855bead422499e6e5f85b6ebf3af28e652022 (patch)
tree78e0c06f04463bd7032ce35838c29917050d2c8e /src/oom
parente4ff80404a71746864d29c0a3dc019a309277e53 (diff)
downloadsystemd-532855bead422499e6e5f85b6ebf3af28e652022.tar.gz
oomd: make start up swap check more robust
Diffstat (limited to 'src/oom')
-rw-r--r--src/oom/oomd.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
index 2c0031aeac..203395c1e7 100644
--- a/src/oom/oomd.c
+++ b/src/oom/oomd.c
@@ -117,6 +117,8 @@ static int parse_argv(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
_cleanup_(notify_on_cleanup) const char *notify_msg = NULL;
_cleanup_(manager_freep) Manager *m = NULL;
+ _cleanup_free_ char *swap = NULL;
+ unsigned long long s = 0;
int r;
log_setup_service();
@@ -131,8 +133,17 @@ static int run(int argc, char *argv[]) {
/* Do some basic requirement checks for running systemd-oomd. It's not exhaustive as some of the other
* requirements do not have a reliable means to check for in code. */
- if (access("/proc/swaps", F_OK) < 0)
- return log_error_errno(errno, "Swap not enabled: %m");
+
+ /* SwapTotal is always available in /proc/meminfo and defaults to 0, even on swap-disabled kernels. */
+ r = get_proc_field("/proc/meminfo", "SwapTotal", WHITESPACE, &swap);
+ if (r < 0)
+ return log_error_errno(r, "Failed to get SwapTotal from /proc/meminfo: %m");
+
+ r = safe_atollu(swap, &s);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse SwapTotal from /proc/meminfo: %s: %m", swap);
+ if (s == 0)
+ return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Requires swap to operate");
if (!is_pressure_supported())
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Pressure Stall Information (PSI) is not supported");