]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: use our usual UINT32_MAX scaling for OOMD limits
authorLennart Poettering <lennart@poettering.net>
Wed, 17 Feb 2021 16:51:27 +0000 (17:51 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 18 Feb 2021 21:39:37 +0000 (22:39 +0100)
So far OOMD limits used permyriads, as an upgrade from the original
percent.

The rest of our codebase typically scales stuff relative to UINT32_MAX.
Let's clean this up, an make sure this happens here too. This is
particularly relevant, as this is exposed in unit files and API, and
before we mark this stable we should get the APIs right.

man/org.freedesktop.systemd1.xml
src/core/cgroup.c
src/core/cgroup.h
src/core/core-varlink.c
src/core/dbus-cgroup.c
src/core/load-fragment-gperf.gperf.m4
src/core/load-fragment.c
src/oom/oomd-manager.c
src/shared/bus-unit-util.c

index 2da0ff0579d529e723fe2ae5dadc20903b7bceec..8c370ba9a452aec4e8979a8891ad2923e37e2d99 100644 (file)
@@ -2469,7 +2469,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMMemoryPressure = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
-      readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
+      readonly u ManagedOOMMemoryPressureLimit = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMPreference = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
@@ -2994,7 +2994,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <!--property ManagedOOMMemoryPressure is not documented!-->
 
-    <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
+    <!--property ManagedOOMMemoryPressureLimit is not documented!-->
 
     <!--property ManagedOOMPreference is not documented!-->
 
@@ -3560,7 +3560,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
 
-    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
+    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimit"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMPreference"/>
 
@@ -4229,7 +4229,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMMemoryPressure = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
-      readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
+      readonly u ManagedOOMMemoryPressureLimit = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMPreference = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
@@ -4782,7 +4782,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <!--property ManagedOOMMemoryPressure is not documented!-->
 
-    <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
+    <!--property ManagedOOMMemoryPressureLimit is not documented!-->
 
     <!--property ManagedOOMPreference is not documented!-->
 
@@ -5346,7 +5346,7 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2esocket {
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
 
-    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
+    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimit"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMPreference"/>
 
@@ -5928,7 +5928,7 @@ node /org/freedesktop/systemd1/unit/home_2emount {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMMemoryPressure = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
-      readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
+      readonly u ManagedOOMMemoryPressureLimit = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMPreference = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
@@ -6409,7 +6409,7 @@ node /org/freedesktop/systemd1/unit/home_2emount {
 
     <!--property ManagedOOMMemoryPressure is not documented!-->
 
-    <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
+    <!--property ManagedOOMMemoryPressureLimit is not documented!-->
 
     <!--property ManagedOOMPreference is not documented!-->
 
@@ -6891,7 +6891,7 @@ node /org/freedesktop/systemd1/unit/home_2emount {
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
 
-    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
+    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimit"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMPreference"/>
 
@@ -7594,7 +7594,7 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMMemoryPressure = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
-      readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
+      readonly u ManagedOOMMemoryPressureLimit = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMPreference = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
@@ -8061,7 +8061,7 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
     <!--property ManagedOOMMemoryPressure is not documented!-->
 
-    <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
+    <!--property ManagedOOMMemoryPressureLimit is not documented!-->
 
     <!--property ManagedOOMPreference is not documented!-->
 
@@ -8529,7 +8529,7 @@ node /org/freedesktop/systemd1/unit/dev_2dsda3_2eswap {
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
 
-    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
+    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimit"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMPreference"/>
 
@@ -9085,7 +9085,7 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMMemoryPressure = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
-      readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
+      readonly u ManagedOOMMemoryPressureLimit = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMPreference = '...';
   };
@@ -9222,7 +9222,7 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
 
     <!--property ManagedOOMMemoryPressure is not documented!-->
 
-    <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
+    <!--property ManagedOOMMemoryPressureLimit is not documented!-->
 
     <!--property ManagedOOMPreference is not documented!-->
 
@@ -9364,7 +9364,7 @@ node /org/freedesktop/systemd1/unit/system_2eslice {
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
 
-    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
+    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimit"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMPreference"/>
 
@@ -9526,7 +9526,7 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMMemoryPressure = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
-      readonly u ManagedOOMMemoryPressureLimitPermyriad = ...;
+      readonly u ManagedOOMMemoryPressureLimit = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
       readonly s ManagedOOMPreference = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
@@ -9679,7 +9679,7 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
 
     <!--property ManagedOOMMemoryPressure is not documented!-->
 
-    <!--property ManagedOOMMemoryPressureLimitPermyriad is not documented!-->
+    <!--property ManagedOOMMemoryPressureLimit is not documented!-->
 
     <!--property ManagedOOMPreference is not documented!-->
 
@@ -9847,7 +9847,7 @@ node /org/freedesktop/systemd1/unit/session_2d1_2escope {
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressure"/>
 
-    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimitPermyriad"/>
+    <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMMemoryPressureLimit"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="ManagedOOMPreference"/>
 
index 644bf50e7d8d2672cd2243c5bc8f6937aadea581..1f74cb393f79cef0d99e19306a8cca87f6bb009e 100644 (file)
@@ -419,7 +419,7 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
                 "%sDelegate: %s\n"
                 "%sManagedOOMSwap: %s\n"
                 "%sManagedOOMMemoryPressure: %s\n"
-                "%sManagedOOMMemoryPressureLimit: %" PRIu32 ".%02" PRIu32 "%%\n"
+                "%sManagedOOMMemoryPressureLimit: " PERMYRIAD_AS_PERCENT_FORMAT_STR "\n"
                 "%sManagedOOMPreference: %s%%\n",
                 prefix, yes_no(c->cpu_accounting),
                 prefix, yes_no(c->io_accounting),
@@ -453,7 +453,7 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
                 prefix, yes_no(c->delegate),
                 prefix, managed_oom_mode_to_string(c->moom_swap),
                 prefix, managed_oom_mode_to_string(c->moom_mem_pressure),
-                prefix, c->moom_mem_pressure_limit_permyriad / 100, c->moom_mem_pressure_limit_permyriad % 100,
+                prefix, PERMYRIAD_AS_PERCENT_FORMAT_VAL(UINT32_SCALE_TO_PERMYRIAD(c->moom_mem_pressure_limit)),
                 prefix, managed_oom_preference_to_string(c->moom_preference));
 
         if (c->delegate) {
index 8183551420b494bbe9a4c4cfdadc989b6d763f97..fa79ba15239e80407e3158343ce112f0c2bd039e 100644 (file)
@@ -163,7 +163,7 @@ struct CGroupContext {
         /* Settings for systemd-oomd */
         ManagedOOMMode moom_swap;
         ManagedOOMMode moom_mem_pressure;
-        uint32_t moom_mem_pressure_limit_permyriad;
+        uint32_t moom_mem_pressure_limit; /* Normalized to 2^32-1 == 100% */
         ManagedOOMPreference moom_preference;
 };
 
index df542e82d1ab5b9c43d736426d8d39e561547709..d695106658bff89da7087b5a035601d4ec02a6b8 100644 (file)
@@ -83,7 +83,7 @@ static int build_managed_oom_json_array_element(Unit *u, const char *property, J
                                  JSON_BUILD_PAIR("mode", JSON_BUILD_STRING(mode)),
                                  JSON_BUILD_PAIR("path", JSON_BUILD_STRING(u->cgroup_path)),
                                  JSON_BUILD_PAIR("property", JSON_BUILD_STRING(property)),
-                                 JSON_BUILD_PAIR_CONDITION(use_limit, "limit", JSON_BUILD_UNSIGNED(c->moom_mem_pressure_limit_permyriad))));
+                                 JSON_BUILD_PAIR_CONDITION(use_limit, "limit", JSON_BUILD_UNSIGNED(c->moom_mem_pressure_limit))));
 }
 
 int manager_varlink_send_managed_oom_update(Unit *u) {
index 5bf9d7f4a84d21001e80ac1eb5f18a54cfcb34ef..04d2ba34f30f6e9a1fbf7db93ad4bf3d7d7eb41c 100644 (file)
@@ -396,7 +396,7 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
         SD_BUS_PROPERTY("DisableControllers", "as", property_get_cgroup_mask, offsetof(CGroupContext, disable_controllers), 0),
         SD_BUS_PROPERTY("ManagedOOMSwap", "s", property_get_managed_oom_mode, offsetof(CGroupContext, moom_swap), 0),
         SD_BUS_PROPERTY("ManagedOOMMemoryPressure", "s", property_get_managed_oom_mode, offsetof(CGroupContext, moom_mem_pressure), 0),
-        SD_BUS_PROPERTY("ManagedOOMMemoryPressureLimitPermyriad", "u", NULL, offsetof(CGroupContext, moom_mem_pressure_limit_permyriad), 0),
+        SD_BUS_PROPERTY("ManagedOOMMemoryPressureLimit", "u", NULL, offsetof(CGroupContext, moom_mem_pressure_limit), 0),
         SD_BUS_PROPERTY("ManagedOOMPreference", "s", property_get_managed_oom_preference, offsetof(CGroupContext, moom_preference), 0),
         SD_BUS_VTABLE_END
 };
@@ -1699,7 +1699,7 @@ int bus_cgroup_set_property(
                 return 1;
         }
 
-        if (streq(name, "ManagedOOMMemoryPressureLimitPermyriad")) {
+        if (streq(name, "ManagedOOMMemoryPressureLimit")) {
                 uint32_t v;
 
                 if (!UNIT_VTABLE(u)->can_set_managed_oom)
@@ -1709,12 +1709,11 @@ int bus_cgroup_set_property(
                 if (r < 0)
                         return r;
 
-                if (v > 10000)
-                        return -ERANGE;
-
                 if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
-                        c->moom_mem_pressure_limit_permyriad = v;
-                        unit_write_settingf(u, flags, name, "ManagedOOMMemoryPressureLimit=%" PRIu32 ".%02" PRIu32 "%%", v / 100, v % 100);
+                        c->moom_mem_pressure_limit = v;
+                        unit_write_settingf(u, flags, name,
+                                            "ManagedOOMMemoryPressureLimit=" PERMYRIAD_AS_PERCENT_FORMAT_STR,
+                                            PERMYRIAD_AS_PERCENT_FORMAT_VAL(UINT32_SCALE_TO_PERMYRIAD(v)));
                 }
 
                 if (c->moom_mem_pressure == MANAGED_OOM_KILL)
index b0460e27645ced213e33dc65b2a8c7814d346b46..6ed6b07db215281abba93a9dc81b30d44b2c259d 100644 (file)
@@ -229,7 +229,7 @@ $1.IPIngressFilterPath,                  config_parse_ip_filter_bpf_progs,
 $1.IPEgressFilterPath,                   config_parse_ip_filter_bpf_progs,            0,                                  offsetof($1, cgroup_context.ip_filters_egress)
 $1.ManagedOOMSwap,                       config_parse_managed_oom_mode,               0,                                  offsetof($1, cgroup_context.moom_swap)
 $1.ManagedOOMMemoryPressure,             config_parse_managed_oom_mode,               0,                                  offsetof($1, cgroup_context.moom_mem_pressure)
-$1.ManagedOOMMemoryPressureLimit,        config_parse_managed_oom_mem_pressure_limit, 0,                                  offsetof($1, cgroup_context.moom_mem_pressure_limit_permyriad)
+$1.ManagedOOMMemoryPressureLimit,        config_parse_managed_oom_mem_pressure_limit, 0,                                  offsetof($1, cgroup_context.moom_mem_pressure_limit)
 $1.ManagedOOMPreference,                 config_parse_managed_oom_preference,         0,                                  offsetof($1, cgroup_context.moom_preference)
 $1.NetClass,                             config_parse_warn_compat,                    DISABLED_LEGACY,                    0'
 )m4_dnl
index c56c2ffc618199503345d5b5fb966ff767667b56..b9fc450ac739a644c7295559611eca65e06d4140 100644 (file)
@@ -3901,7 +3901,8 @@ int config_parse_managed_oom_mem_pressure_limit(
                 return 0;
         }
 
-        *limit = r;
+        /* Normalize to 2^32-1 == 100% */
+        *limit = UINT32_SCALE_FROM_PERMYRIAD(r);
         return 0;
 }
 
index bdf41807b24187ebdee3f421dc05c18139ba5156..65c0bfac614252a5cbc16c64a41f596dd9b0aeeb 100644 (file)
@@ -10,6 +10,7 @@
 #include "oomd-manager-bus.h"
 #include "oomd-manager.h"
 #include "path-util.h"
+#include "percent-util.h"
 
 typedef struct ManagedOOMReply {
         ManagedOOMMode mode;
@@ -100,10 +101,15 @@ static int process_managed_oom_reply(
                 limit = m->default_mem_pressure_limit;
 
                 if (streq(reply.property, "ManagedOOMMemoryPressure")) {
-                        if (reply.limit > 10000)
+                        if (reply.limit > UINT32_MAX) /* out of range */
                                 continue;
-                        else if (reply.limit != 0) {
-                                ret = store_loadavg_fixed_point((unsigned long) reply.limit / 100, (unsigned long) reply.limit % 100, &limit);
+                        if (reply.limit != 0) {
+                                int permyriad = UINT32_SCALE_TO_PERMYRIAD(reply.limit);
+
+                                ret = store_loadavg_fixed_point(
+                                                (unsigned long) permyriad / 100,
+                                                (unsigned long) permyriad % 100,
+                                                &limit);
                                 if (ret < 0)
                                         continue;
                         }
index 27c8eb915fb9f1906a42853f4c582d8d8ed11760..83130db2fa16141b3b8e08d70ffc0c3110386211 100644 (file)
@@ -441,15 +441,12 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons
                 return bus_append_string(m, field, eq);
 
         if (STR_IN_SET(field, "ManagedOOMMemoryPressureLimit")) {
-                char *n;
-
                 r = parse_permyriad(eq);
                 if (r < 0)
                         return log_error_errno(r, "Failed to parse %s value: %s", field, eq);
 
-                n = strjoina(field, "Permyriad");
-
-                r = sd_bus_message_append(m, "(sv)", n, "u", (uint32_t) r);
+                /* Pass around scaled to 2^32-1 == 100% */
+                r = sd_bus_message_append(m, "(sv)", field, "u", UINT32_SCALE_FROM_PERMYRIAD(r));
                 if (r < 0)
                         return bus_log_create_error(r);