ac3a84
From 1672b8dd340c4d4aa6398a08b15b36368ba442ec Mon Sep 17 00:00:00 2001
ac3a84
From: =?UTF-8?q?Michal=20Koutn=C3=BD?= <mkoutny@suse.com>
ac3a84
Date: Fri, 25 Nov 2022 17:50:27 +0100
ac3a84
Subject: [PATCH] cgtop: Do not rewrite -P or -k options
ac3a84
ac3a84
--recursive=no will overwrite possible -P or -k option hence making the
ac3a84
recursive disabling impossible.
ac3a84
ac3a84
Check what counting types the system supports (encoded in the ordering
ac3a84
of our enum) of and pick whatever user requests but is also supported.
ac3a84
ac3a84
Fixes: #25248
ac3a84
(cherry picked from commit 48600b3524afe05d0faa8a5c88b5aaa53b801199)
ac3a84
ac3a84
Related: #2138081
ac3a84
---
ac3a84
 src/cgtop/cgtop.c | 16 ++++++++++------
ac3a84
 1 file changed, 10 insertions(+), 6 deletions(-)
ac3a84
ac3a84
diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
ac3a84
index 95c3987525..8a51a9371b 100644
ac3a84
--- a/src/cgtop/cgtop.c
ac3a84
+++ b/src/cgtop/cgtop.c
ac3a84
@@ -55,6 +55,12 @@ typedef struct Group {
ac3a84
         uint64_t io_input_bps, io_output_bps;
ac3a84
 } Group;
ac3a84
 
ac3a84
+typedef enum PidsCount {
ac3a84
+        COUNT_USERSPACE_PROCESSES,
ac3a84
+        COUNT_ALL_PROCESSES,
ac3a84
+        COUNT_PIDS,
ac3a84
+} PidsCount;
ac3a84
+
ac3a84
 static unsigned arg_depth = 3;
ac3a84
 static unsigned arg_iterations = UINT_MAX;
ac3a84
 static bool arg_batch = false;
ac3a84
@@ -65,11 +71,7 @@ static char* arg_root = NULL;
ac3a84
 static bool arg_recursive = true;
ac3a84
 static bool arg_recursive_unset = false;
ac3a84
 
ac3a84
-static enum {
ac3a84
-        COUNT_PIDS,
ac3a84
-        COUNT_USERSPACE_PROCESSES,
ac3a84
-        COUNT_ALL_PROCESSES,
ac3a84
-} arg_count = COUNT_PIDS;
ac3a84
+static PidsCount arg_count = COUNT_PIDS;
ac3a84
 
ac3a84
 static enum {
ac3a84
         ORDER_PATH,
ac3a84
@@ -915,6 +917,7 @@ static int run(int argc, char *argv[]) {
ac3a84
         usec_t last_refresh = 0;
ac3a84
         bool quit = false, immediate_refresh = false;
ac3a84
         _cleanup_free_ char *root = NULL;
ac3a84
+        PidsCount possible_count;
ac3a84
         CGroupMask mask;
ac3a84
         int r;
ac3a84
 
ac3a84
@@ -928,7 +931,8 @@ static int run(int argc, char *argv[]) {
ac3a84
         if (r < 0)
ac3a84
                 return log_error_errno(r, "Failed to determine supported controllers: %m");
ac3a84
 
ac3a84
-        arg_count = (mask & CGROUP_MASK_PIDS) ? COUNT_PIDS : COUNT_USERSPACE_PROCESSES;
ac3a84
+        possible_count = (mask & CGROUP_MASK_PIDS) ? COUNT_PIDS : COUNT_ALL_PROCESSES;
ac3a84
+        arg_count = MIN(possible_count, arg_count);
ac3a84
 
ac3a84
         if (arg_recursive_unset && arg_count == COUNT_PIDS)
ac3a84
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),