87 lines
3.2 KiB
Diff
87 lines
3.2 KiB
Diff
From 9029ab8ae01f315cc9ce795ad52e09013e10d893 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Thu, 13 Jan 2022 00:09:38 +0900
|
|
Subject: [PATCH] pid1,cgroup-show: ignore -EOPNOTSUPP in cg_read_pid()
|
|
|
|
The function is called in recursion, and cgroup.procs in some subcgroups
|
|
may not be read.
|
|
|
|
Fixes #22089.
|
|
|
|
Reference: https://github.com/systemd/systemd/pull/22095/commits/c41911ce12d23d28b090b51c200db1e1e8ee7ce7
|
|
|
|
Signed-off-by: zhaoxiaohu <zhaoxiaohu@kuaishou.com>
|
|
Signed-off-by: yuwang <yuwang@kuaishou.com>
|
|
---
|
|
src/core/dbus-unit.c | 8 ++++++--
|
|
src/shared/cgroup-show.c | 17 ++++++++++++-----
|
|
2 files changed, 18 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
|
|
index 24e4d25..0640d3e 100644
|
|
--- a/src/core/dbus-unit.c
|
|
+++ b/src/core/dbus-unit.c
|
|
@@ -1295,11 +1295,15 @@ static int append_cgroup(sd_bus_message *reply, const char *p, Set *pids) {
|
|
for (;;) {
|
|
pid_t pid;
|
|
|
|
+ /* libvirt / qemu uses threaded mode and cgroup.procs cannot be read at the lower levels.
|
|
+ * From https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#threads,
|
|
+ * “cgroup.procs” in a threaded domain cgroup contains the PIDs of all processes in
|
|
+ * the subtree and is not readable in the subtree proper. */
|
|
r = cg_read_pid(f, &pid);
|
|
+ if (IN_SET(r, 0, -EOPNOTSUPP))
|
|
+ break;
|
|
if (r < 0)
|
|
return r;
|
|
- if (r == 0)
|
|
- break;
|
|
|
|
if (is_kernel_thread(pid) > 0)
|
|
continue;
|
|
diff --git a/src/shared/cgroup-show.c b/src/shared/cgroup-show.c
|
|
index c7e63be..c324652 100644
|
|
--- a/src/shared/cgroup-show.c
|
|
+++ b/src/shared/cgroup-show.c
|
|
@@ -86,7 +86,6 @@ static int show_cgroup_one_by_path(
|
|
_cleanup_fclose_ FILE *f = NULL;
|
|
_cleanup_free_ char *p = NULL;
|
|
size_t n = 0;
|
|
- pid_t pid;
|
|
char *fn;
|
|
int r;
|
|
|
|
@@ -99,7 +98,18 @@ static int show_cgroup_one_by_path(
|
|
if (!f)
|
|
return -errno;
|
|
|
|
- while ((r = cg_read_pid(f, &pid)) > 0) {
|
|
+ for (;;) {
|
|
+ pid_t pid;
|
|
+
|
|
+ /* libvirt / qemu uses threaded mode and cgroup.procs cannot be read at the lower levels.
|
|
+ * From https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#threads,
|
|
+ * “cgroup.procs” in a threaded domain cgroup contains the PIDs of all processes in
|
|
+ * the subtree and is not readable in the subtree proper. */
|
|
+ r = cg_read_pid(f, &pid);
|
|
+ if (IN_SET(r, 0, -EOPNOTSUPP))
|
|
+ break;
|
|
+ if (r < 0)
|
|
+ return r;
|
|
|
|
if (!(flags & OUTPUT_KERNEL_THREADS) && is_kernel_thread(pid) > 0)
|
|
continue;
|
|
@@ -110,9 +120,6 @@ static int show_cgroup_one_by_path(
|
|
pids[n++] = pid;
|
|
}
|
|
|
|
- if (r < 0)
|
|
- return r;
|
|
-
|
|
show_pid_array(pids, n, prefix, n_columns, false, more, flags);
|
|
|
|
return 0;
|
|
--
|
|
2.33.0
|
|
|