mirror of
https://github.com/systemd/systemd.git
synced 2025-03-22 06:50:18 +03:00
cgroup: unify how we invalidate cgroup controller settings
Let's make sure that we follow the same codepaths when adjusting a cgroup property via the dbus SetProperty() call, and when we execute the StartupCPUShares= effect.
This commit is contained in:
parent
1afaa7e8d2
commit
e7ab4d1ac9
@ -1581,6 +1581,32 @@ bool unit_cgroup_delegate(Unit *u) {
|
||||
return c->delegate;
|
||||
}
|
||||
|
||||
void unit_invalidate_cgroup(Unit *u, CGroupMask m) {
|
||||
assert(u);
|
||||
|
||||
if (!UNIT_HAS_CGROUP_CONTEXT(u))
|
||||
return;
|
||||
|
||||
if (m == 0)
|
||||
return;
|
||||
|
||||
if ((u->cgroup_realized_mask & m) == 0)
|
||||
return;
|
||||
|
||||
u->cgroup_realized_mask &= ~m;
|
||||
unit_add_to_cgroup_queue(u);
|
||||
}
|
||||
|
||||
void manager_invalidate_startup_units(Manager *m) {
|
||||
Iterator i;
|
||||
Unit *u;
|
||||
|
||||
assert(m);
|
||||
|
||||
SET_FOREACH(u, m->startup_units, i)
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_CPU|CGROUP_MASK_BLKIO);
|
||||
}
|
||||
|
||||
static const char* const cgroup_device_policy_table[_CGROUP_DEVICE_POLICY_MAX] = {
|
||||
[CGROUP_AUTO] = "auto",
|
||||
[CGROUP_CLOSED] = "closed",
|
||||
|
@ -149,5 +149,9 @@ bool unit_cgroup_delegate(Unit *u);
|
||||
int unit_notify_cgroup_empty(Unit *u);
|
||||
int manager_notify_cgroup_empty(Manager *m, const char *group);
|
||||
|
||||
void unit_invalidate_cgroup(Unit *u, CGroupMask m);
|
||||
|
||||
void manager_invalidate_startup_units(Manager *m);
|
||||
|
||||
const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_;
|
||||
CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_;
|
||||
|
@ -212,7 +212,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->cpu_accounting = b;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_CPUACCT;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_CPUACCT|CGROUP_MASK_CPU);
|
||||
unit_write_drop_in_private(u, mode, name, b ? "CPUAccounting=yes" : "CPUAccounting=no");
|
||||
}
|
||||
|
||||
@ -230,7 +230,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->cpu_shares = shares;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_CPU;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_CPU);
|
||||
|
||||
if (shares == CGROUP_CPU_SHARES_INVALID)
|
||||
unit_write_drop_in_private(u, mode, name, "CPUShares=");
|
||||
@ -252,7 +252,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->startup_cpu_shares = shares;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_CPU;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_CPU);
|
||||
|
||||
if (shares == CGROUP_CPU_SHARES_INVALID)
|
||||
unit_write_drop_in_private(u, mode, name, "StartupCPUShares=");
|
||||
@ -274,7 +274,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->cpu_quota_per_sec_usec = u64;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_CPU;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_CPU);
|
||||
unit_write_drop_in_private_format(u, mode, "CPUQuota", "CPUQuota=%0.f%%", (double) (c->cpu_quota_per_sec_usec / 10000));
|
||||
}
|
||||
|
||||
@ -289,7 +289,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->blockio_accounting = b;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_BLKIO;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_BLKIO);
|
||||
unit_write_drop_in_private(u, mode, name, b ? "BlockIOAccounting=yes" : "BlockIOAccounting=no");
|
||||
}
|
||||
|
||||
@ -307,7 +307,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->blockio_weight = weight;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_BLKIO;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_BLKIO);
|
||||
|
||||
if (weight == CGROUP_BLKIO_WEIGHT_INVALID)
|
||||
unit_write_drop_in_private(u, mode, name, "BlockIOWeight=");
|
||||
@ -329,7 +329,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->startup_blockio_weight = weight;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_BLKIO;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_BLKIO);
|
||||
|
||||
if (weight == CGROUP_BLKIO_WEIGHT_INVALID)
|
||||
unit_write_drop_in_private(u, mode, name, "StartupBlockIOWeight=");
|
||||
@ -403,7 +403,7 @@ int bus_cgroup_set_property(
|
||||
cgroup_context_free_blockio_device_bandwidth(c, a);
|
||||
}
|
||||
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_BLKIO;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_BLKIO);
|
||||
|
||||
f = open_memstream(&buf, &size);
|
||||
if (!f)
|
||||
@ -485,7 +485,7 @@ int bus_cgroup_set_property(
|
||||
cgroup_context_free_blockio_device_weight(c, c->blockio_device_weights);
|
||||
}
|
||||
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_BLKIO;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_BLKIO);
|
||||
|
||||
f = open_memstream(&buf, &size);
|
||||
if (!f)
|
||||
@ -510,7 +510,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->memory_accounting = b;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_MEMORY;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_MEMORY);
|
||||
unit_write_drop_in_private(u, mode, name, b ? "MemoryAccounting=yes" : "MemoryAccounting=no");
|
||||
}
|
||||
|
||||
@ -525,7 +525,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->memory_limit = limit;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_MEMORY;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_MEMORY);
|
||||
|
||||
if (limit == (uint64_t) -1)
|
||||
unit_write_drop_in_private(u, mode, name, "MemoryLimit=infinity");
|
||||
@ -551,7 +551,7 @@ int bus_cgroup_set_property(
|
||||
char *buf;
|
||||
|
||||
c->device_policy = p;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_DEVICES;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_DEVICES);
|
||||
|
||||
buf = strjoina("DevicePolicy=", policy);
|
||||
unit_write_drop_in_private(u, mode, name, buf);
|
||||
@ -630,7 +630,7 @@ int bus_cgroup_set_property(
|
||||
cgroup_context_free_device_allow(c, c->device_allow);
|
||||
}
|
||||
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_DEVICES;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_DEVICES);
|
||||
|
||||
f = open_memstream(&buf, &size);
|
||||
if (!f)
|
||||
@ -655,7 +655,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->tasks_accounting = b;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_PIDS;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_PIDS);
|
||||
unit_write_drop_in_private(u, mode, name, b ? "TasksAccounting=yes" : "TasksAccounting=no");
|
||||
}
|
||||
|
||||
@ -670,7 +670,7 @@ int bus_cgroup_set_property(
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
c->tasks_max = limit;
|
||||
u->cgroup_realized_mask &= ~CGROUP_MASK_PIDS;
|
||||
unit_invalidate_cgroup(u, CGROUP_MASK_PIDS);
|
||||
|
||||
if (limit == (uint64_t) -1)
|
||||
unit_write_drop_in_private(u, mode, name, "TasksMax=infinity");
|
||||
|
@ -2667,9 +2667,6 @@ static void manager_notify_finished(Manager *m) {
|
||||
}
|
||||
|
||||
void manager_check_finished(Manager *m) {
|
||||
Unit *u = NULL;
|
||||
Iterator i;
|
||||
|
||||
assert(m);
|
||||
|
||||
if (m->n_reloading > 0)
|
||||
@ -2682,11 +2679,9 @@ void manager_check_finished(Manager *m) {
|
||||
return;
|
||||
|
||||
if (hashmap_size(m->jobs) > 0) {
|
||||
|
||||
if (m->jobs_in_progress_event_source)
|
||||
/* Ignore any failure, this is only for feedback */
|
||||
(void) sd_event_source_set_time(m->jobs_in_progress_event_source,
|
||||
now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
|
||||
(void) sd_event_source_set_time(m->jobs_in_progress_event_source, now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -2712,9 +2707,7 @@ void manager_check_finished(Manager *m) {
|
||||
|
||||
manager_notify_finished(m);
|
||||
|
||||
SET_FOREACH(u, m->startup_units, i)
|
||||
if (u->cgroup_path)
|
||||
cgroup_context_apply(unit_get_cgroup_context(u), unit_get_own_mask(u), u->cgroup_path, manager_state(m));
|
||||
manager_invalidate_startup_units(m);
|
||||
}
|
||||
|
||||
static int create_generator_dir(Manager *m, char **generator, const char *name) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user