summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-01-12 16:09:38 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-01-18 12:34:30 +0100
commit1fb50408ce23e67e0be94ead69c891d26b4823e2 (patch)
tree11a1aa02cc1833453561cd655e2fdf13069d9204
parenttest: fix a copy-and-paste error (diff)
downloadsystemd-1fb50408ce23e67e0be94ead69c891d26b4823e2.tar.xz
systemd-1fb50408ce23e67e0be94ead69c891d26b4823e2.zip
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.
-rw-r--r--src/core/dbus-unit.c8
-rw-r--r--src/shared/cgroup-show.c17
2 files changed, 18 insertions, 7 deletions
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
index eef491740c..1128c42ad9 100644
--- a/src/core/dbus-unit.c
+++ b/src/core/dbus-unit.c
@@ -1314,11 +1314,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 40bc2bff05..48dd4d8001 100644
--- a/src/shared/cgroup-show.c
+++ b/src/shared/cgroup-show.c
@@ -89,7 +89,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;
@@ -102,7 +101,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;
@@ -113,9 +123,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;