]> git.ipfire.org Git - thirdparty/systemd.git/commit - src/core/manager.c
manager: Only invoke a single sigchld per unit within a cleanup cycle 3634/head
authorKyle Walker <walker.kyle.t@gmail.com>
Thu, 30 Jun 2016 19:12:18 +0000 (15:12 -0400)
committerKyle Walker <walker.kyle.t@gmail.com>
Thu, 30 Jun 2016 19:16:47 +0000 (15:16 -0400)
commit36f20ae3b2975e44b6ef17e453ae06a289e9a122
tree9fa9abeb4e1724e4c505f193e3b69cda57b732a4
parent7486322b99da5b4d2d00d35b310b035f936f7964
manager: Only invoke a single sigchld per unit within a cleanup cycle

By default, each iteration of manager_dispatch_sigchld() results in a unit level
sigchld event being invoked. For scope units, this results in a scope_sigchld_event()
which can seemingly stall for workloads that have a large number of PIDs within the
scope. The stall exhibits itself as a SIG_0 being initiated for each u->pids entry
as a result of pid_is_unwaited().

v2:
This patch resolves this condition by only paying to cost of a sigchld in the underlying
scope unit once per sigchld iteration. A new "sigchldgen" member resides within the
Unit struct. The Manager is incremented via the sd event loop, accessed via
sd_event_get_iteration, and the Unit member is set to the same value as the manager each
time that a sigchld event is invoked. If the Manager iteration value and Unit member
match, the sigchld event is not invoked for that iteration.
src/core/manager.c
src/core/unit.c
src/core/unit.h