加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
core-cgroup-support-memorysw.patch 9.94 KB
一键复制 编辑 原始数据 按行查看 历史
胡宇彪 提交于 2023-07-31 10:00 . sync the patch from v249
From cfb8a3cf09d9a958388ca1181bb92d9f77ab100e Mon Sep 17 00:00:00 2001
From: licunlong <licunlong1@huawei.com>
Date: Thu, 6 May 2021 09:38:54 +0800
Subject: [PATCH] core-cgroup: support memorysw
Upstream systemd dosen't support setting memory.memsw.limit_in_bytes.
This patch enables setting memory.memsw.limit_in_bytes by MemoryMemswLimit.
---
src/core/cgroup.c | 17 +++++++++++++++--
src/core/cgroup.h | 1 +
src/core/dbus-cgroup.c | 4 ++++
src/core/load-fragment-gperf.gperf.in | 1 +
src/core/load-fragment.c | 10 ++++++----
src/shared/bus-print-properties.c | 2 +-
src/shared/bus-unit-util.c | 1 +
test/fuzz/fuzz-unit-file/directives-all.service | 1 +
8 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 7d1e59b..f827219 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -154,6 +154,7 @@ void cgroup_context_init(CGroupContext *c) {
.memory_zswap_max = CGROUP_LIMIT_MAX,
.memory_limit = CGROUP_LIMIT_MAX,
+ .memory_memsw_limit = CGROUP_LIMIT_MAX,
.io_weight = CGROUP_WEIGHT_INVALID,
.startup_io_weight = CGROUP_WEIGHT_INVALID,
@@ -481,6 +482,7 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
"%sMemorySwapMax: %" PRIu64 "%s\n"
"%sMemoryZSwapMax: %" PRIu64 "%s\n"
"%sMemoryLimit: %" PRIu64 "\n"
+ "%sMemoryMemswLimit=%" PRIu64 "\n"
"%sCPUSetCpus=%s\n"
"%sCPUSetMems=%s\n"
"%sCPUSetCloneChildren=%s\n"
@@ -525,6 +527,7 @@ void cgroup_context_dump(Unit *u, FILE* f, const char *prefix) {
prefix, c->memory_swap_max, format_cgroup_memory_limit_comparison(cde, sizeof(cde), u, "MemorySwapMax"),
prefix, c->memory_zswap_max, format_cgroup_memory_limit_comparison(cde, sizeof(cde), u, "MemoryZSwapMax"),
prefix, c->memory_limit,
+ prefix, c->memory_memsw_limit,
prefix, c->cpuset_cpus,
prefix, c->cpuset_mems,
prefix, yes_no(c->cpuset_clone_children),
@@ -1673,14 +1676,17 @@ static void cgroup_context_apply(
} else {
char buf[DECIMAL_STR_MAX(uint64_t) + 1];
- uint64_t val;
+ uint64_t val, sw_val;
if (unit_has_unified_memory_config(u)) {
val = c->memory_max;
+ sw_val = CGROUP_LIMIT_MAX;
if (val != CGROUP_LIMIT_MAX)
log_cgroup_compat(u, "Applying MemoryMax=%" PRIu64 " as MemoryLimit=", val);
- } else
+ } else {
val = c->memory_limit;
+ sw_val = c->memory_memsw_limit;
+ }
if (val == CGROUP_LIMIT_MAX)
strncpy(buf, "-1\n", sizeof(buf));
@@ -1688,6 +1694,12 @@ static void cgroup_context_apply(
xsprintf(buf, "%" PRIu64 "\n", val);
(void) set_attribute_and_warn(u, "memory", "memory.limit_in_bytes", buf);
+
+ if (sw_val == CGROUP_LIMIT_MAX)
+ strncpy(buf, "-1\n", sizeof(buf));
+ else
+ xsprintf(buf, "%" PRIu64 "\n", sw_val);
+ (void) set_attribute_and_warn(u, "memory", "memory.memsw.limit_in_bytes", buf);
}
}
@@ -1883,6 +1895,7 @@ static CGroupMask unit_get_cgroup_mask(Unit *u) {
if (c->memory_accounting ||
c->memory_limit != CGROUP_LIMIT_MAX ||
+ c->memory_memsw_limit != CGROUP_LIMIT_MAX ||
unit_has_unified_memory_config(u))
mask |= CGROUP_MASK_MEMORY;
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
index 2251548..313b63c 100644
--- a/src/core/cgroup.h
+++ b/src/core/cgroup.h
@@ -187,6 +187,7 @@ struct CGroupContext {
LIST_HEAD(CGroupBlockIODeviceBandwidth, blockio_device_bandwidths);
uint64_t memory_limit;
+ uint64_t memory_memsw_limit;
CGroupDevicePolicy device_policy;
LIST_HEAD(CGroupDeviceAllow, device_allow);
diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c
index c51a8b7..e54657e 100644
--- a/src/core/dbus-cgroup.c
+++ b/src/core/dbus-cgroup.c
@@ -470,6 +470,7 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
SD_BUS_PROPERTY("MemorySwapMax", "t", NULL, offsetof(CGroupContext, memory_swap_max), 0),
SD_BUS_PROPERTY("MemoryZSwapMax", "t", NULL, offsetof(CGroupContext, memory_zswap_max), 0),
SD_BUS_PROPERTY("MemoryLimit", "t", NULL, offsetof(CGroupContext, memory_limit), 0),
+ SD_BUS_PROPERTY("MemoryMemswLimit", "t", NULL, offsetof(CGroupContext, memory_memsw_limit), 0),
SD_BUS_PROPERTY("CPUSetAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, cpuset_accounting), 0),
SD_BUS_PROPERTY("CPUSetCpus", "s", NULL, offsetof(CGroupContext, cpuset_cpus), 0),
SD_BUS_PROPERTY("CPUSetMems", "s", NULL, offsetof(CGroupContext, cpuset_mems), 0),
@@ -1093,6 +1094,9 @@ int bus_cgroup_set_property(
if (streq(name, "MemoryLimit"))
return bus_cgroup_set_memory(u, name, &c->memory_limit, message, flags, error);
+ if (streq(name, "MemoryMemswLimit"))
+ return bus_cgroup_set_memory(u, name, &c->memory_memsw_limit, message, flags, error);
+
if (streq(name, "MemoryMinScale")) {
r = bus_cgroup_set_memory_protection_scale(u, name, &c->memory_min, message, flags, error);
if (r > 0)
diff --git a/src/core/load-fragment-gperf.gperf.in b/src/core/load-fragment-gperf.gperf.in
index eb68807..c1bc771 100644
--- a/src/core/load-fragment-gperf.gperf.in
+++ b/src/core/load-fragment-gperf.gperf.in
@@ -208,6 +208,7 @@
{{type}}.MemorySwapMax, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.MemoryZSwapMax, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.MemoryLimit, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
+{{type}}.MemoryMemswLimit, config_parse_memory_limit, 0, offsetof({{type}}, cgroup_context)
{{type}}.CPUSetAccounting, config_parse_bool, 0, offsetof({{type}}, cgroup_context.cpuset_accounting)
{{type}}.CPUSetCpus, config_parse_cpuset_cpumems, 0, offsetof({{type}}, cgroup_context.cpuset_cpus)
{{type}}.CPUSetMems, config_parse_cpuset_cpumems, 0, offsetof({{type}}, cgroup_context.cpuset_mems)
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index d01b6c4..8d2171f 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -3854,6 +3854,8 @@ int config_parse_memory_limit(
c->memory_swap_max = bytes;
else if (streq(lvalue, "MemoryZSwapMax"))
c->memory_zswap_max = bytes;
+ else if (streq(lvalue, "MemoryMemswLimit"))
+ c->memory_memsw_limit = bytes;
else if (streq(lvalue, "MemoryLimit")) {
log_syntax(unit, LOG_WARNING, filename, line, 0,
"Unit uses MemoryLimit=; please use MemoryMax= instead. Support for MemoryLimit= will be removed soon.");
diff --git a/src/shared/bus-print-properties.c b/src/shared/bus-print-properties.c
index 9369866..9e26b71 100644
--- a/src/shared/bus-print-properties.c
+++ b/src/shared/bus-print-properties.c
@@ -162,7 +162,7 @@ static int bus_print_property(const char *name, const char *expected_value, sd_b
bus_print_property_value(name, expected_value, flags, "[not set]");
- else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryZSwapMax", "MemoryLimit", "MemoryAvailable") && u == CGROUP_LIMIT_MAX) ||
+ else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryZSwapMax", "MemoryLimit", "MemoryMemswLimit", "MemoryAvailable") && u == CGROUP_LIMIT_MAX) ||
(STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == UINT64_MAX) ||
(startswith(name, "Limit") && u == UINT64_MAX) ||
(startswith(name, "DefaultLimit") && u == UINT64_MAX))
diff --git a/src/shared/bus-unit-util.c b/src/shared/bus-unit-util.c
index a174e3e..984dfa9 100644
--- a/src/shared/bus-unit-util.c
+++ b/src/shared/bus-unit-util.c
@@ -547,6 +547,7 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons
"MemorySwapMax",
"MemoryZSwapMax",
"MemoryLimit",
+ "MemoryMemswLimit",
"TasksMax")) {
if (streq(eq, "infinity")) {
diff --git a/test/fuzz/fuzz-unit-file/directives-all.service b/test/fuzz/fuzz-unit-file/directives-all.service
index 1a5cd5d..59c693d 100644
--- a/test/fuzz/fuzz-unit-file/directives-all.service
+++ b/test/fuzz/fuzz-unit-file/directives-all.service
@@ -166,6 +166,7 @@ MemoryHigh=
MemoryLimit=
MemoryLow=
MemoryMax=
+MemoryMemswLimit=
MemorySwapMax=
MemoryZSwapMax=
MessageQueueMaxMessages=
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化