OSDN Git Service

perf namespaces: Add helper nsinfo__is_in_root_namespace()
authorLeo Yan <leo.yan@linaro.org>
Sun, 12 Dec 2021 13:47:20 +0000 (21:47 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 16 Dec 2021 15:18:12 +0000 (12:18 -0300)
Refactors code for gathering PID infos, it creates the function
nsinfo__get_nspid() to parse process 'status' node in folder '/proc'.

Base on the refactoring, this patch introduces a new helper
nsinfo__is_in_root_namespace(), it returns true when the caller runs in
the root PID namespace.

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: John Garry <john.garry@huawei.com>
Cc: KP Singh <kpsingh@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Yonatan Goldschmidt <yonatan.goldschmidt@granulate.io>
Cc: Yonghong Song <yhs@fb.com>
Cc: bpf@vger.kernel.org
Cc: netdev@vger.kernel.org
Link: http://lore.kernel.org/lkml/20211212134721.1721245-2-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/namespaces.c
tools/perf/util/namespaces.h

index 608b20c..48aa321 100644 (file)
@@ -60,17 +60,49 @@ void namespaces__free(struct namespaces *namespaces)
        free(namespaces);
 }
 
+static int nsinfo__get_nspid(struct nsinfo *nsi, const char *path)
+{
+       FILE *f = NULL;
+       char *statln = NULL;
+       size_t linesz = 0;
+       char *nspid;
+
+       f = fopen(path, "r");
+       if (f == NULL)
+               return -1;
+
+       while (getline(&statln, &linesz, f) != -1) {
+               /* Use tgid if CONFIG_PID_NS is not defined. */
+               if (strstr(statln, "Tgid:") != NULL) {
+                       nsi->tgid = (pid_t)strtol(strrchr(statln, '\t'),
+                                                    NULL, 10);
+                       nsi->nstgid = nsi->tgid;
+               }
+
+               if (strstr(statln, "NStgid:") != NULL) {
+                       nspid = strrchr(statln, '\t');
+                       nsi->nstgid = (pid_t)strtol(nspid, NULL, 10);
+                       /*
+                        * If innermost tgid is not the first, process is in a different
+                        * PID namespace.
+                        */
+                       nsi->in_pidns = (statln + sizeof("NStgid:") - 1) != nspid;
+                       break;
+               }
+       }
+
+       fclose(f);
+       free(statln);
+       return 0;
+}
+
 int nsinfo__init(struct nsinfo *nsi)
 {
        char oldns[PATH_MAX];
        char spath[PATH_MAX];
        char *newns = NULL;
-       char *statln = NULL;
-       char *nspid;
        struct stat old_stat;
        struct stat new_stat;
-       FILE *f = NULL;
-       size_t linesz = 0;
        int rv = -1;
 
        if (snprintf(oldns, PATH_MAX, "/proc/self/ns/mnt") >= PATH_MAX)
@@ -100,34 +132,9 @@ int nsinfo__init(struct nsinfo *nsi)
        if (snprintf(spath, PATH_MAX, "/proc/%d/status", nsi->pid) >= PATH_MAX)
                goto out;
 
-       f = fopen(spath, "r");
-       if (f == NULL)
-               goto out;
-
-       while (getline(&statln, &linesz, f) != -1) {
-               /* Use tgid if CONFIG_PID_NS is not defined. */
-               if (strstr(statln, "Tgid:") != NULL) {
-                       nsi->tgid = (pid_t)strtol(strrchr(statln, '\t'),
-                                                    NULL, 10);
-                       nsi->nstgid = nsi->tgid;
-               }
-
-               if (strstr(statln, "NStgid:") != NULL) {
-                       nspid = strrchr(statln, '\t');
-                       nsi->nstgid = (pid_t)strtol(nspid, NULL, 10);
-                       /* If innermost tgid is not the first, process is in a different
-                        * PID namespace.
-                        */
-                       nsi->in_pidns = (statln + sizeof("NStgid:") - 1) != nspid;
-                       break;
-               }
-       }
-       rv = 0;
+       rv = nsinfo__get_nspid(nsi, spath);
 
 out:
-       if (f != NULL)
-               (void) fclose(f);
-       free(statln);
        free(newns);
        return rv;
 }
@@ -299,3 +306,12 @@ int nsinfo__stat(const char *filename, struct stat *st, struct nsinfo *nsi)
 
        return ret;
 }
+
+bool nsinfo__is_in_root_namespace(void)
+{
+       struct nsinfo nsi;
+
+       memset(&nsi, 0x0, sizeof(nsi));
+       nsinfo__get_nspid(&nsi, "/proc/self/status");
+       return !nsi.in_pidns;
+}
index ad9775d..9ceea96 100644 (file)
@@ -59,6 +59,8 @@ void nsinfo__mountns_exit(struct nscookie *nc);
 char *nsinfo__realpath(const char *path, struct nsinfo *nsi);
 int nsinfo__stat(const char *filename, struct stat *st, struct nsinfo *nsi);
 
+bool nsinfo__is_in_root_namespace(void);
+
 static inline void __nsinfo__zput(struct nsinfo **nsip)
 {
        if (nsip) {