Blob Blame History Raw
From 5ba4f4d42db066c3a9255768d5c38d841127bd07 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 17 Sep 2013 14:58:00 -0500
Subject: [PATCH] cgroup: get rid of MemorySoftLimit=

The cgroup attribute memory.soft_limit_in_bytes is unlikely to stay
around in the kernel for good, so let's not expose it for now. We can
readd something like it later when the kernel guys decided on a final
API for this.

Conflicts:
	TODO
---
 TODO                                  |  9 +++++++++
 man/systemd.resource-control.xml      | 15 +++++----------
 src/core/cgroup.c                     | 16 ++--------------
 src/core/cgroup.h                     |  1 -
 src/core/dbus-cgroup.c                | 10 ++--------
 src/core/dbus-cgroup.h                |  1 -
 src/core/load-fragment-gperf.gperf.m4 |  1 -
 src/core/load-fragment.c              |  7 ++-----
 src/systemctl/systemctl.c             |  2 +-
 9 files changed, 21 insertions(+), 41 deletions(-)

diff --git a/TODO b/TODO
index bfeaa81..4c3e14f 100644
--- a/TODO
+++ b/TODO
@@ -58,6 +58,15 @@ CGroup Rework Completion:
 
 Features:
 
+* always set memory.user_hierarchy for all cgroups we create
+
+* After coming back from hibernation reset hibernation swap partition
+
+* mounts: do not test each mount unit against each other mount unit to
+  determine prefixes. Instead generated list of all prefixes and
+  interate through that to bring down complexity from O(n^2) to O(n)
+  when loading units
+
 * Move backlight and random-seed into /var/lib/systemd
 
 * If we try to find a unit via a danglign symlink generate a clean
diff --git a/man/systemd.resource-control.xml b/man/systemd.resource-control.xml
index 2427f208..de017a7 100644
--- a/man/systemd.resource-control.xml
+++ b/man/systemd.resource-control.xml
@@ -134,22 +134,17 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
 
       <varlistentry>
         <term><varname>MemoryLimit=<replaceable>bytes</replaceable></varname></term>
-        <term><varname>MemorySoftLimit=<replaceable>bytes</replaceable></varname></term>
 
         <listitem>
-          <para>Specify the hard and soft limits on maximum memory
-          usage of the executed processes. The "hard" limit specifies
-          how much process and kernel memory can be used by tasks in
-          this unit, when there is no memory contention. If the kernel
-          detects memory contention, memory reclaim will be performed
-          until the memory usage is within the "soft" limit. Takes a
+          <para>Specify the limit on maximum memory usage of the
+          executed processes. The limit specifies how much process and
+          kernel memory can be used by tasks in this unit. Takes a
           memory size in bytes. If the value is suffixed with K, M, G
           or T, the specified memory size is parsed as Kilobytes,
           Megabytes, Gigabytes, or Terabytes (with the base 1024),
           respectively. This controls the
-          <literal>memory.limit_in_bytes</literal> and
-          <literal>memory.soft_limit_in_bytes</literal> control group
-          attributes. For details about these control group attributes,
+          <literal>memory.limit_in_bytes</literal> control group
+          attribute. For details about this control group attribute,
           see <ulink
           url="https://www.kernel.org/doc/Documentation/cgroups/memory.txt">memory.txt</ulink>.</para>
 
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 2f1e4a3..8bf4d89 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -33,7 +33,7 @@ void cgroup_context_init(CGroupContext *c) {
          * structure is preinitialized to 0 */
 
         c->cpu_shares = 1024;
-        c->memory_limit = c->memory_soft_limit = (uint64_t) -1;
+        c->memory_limit = (uint64_t) -1;
         c->blockio_weight = 1000;
 }
 
@@ -94,7 +94,6 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
                 "%sCPUShares=%lu\n"
                 "%sBlockIOWeight=%lu\n"
                 "%sMemoryLimit=%" PRIu64 "\n"
-                "%sMemorySoftLimit=%" PRIu64 "\n"
                 "%sDevicePolicy=%s\n",
                 prefix, yes_no(c->cpu_accounting),
                 prefix, yes_no(c->blockio_accounting),
@@ -102,7 +101,6 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
                 prefix, c->cpu_shares,
                 prefix, c->blockio_weight,
                 prefix, c->memory_limit,
-                prefix, c->memory_soft_limit,
                 prefix, cgroup_device_policy_to_string(c->device_policy));
 
         LIST_FOREACH(device_allow, a, c->device_allow)
@@ -266,15 +264,6 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
 
                 if (r < 0)
                         log_error("Failed to set memory.limit_in_bytes on %s: %s", path, strerror(-r));
