Skip to content

Commit

Permalink
Merge pull request systemd#9484 from poettering/permille-everywhere
Browse files Browse the repository at this point in the history
Permille everywhere
  • Loading branch information
keszybz authored Jul 26, 2018
2 parents be0135c + f806dfd commit cf6e28f
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 24 deletions.
7 changes: 4 additions & 3 deletions src/basic/parse-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,8 @@ int parse_permille_unbounded(const char *p) {
r = safe_atoi(n, &v);
if (r < 0)
return r;
if (v < 0)
return -ERANGE;
} else {
pc = endswith(p, "%");
if (!pc)
Expand All @@ -657,15 +659,14 @@ int parse_permille_unbounded(const char *p) {
r = safe_atoi(n, &v);
if (r < 0)
return r;
if (v < 0)
return -ERANGE;
if (v > (INT_MAX - q) / 10)
return -ERANGE;

v = v * 10 + q;
}

if (v < 0)
return -ERANGE;

return v;
}

Expand Down
12 changes: 6 additions & 6 deletions src/core/load-fragment.c
Original file line number Diff line number Diff line change
Expand Up @@ -3013,13 +3013,13 @@ int config_parse_cpu_quota(
return 0;
}

r = parse_percent_unbounded(rvalue);
r = parse_permille_unbounded(rvalue);
if (r <= 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Invalid CPU quota '%s', ignoring.", rvalue);
return 0;
}

c->cpu_quota_per_sec_usec = ((usec_t) r * USEC_PER_SEC) / 100U;
c->cpu_quota_per_sec_usec = ((usec_t) r * USEC_PER_SEC) / 1000U;
return 0;
}

Expand All @@ -3041,15 +3041,15 @@ int config_parse_memory_limit(

if (!isempty(rvalue) && !streq(rvalue, "infinity")) {

r = parse_percent(rvalue);
r = parse_permille(rvalue);
if (r < 0) {
r = parse_size(rvalue, 1024, &bytes);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Invalid memory limit '%s', ignoring: %m", rvalue);
return 0;
}
} else
bytes = physical_memory_scale(r, 100U);
bytes = physical_memory_scale(r, 1000U);

if (bytes >= UINT64_MAX ||
(bytes <= 0 && !streq(lvalue, "MemorySwapMax"))) {
Expand Down Expand Up @@ -3102,15 +3102,15 @@ int config_parse_tasks_max(
return 0;
}

r = parse_percent(rvalue);
r = parse_permille(rvalue);
if (r < 0) {
r = safe_atou64(rvalue, &v);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Invalid maximum tasks value '%s', ignoring: %m", rvalue);
return 0;
}
} else
v = system_tasks_max_scale(r, 100U);
v = system_tasks_max_scale(r, 1000U);

if (v <= 0 || v >= UINT64_MAX) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Maximum tasks value '%s' out of range, ignoring.", rvalue);
Expand Down
6 changes: 3 additions & 3 deletions src/login/logind-user.c
Original file line number Diff line number Diff line change
Expand Up @@ -711,9 +711,9 @@ int config_parse_tmpfs_size(
assert(data);

/* First, try to parse as percentage */
r = parse_percent(rvalue);
if (r > 0 && r < 100)
*sz = physical_memory_scale(r, 100U);
r = parse_permille(rvalue);
if (r > 0 && r < 1000)
*sz = physical_memory_scale(r, 1000U);
else {
uint64_t k;

Expand Down
4 changes: 2 additions & 2 deletions src/login/pam_systemd.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,9 +204,9 @@ static int append_session_memory_max(pam_handle_t *handle, sd_bus_message *m, co
return r;
}
} else {
r = parse_percent(limit);
r = parse_permille(limit);
if (r >= 0) {
r = sd_bus_message_append(m, "(sv)", "MemoryMaxScale", "u", (uint32_t) (((uint64_t) UINT32_MAX * r) / 100U));
r = sd_bus_message_append(m, "(sv)", "MemoryMaxScale", "u", (uint32_t) (((uint64_t) r * UINT32_MAX) / 1000U));
if (r < 0) {
pam_syslog(handle, LOG_ERR, "Failed to append to bus message: %s", strerror(-r));
return r;
Expand Down
22 changes: 12 additions & 10 deletions src/shared/bus-unit-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,16 +422,16 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons
return 1;
}

r = parse_percent(eq);
r = parse_permille(eq);
if (r >= 0) {
char *n;

/* When this is a percentage we'll convert this into a relative value in the range
* 0…UINT32_MAX and pass it in the MemoryLowScale property (and related
* ones). This way the physical memory size can be determined server-side */
/* When this is a percentage we'll convert this into a relative value in the range 0…UINT32_MAX
* and pass it in the MemoryLowScale property (and related ones). This way the physical memory
* size can be determined server-side. */

n = strjoina(field, "Scale");
r = sd_bus_message_append(m, "(sv)", n, "u", (uint32_t) (((uint64_t) UINT32_MAX * r) / 100U));
r = sd_bus_message_append(m, "(sv)", n, "u", (uint32_t) (((uint64_t) r * UINT32_MAX) / 1000U));
if (r < 0)
return bus_log_create_error(r);

Expand All @@ -449,13 +449,15 @@ static int bus_append_cgroup_property(sd_bus_message *m, const char *field, cons
if (isempty(eq))
r = sd_bus_message_append(m, "(sv)", "CPUQuotaPerSecUSec", "t", USEC_INFINITY);
else {
r = parse_percent_unbounded(eq);
if (r <= 0) {
log_error_errno(r, "CPU quota '%s' invalid.", eq);
return -EINVAL;
r = parse_permille_unbounded(eq);
if (r == 0) {
log_error("CPU quota too small.");
return -ERANGE;
}
if (r < 0)
return log_error_errno(r, "CPU quota '%s' invalid.", eq);

r = sd_bus_message_append(m, "(sv)", "CPUQuotaPerSecUSec", "t", (usec_t) r * USEC_PER_SEC / 100U);
r = sd_bus_message_append(m, "(sv)", "CPUQuotaPerSecUSec", "t", (((uint64_t) r * USEC_PER_SEC) / 1000U));
}

if (r < 0)
Expand Down

0 comments on commit cf6e28f

Please sign in to comment.