Magellan Linux

Contents of /trunk/systemd/patches/systemd-242-cgroup-util-kill-also-threads.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3368 - (show annotations) (download)
Tue Jul 9 11:20:22 2019 UTC (4 years, 10 months ago) by niro
File size: 3713 byte(s)
-added systemd-242 upstream patches
1 From e48fcfef06d81bf08607d3c1657fdc6aa1e9a6ee Mon Sep 17 00:00:00 2001
2 From: Topi Miettinen <toiwoton@gmail.com>
3 Date: Mon, 20 May 2019 12:20:58 +0300
4 Subject: [PATCH] cgroup-util: kill also threads
5
6 It's possible for a zombie process to have live threads. These are not listed
7 in /sys in "cgroup.procs" for cgroupsv2, but they show up in
8 "cgroup.threads" (cgroupv2) or "tasks" (cgroupv1) nodes. When killing a
9 cgroup (v2 only) with SIGKILL, let's also kill threads after killing processes,
10 so the live threads of a zombie get killed too.
11
12 Closes #12262.
13 ---
14 src/basic/cgroup-util.c | 40 +++++++++++++++++++++++++++++++++++-----
15 1 file changed, 35 insertions(+), 5 deletions(-)
16
17 diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c
18 index 156a360885d..60ce9b7d3a6 100644
19 --- a/src/basic/cgroup-util.c
20 +++ b/src/basic/cgroup-util.c
21 @@ -43,14 +43,14 @@
22 #include "unit-name.h"
23 #include "user-util.h"
24
25 -int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) {
26 +static int cg_enumerate_items(const char *controller, const char *path, FILE **_f, const char *item) {
27 _cleanup_free_ char *fs = NULL;
28 FILE *f;
29 int r;
30
31 assert(_f);
32
33 - r = cg_get_path(controller, path, "cgroup.procs", &fs);
34 + r = cg_get_path(controller, path, item, &fs);
35 if (r < 0)
36 return r;
37
38 @@ -62,6 +62,10 @@ int cg_enumerate_processes(const char *controller, const char *path, FILE **_f)
39 return 0;
40 }
41
42 +int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) {
43 + return cg_enumerate_items(controller, path, _f, "cgroup.procs");
44 +}
45 +
46 int cg_read_pid(FILE *f, pid_t *_pid) {
47 unsigned long ul;
48
49 @@ -221,14 +225,15 @@ int cg_rmdir(const char *controller, const char *path) {
50 return 0;
51 }
52
53 -int cg_kill(
54 +static int cg_kill_items(
55 const char *controller,
56 const char *path,
57 int sig,
58 CGroupFlags flags,
59 Set *s,
60 cg_kill_log_func_t log_kill,
61 - void *userdata) {
62 + void *userdata,
63 + const char *item) {
64
65 _cleanup_set_free_ Set *allocated_set = NULL;
66 bool done = false;
67 @@ -259,7 +264,7 @@ int cg_kill(
68 pid_t pid = 0;
69 done = true;
70
71 - r = cg_enumerate_processes(controller, path, &f);
72 + r = cg_enumerate_items(controller, path, &f, item);
73 if (r < 0) {
74 if (ret >= 0 && r != -ENOENT)
75 return r;
76 @@ -322,6 +327,31 @@ int cg_kill(
77 return ret;
78 }
79
80 +int cg_kill(
81 + const char *controller,
82 + const char *path,
83 + int sig,
84 + CGroupFlags flags,
85 + Set *s,
86 + cg_kill_log_func_t log_kill,
87 + void *userdata) {
88 + int r;
89 +
90 + r = cg_kill_items(controller, path, sig, flags, s, log_kill, userdata, "cgroup.procs");
91 + if (r < 0 || sig != SIGKILL)
92 + return r;
93 +
94 + /* Only in case of killing with SIGKILL and when using cgroupsv2, kill remaining threads manually as
95 + a workaround for kernel bug. It was fixed in 5.2-rc5 (c03cd7738a83). */
96 + r = cg_unified_controller(controller);
97 + if (r < 0)
98 + return r;
99 + if (r == 0) /* doesn't apply to legacy hierarchy */
100 + return 0;
101 +
102 + return cg_kill_items(controller, path, sig, flags, s, log_kill, userdata, "cgroup.threads");
103 +}
104 +
105 int cg_kill_recursive(
106 const char *controller,
107 const char *path,