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