diff --git a/src/oom/oomd-util.c b/src/oom/oomd-util.c index 70a1dc941e6..7291e044eb1 100644 --- a/src/oom/oomd-util.c +++ b/src/oom/oomd-util.c @@ -145,7 +145,7 @@ bool oomd_swap_free_below(const OomdSystemContext *ctx, int threshold_permyriad) } int oomd_fetch_cgroup_oom_preference(OomdCGroupContext *ctx, const char *prefix) { - uid_t uid, prefix_uid; + uid_t uid; int r; assert(ctx); @@ -160,28 +160,34 @@ int oomd_fetch_cgroup_oom_preference(OomdCGroupContext *ctx, const char *prefix) if (r < 0) return log_debug_errno(r, "Failed to get owner/group from %s: %m", ctx->path); - r = cg_get_owner(SYSTEMD_CGROUP_CONTROLLER, prefix, &prefix_uid); - if (r < 0) - return log_debug_errno(r, "Failed to get owner/group from %s: %m", ctx->path); + if (uid != 0) { + uid_t prefix_uid; - if (uid == prefix_uid || uid == 0) { - /* Ignore most errors when reading the xattr since it is usually unset and cgroup xattrs are only used - * as an optional feature of systemd-oomd (and the system might not even support them). */ - r = cg_get_xattr_bool(SYSTEMD_CGROUP_CONTROLLER, ctx->path, "user.oomd_avoid"); - if (r == -ENOMEM) - return log_oom_debug(); - if (r < 0 && !ERRNO_IS_XATTR_ABSENT(r)) - log_debug_errno(r, "Failed to get xattr user.oomd_avoid, ignoring: %m"); - ctx->preference = r > 0 ? MANAGED_OOM_PREFERENCE_AVOID : ctx->preference; + r = cg_get_owner(SYSTEMD_CGROUP_CONTROLLER, prefix, &prefix_uid); + if (r < 0) + return log_debug_errno(r, "Failed to get owner/group from %s: %m", prefix); - r = cg_get_xattr_bool(SYSTEMD_CGROUP_CONTROLLER, ctx->path, "user.oomd_omit"); - if (r == -ENOMEM) - return log_oom_debug(); - if (r < 0 && !ERRNO_IS_XATTR_ABSENT(r)) - log_debug_errno(r, "Failed to get xattr user.oomd_omit, ignoring: %m"); - ctx->preference = r > 0 ? MANAGED_OOM_PREFERENCE_OMIT : ctx->preference; - } else - ctx->preference = MANAGED_OOM_PREFERENCE_NONE; + if (uid != prefix_uid) { + ctx->preference = MANAGED_OOM_PREFERENCE_NONE; + return 0; + } + } + + /* Ignore most errors when reading the xattr since it is usually unset and cgroup xattrs are only used + * as an optional feature of systemd-oomd (and the system might not even support them). */ + r = cg_get_xattr_bool(SYSTEMD_CGROUP_CONTROLLER, ctx->path, "user.oomd_avoid"); + if (r == -ENOMEM) + return log_oom_debug(); + if (r < 0 && !ERRNO_IS_XATTR_ABSENT(r)) + log_debug_errno(r, "Failed to get xattr user.oomd_avoid, ignoring: %m"); + ctx->preference = r > 0 ? MANAGED_OOM_PREFERENCE_AVOID : ctx->preference; + + r = cg_get_xattr_bool(SYSTEMD_CGROUP_CONTROLLER, ctx->path, "user.oomd_omit"); + if (r == -ENOMEM) + return log_oom_debug(); + if (r < 0 && !ERRNO_IS_XATTR_ABSENT(r)) + log_debug_errno(r, "Failed to get xattr user.oomd_omit, ignoring: %m"); + ctx->preference = r > 0 ? MANAGED_OOM_PREFERENCE_OMIT : ctx->preference; return 0; }