tools api fs: Prefer cgroup v1 path in cgroupfs_find_mountpoint()
authorNamhyung Kim <namhyung@kernel.org>
Wed, 16 Dec 2020 09:05:54 +0000 (18:05 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 17 Feb 2021 18:06:22 +0000 (15:06 -0300)
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 <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20201216090556.813996-1-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/api/fs/cgroup.c

index 889a6eb..813236d 100644 (file)
@@ -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;