Skip to content

Commit

Permalink
core/cgroup: accepts MemorySwapMax=0
Browse files Browse the repository at this point in the history
Also, defines and sets checking functions explicitly.

Fixes systemd#8363.
  • Loading branch information
yuwata committed Mar 6, 2018
1 parent b2de580 commit 83ac53d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
37 changes: 27 additions & 10 deletions src/core/dbus-cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -526,14 +526,31 @@ static int bus_cgroup_set_boolean(
} \
struct __useless_struct_to_allow_trailing_semicolon__

static BUS_DEFINE_SET_CGROUP_WEIGHT(cpu_weight, CGROUP_MASK_CPU, CGROUP_WEIGHT_IS_OK, CGROUP_WEIGHT_INVALID,);
static BUS_DEFINE_SET_CGROUP_WEIGHT(cpu_shares, CGROUP_MASK_CPU, CGROUP_CPU_SHARES_IS_OK, CGROUP_CPU_SHARES_INVALID,);
static BUS_DEFINE_SET_CGROUP_WEIGHT(io_weight, CGROUP_MASK_IO, CGROUP_WEIGHT_IS_OK, CGROUP_WEIGHT_INVALID,);
static BUS_DEFINE_SET_CGROUP_WEIGHT(blockio_weight, CGROUP_MASK_BLKIO, CGROUP_BLKIO_WEIGHT_IS_OK, CGROUP_BLKIO_WEIGHT_INVALID,);
static BUS_DEFINE_SET_CGROUP_WEIGHT(memory, CGROUP_MASK_MEMORY, , CGROUP_LIMIT_MAX, "infinity");
static BUS_DEFINE_SET_CGROUP_WEIGHT(tasks_max, CGROUP_MASK_PIDS, , (uint64_t) -1, "infinity");
static BUS_DEFINE_SET_CGROUP_SCALE(memory, CGROUP_MASK_MEMORY, physical_memory_scale);
static BUS_DEFINE_SET_CGROUP_SCALE(tasks_max, CGROUP_MASK_PIDS, system_tasks_max_scale);
static bool CGROUP_MEMORY_SWAP_MAX_IS_OK(uint64_t val) {
/* Accepts any value */
return true;
}

static bool CGROUP_MEMORY_LIMIT_IS_OK(uint64_t val) {
/* Accepts positive values */
return val > 0;
}

static bool CGROUP_TASKS_MAX_IS_OK(uint64_t val) {
/* Accepts positive values */
return val > 0;
}

static BUS_DEFINE_SET_CGROUP_WEIGHT(cpu_weight, CGROUP_MASK_CPU, CGROUP_WEIGHT_IS_OK, CGROUP_WEIGHT_INVALID, "");
static BUS_DEFINE_SET_CGROUP_WEIGHT(cpu_shares, CGROUP_MASK_CPU, CGROUP_CPU_SHARES_IS_OK, CGROUP_CPU_SHARES_INVALID, "");
static BUS_DEFINE_SET_CGROUP_WEIGHT(io_weight, CGROUP_MASK_IO, CGROUP_WEIGHT_IS_OK, CGROUP_WEIGHT_INVALID, "");
static BUS_DEFINE_SET_CGROUP_WEIGHT(blockio_weight, CGROUP_MASK_BLKIO, CGROUP_BLKIO_WEIGHT_IS_OK, CGROUP_BLKIO_WEIGHT_INVALID, "");
static BUS_DEFINE_SET_CGROUP_WEIGHT(memory, CGROUP_MASK_MEMORY, CGROUP_MEMORY_LIMIT_IS_OK, CGROUP_LIMIT_MAX, "infinity");
static BUS_DEFINE_SET_CGROUP_WEIGHT(swap, CGROUP_MASK_MEMORY, CGROUP_MEMORY_SWAP_MAX_IS_OK, CGROUP_LIMIT_MAX, "infinity");
static BUS_DEFINE_SET_CGROUP_WEIGHT(tasks_max, CGROUP_MASK_PIDS, CGROUP_TASKS_MAX_IS_OK, (uint64_t) -1, "infinity");
static BUS_DEFINE_SET_CGROUP_SCALE(memory, CGROUP_MASK_MEMORY, physical_memory_scale, CGROUP_MEMORY_LIMIT_IS_OK);
static BUS_DEFINE_SET_CGROUP_SCALE(swap, CGROUP_MASK_MEMORY, physical_memory_scale, CGROUP_MEMORY_SWAP_MAX_IS_OK);
static BUS_DEFINE_SET_CGROUP_SCALE(tasks_max, CGROUP_MASK_PIDS, system_tasks_max_scale, CGROUP_TASKS_MAX_IS_OK);

int bus_cgroup_set_property(
Unit *u,
Expand Down Expand Up @@ -596,7 +613,7 @@ int bus_cgroup_set_property(
return bus_cgroup_set_memory(u, name, &c->memory_high, message, flags, error);

if (streq(name, "MemorySwapMax"))
return bus_cgroup_set_memory(u, name, &c->memory_swap_max, message, flags, error);
return bus_cgroup_set_swap(u, name, &c->memory_swap_max, message, flags, error);

if (streq(name, "MemoryMax"))
return bus_cgroup_set_memory(u, name, &c->memory_max, message, flags, error);
Expand All @@ -611,7 +628,7 @@ int bus_cgroup_set_property(
return bus_cgroup_set_memory_scale(u, name, &c->memory_high, message, flags, error);

if (streq(name, "MemorySwapMaxScale"))
return bus_cgroup_set_memory_scale(u, name, &c->memory_swap_max, message, flags, error);
return bus_cgroup_set_swap_scale(u, name, &c->memory_swap_max, message, flags, error);

if (streq(name, "MemoryMaxScale"))
return bus_cgroup_set_memory_scale(u, name, &c->memory_max, message, flags, error);
Expand Down
3 changes: 2 additions & 1 deletion src/core/load-fragment.c
Original file line number Diff line number Diff line change
Expand Up @@ -3345,7 +3345,8 @@ int config_parse_memory_limit(
} else
bytes = physical_memory_scale(r, 100U);

if (bytes <= 0 || bytes >= UINT64_MAX) {
if (bytes >= UINT64_MAX ||
(bytes <= 0 && !streq(lvalue, "MemorySwapMax"))) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Memory limit '%s' out of range. Ignoring.", rvalue);
return 0;
}
Expand Down

0 comments on commit 83ac53d

Please sign in to comment.