-
-                if (c->memory_soft_limit != (uint64_t) -1) {
-                        sprintf(buf, "%" PRIu64 "\n", c->memory_soft_limit);
-                        r = cg_set_attribute("memory", path, "memory.soft_limit_in_bytes", buf);
-                } else
-                        r = cg_set_attribute("memory", path, "memory.soft_limit_in_bytes", "-1");
-
-                if (r < 0)
-                        log_error("Failed to set memory.soft_limit_in_bytes on %s: %s", path, strerror(-r));
         }
 
         if (mask & CGROUP_DEVICE) {
@@ -337,8 +326,7 @@ CGroupControllerMask cgroup_context_get_mask(CGroupContext *c) {
                 mask |= CGROUP_BLKIO;
 
         if (c->memory_accounting ||
-            c->memory_limit != (uint64_t) -1 ||
-            c->memory_soft_limit != (uint64_t) -1)
+            c->memory_limit != (uint64_t) -1)
                 mask |= CGROUP_MEMORY;
 
         if (c->device_allow || c->device_policy != CGROUP_AUTO)
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
index 786bd71..0a079e9 100644
--- a/src/core/cgroup.h
+++ b/src/core/cgroup.h
@@ -77,7 +77,6 @@ struct CGroupContext {
         LIST_HEAD(CGroupBlockIODeviceBandwidth, blockio_device_bandwidths);
 
         uint64_t memory_limit;
-        uint64_t memory_soft_limit;
 
         CGroupDevicePolicy device_policy;
         LIST_HEAD(CGroupDeviceAllow, device_allow);
diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c
index 1f2a396..9ebcad9 100644
--- a/src/core/dbus-cgroup.c
+++ b/src/core/dbus-cgroup.c
@@ -133,7 +133,6 @@ const BusProperty bus_cgroup_context_properties[] = {
         { "BlockIOWriteBandwidth",   bus_cgroup_append_device_bandwidths, "a(st)", 0                                           },
         { "MemoryAccounting",        bus_property_append_bool,            "b",     offsetof(CGroupContext, memory_accounting)  },
         { "MemoryLimit",             bus_property_append_uint64,          "t",     offsetof(CGroupContext, memory_limit)       },
-        { "MemorySoftLimit",         bus_property_append_uint64,          "t",     offsetof(CGroupContext, memory_soft_limit)  },
         { "DevicePolicy",            bus_cgroup_append_device_policy,     "s",     offsetof(CGroupContext, device_policy)      },
         { "DeviceAllow",             bus_cgroup_append_device_allow,      "a(ss)", 0                                           },
         {}
@@ -418,21 +417,16 @@ int bus_cgroup_set_property(
 
                 return 1;
 
-        } else if (streq(name, "MemoryLimit") || streq(name, "MemorySoftLimit")) {
+        } else if (streq(name, "MemoryLimit")) {
 
                 if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_UINT64)
                         return -EINVAL;
 
                 if (mode != UNIT_CHECK) {
                         uint64_t limit;
-
                         dbus_message_iter_get_basic(i, &limit);
 
-                        if (streq(name, "MemoryLimit"))
-                                c->memory_limit = limit;
-                        else
-                                c->memory_soft_limit = limit;
-
+                        c->memory_limit = limit;
                         unit_write_drop_in_private_format(u, mode, name, "%s=%" PRIu64, name, limit);
                 }
 
diff --git a/src/core/dbus-cgroup.h b/src/core/dbus-cgroup.h
index 4ce1e7e..e5ac4c3 100644
--- a/src/core/dbus-cgroup.h
+++ b/src/core/dbus-cgroup.h
@@ -37,7 +37,6 @@
         "  <property name=\"BlockIOWriteBandwidth=\" type=\"a(st)\" access=\"read\"/>\n" \
         "  <property name=\"MemoryAccounting\" type=\"b\" access=\"read\"/>\n" \
         "  <property name=\"MemoryLimit\" type=\"t\" access=\"read\"/>\n" \
-        "  <property name=\"MemorySoftLimit\" type=\"t\" access=\"read\"/>\n" \
         "  <property name=\"DevicePolicy\" type=\"s\" access=\"read\"/>\n" \
         "  <property name=\"DeviceAllow\" type=\"a(ss)\" access=\"read\"/>\n"
 
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
index 3f064a9..31fb7bc 100644
--- a/src/core/load-fragment-gperf.gperf.m4
+++ b/src/core/load-fragment-gperf.gperf.m4
@@ -89,7 +89,6 @@ $1.CPUAccounting,                config_parse_bool,                  0,
 $1.CPUShares,                    config_parse_cpu_shares,            0,                             offsetof($1, cgroup_context)
 $1.MemoryAccounting,             config_parse_bool,                  0,                             offsetof($1, cgroup_context.memory_accounting)
 $1.MemoryLimit,                  config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
-$1.MemorySoftLimit,              config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
 $1.DeviceAllow,                  config_parse_device_allow,          0,                             offsetof($1, cgroup_context)
 $1.DevicePolicy,                 config_parse_device_policy,         0,                             offsetof($1, cgroup_context.device_policy)
 $1.BlockIOAccounting,            config_parse_bool,                  0,                             offsetof($1, cgroup_context.blockio_accounting)
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index ed8602f..6e0a180 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -2015,14 +2015,11 @@ int config_parse_memory_limit(
                 void *userdata) {
 
         CGroupContext *c = data;
-        uint64_t *limit;
         off_t bytes;
         int r;
 
-        limit = streq(lvalue, "MemoryLimit") ? &c->memory_limit : &c->memory_soft_limit;
-
         if (isempty(rvalue)) {
-                *limit = (uint64_t) -1;
+                c->memory_limit = (uint64_t) -1;
                 return 0;
         }
 
@@ -2035,7 +2032,7 @@ int config_parse_memory_limit(
                 return 0;
         }
 
-        *limit = (uint64_t) bytes;
+        c->memory_limit = (uint64_t) bytes;
         return 0;
 }
 
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 16da293..1080065 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -3657,7 +3657,7 @@ static int append_assignment(DBusMessageIter *iter, const char *assignment) {
                     !dbus_message_iter_append_basic(&sub, DBUS_TYPE_BOOLEAN, &b))
                         return log_oom();
 
-        } else if (streq(field, "MemoryLimit") || streq(field, "MemorySoftLimit")) {
+        } else if (streq(field, "MemoryLimit")) {
                 off_t bytes;
                 uint64_t u;