The cgroupfs_find_mountpoint() looks up the /proc/mounts file to find
a directory for the given cgroup subsystem.  It keeps both cgroup v1
and v2 path since there's a possibility of the mixed hierarchly.

But we can simply use v1 path if it's found as it will override the v2
hierarchy.

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
---
 tools/lib/api/fs/cgroup.c | 34 +++++++++++++++-------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/tools/lib/api/fs/cgroup.c b/tools/lib/api/fs/cgroup.c
index 889a6eb4aaca..813236d8ca48 100644
--- a/tools/lib/api/fs/cgroup.c
+++ b/tools/lib/api/fs/cgroup.c
@@ -12,7 +12,7 @@ int cgroupfs_find_mountpoint(char *buf, size_t maxlen, const 
char *subsys)
 {
        FILE *fp;
        char mountpoint[PATH_MAX + 1], tokens[PATH_MAX + 1], type[PATH_MAX + 1];
-       char path_v1[PATH_MAX + 1], path_v2[PATH_MAX + 2], *path;
+       char path_v2[PATH_MAX + 1];
        char *token, *saved_ptr = NULL;
 
        fp = fopen("/proc/mounts", "r");
@@ -22,45 +22,41 @@ int cgroupfs_find_mountpoint(char *buf, size_t maxlen, 
const char *subsys)
        /*
         * in order to handle split hierarchy, we need to scan /proc/mounts
         * and inspect every cgroupfs mount point to find one that has
-        * perf_event subsystem
+        * the given subsystem.  If we found v1, just use it.  If not we can
+        * use v2 path as a fallback.
         */
-       path_v1[0] = '\0';
        path_v2[0] = '\0';
 
        while (fscanf(fp, "%*s %"__stringify(PATH_MAX)"s 
%"__stringify(PATH_MAX)"s %"
                                __stringify(PATH_MAX)"s %*d %*d\n",
                                mountpoint, type, tokens) == 3) {
 
-               if (!path_v1[0] && !strcmp(type, "cgroup")) {
+               if (!strcmp(type, "cgroup")) {
 
                        token = strtok_r(tokens, ",", &saved_ptr);
 
                        while (token != NULL) {
                                if (subsys && !strcmp(token, subsys)) {
-                                       strcpy(path_v1, mountpoint);
-                                       break;
+                                       /* found */
+                                       fclose(fp);
+
+                                       if (strlen(mountpoint) < maxlen) {
+                                               strcpy(buf, mountpoint);
+                                               return 0;
+                                       }
+                                       return -1;
                                }
                                token = strtok_r(NULL, ",", &saved_ptr);
                        }
                }
 
-               if (!path_v2[0] && !strcmp(type, "cgroup2"))
+               if (!strcmp(type, "cgroup2"))
                        strcpy(path_v2, mountpoint);
-
-               if (path_v1[0] && path_v2[0])
-                       break;
        }
        fclose(fp);
 
-       if (path_v1[0])
-               path = path_v1;
-       else if (path_v2[0])
-               path = path_v2;
-       else
-               return -1;
-
-       if (strlen(path) < maxlen) {
-               strcpy(buf, path);
+       if (path_v2[0] && strlen(path_v2) < maxlen) {
+               strcpy(buf, path_v2);
                return 0;
        }
        return -1;
-- 
2.29.2.684.gfbc64c5ab5-goog

Reply via email to