Messages in this thread | | | Date | Tue, 28 Jan 2020 10:40:57 +0100 | From | Jiri Olsa <> | Subject | Re: [PATCH v2] tools lib api fs: Move cgroupsfs__mountpoint() |
| |
On Tue, Jan 28, 2020 at 09:49:40AM +0900, Namhyung Kim wrote: > Move it from tools/perf/util/cgroup.c as it can be used by other places. > Note that cgroup filesystem is different from others since it's usually > mounted separately (in v1) for each subsystem. > > I just copied the code with a little modification to pass a name of > subsystem and renamed it to follow other APIs. > > Suggested-by: Jiri Olsa <jolsa@redhat.com> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
thanks, jirka
> --- > * rename to cgroupfs__mountpoint() > > tools/lib/api/fs/Build | 1 + > tools/lib/api/fs/cgroup.c | 67 +++++++++++++++++++++++++++++++++++++++ > tools/lib/api/fs/fs.h | 2 ++ > tools/perf/util/cgroup.c | 63 ++---------------------------------- > 4 files changed, 72 insertions(+), 61 deletions(-) > create mode 100644 tools/lib/api/fs/cgroup.c > > diff --git a/tools/lib/api/fs/Build b/tools/lib/api/fs/Build > index f4ed9629ae85..0f75b28654de 100644 > --- a/tools/lib/api/fs/Build > +++ b/tools/lib/api/fs/Build > @@ -1,2 +1,3 @@ > libapi-y += fs.o > libapi-y += tracing_path.o > +libapi-y += cgroup.o > diff --git a/tools/lib/api/fs/cgroup.c b/tools/lib/api/fs/cgroup.c > new file mode 100644 > index 000000000000..c7e1cdaa36e1 > --- /dev/null > +++ b/tools/lib/api/fs/cgroup.c > @@ -0,0 +1,67 @@ > +// SPDX-License-Identifier: GPL-2.0 > +#include <linux/stringify.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <fcntl.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include "fs.h" > + > +int cgroupfs__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 *token, *saved_ptr = NULL; > + > + fp = fopen("/proc/mounts", "r"); > + if (!fp) > + return -1; > + > + /* > + * 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 > + */ > + 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")) { > + > + token = strtok_r(tokens, ",", &saved_ptr); > + > + while (token != NULL) { > + if (subsys && !strcmp(token, subsys)) { > + strcpy(path_v1, mountpoint); > + break; > + } > + token = strtok_r(NULL, ",", &saved_ptr); > + } > + } > + > + if (!path_v2[0] && !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); > + return 0; > + } > + return -1; > +} > diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h > index 92d03b8396b1..07591ecbe39f 100644 > --- a/tools/lib/api/fs/fs.h > +++ b/tools/lib/api/fs/fs.h > @@ -28,6 +28,8 @@ FS(bpf_fs) > #undef FS > > > +int cgroupfs__mountpoint(char *buf, size_t maxlen, const char *subsys); > + > int filename__read_int(const char *filename, int *value); > int filename__read_ull(const char *filename, unsigned long long *value); > int filename__read_xll(const char *filename, unsigned long long *value); > diff --git a/tools/perf/util/cgroup.c b/tools/perf/util/cgroup.c > index 4881d4af3381..12e466d1ec3b 100644 > --- a/tools/perf/util/cgroup.c > +++ b/tools/perf/util/cgroup.c > @@ -3,75 +3,16 @@ > #include "evsel.h" > #include "cgroup.h" > #include "evlist.h" > -#include <linux/stringify.h> > #include <linux/zalloc.h> > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > #include <stdlib.h> > #include <string.h> > +#include <api/fs/fs.h> > > int nr_cgroups; > > -static int > -cgroupfs_find_mountpoint(char *buf, size_t maxlen) > -{ > - 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 *token, *saved_ptr = NULL; > - > - fp = fopen("/proc/mounts", "r"); > - if (!fp) > - return -1; > - > - /* > - * 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 > - */ > - 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")) { > - > - token = strtok_r(tokens, ",", &saved_ptr); > - > - while (token != NULL) { > - if (!strcmp(token, "perf_event")) { > - strcpy(path_v1, mountpoint); > - break; > - } > - token = strtok_r(NULL, ",", &saved_ptr); > - } > - } > - > - if (!path_v2[0] && !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); > - return 0; > - } > - return -1; > -} > - > static int open_cgroup(const char *name) > { > char path[PATH_MAX + 1]; > @@ -79,7 +20,7 @@ static int open_cgroup(const char *name) > int fd; > > > - if (cgroupfs_find_mountpoint(mnt, PATH_MAX + 1)) > + if (cgroupfs__mountpoint(mnt, PATH_MAX + 1, "perf_event")) > return -1; > > scnprintf(path, PATH_MAX, "%s/%s", mnt, name); > -- > 2.25.0.341.g760bfbb309-goog >
| |