perf namespaces: Add 'in_pidns' to nsinfo struct
authorYonatan Goldschmidt <yonatan.goldschmidt@granulate.io>
Thu, 5 Nov 2020 01:54:18 +0000 (03:54 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 3 Feb 2021 16:10:44 +0000 (13:10 -0300)
Provides an accurate mean to determine if the owner thread is in a
different PID namespace.

Signed-off-by: Yonatan Goldschmidt <yonatan.goldschmidt@granulate.io>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20201105015418.1725218-1-yonatan.goldschmidt@granulate.io
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/namespaces.c
tools/perf/util/namespaces.h

index 285d6f30d9129095e4d9fa40ebc508650ccd5516..f4b3512d8dd2fc4ac199a4df2761ae1e594057b7 100644 (file)
@@ -66,6 +66,7 @@ int nsinfo__init(struct nsinfo *nsi)
        char spath[PATH_MAX];
        char *newns = NULL;
        char *statln = NULL;
+       char *nspid;
        struct stat old_stat;
        struct stat new_stat;
        FILE *f = NULL;
@@ -112,8 +113,12 @@ int nsinfo__init(struct nsinfo *nsi)
                }
 
                if (strstr(statln, "NStgid:") != NULL) {
-                       nsi->nstgid = (pid_t)strtol(strrchr(statln, '\t'),
-                                                    NULL, 10);
+                       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;
                }
        }
@@ -140,6 +145,7 @@ struct nsinfo *nsinfo__new(pid_t pid)
                nsi->tgid = pid;
                nsi->nstgid = pid;
                nsi->need_setns = false;
+               nsi->in_pidns = false;
                /* Init may fail if the process exits while we're trying to look
                 * at its proc information.  In that case, save the pid but
                 * don't try to enter the namespace.
@@ -166,6 +172,7 @@ struct nsinfo *nsinfo__copy(struct nsinfo *nsi)
                nnsi->tgid = nsi->tgid;
                nnsi->nstgid = nsi->nstgid;
                nnsi->need_setns = nsi->need_setns;
+               nnsi->in_pidns = nsi->in_pidns;
                if (nsi->mntns_path) {
                        nnsi->mntns_path = strdup(nsi->mntns_path);
                        if (!nnsi->mntns_path) {
index 4b33f684eddd00f20cba42f05444cd48210711c8..1cc8637cf88509e9c6c74369ff512b6450659b55 100644 (file)
@@ -33,6 +33,7 @@ struct nsinfo {
        pid_t                   tgid;
        pid_t                   nstgid;
        bool                    need_setns;
+       bool                    in_pidns;
        char                    *mntns_path;
        refcount_t              refcnt;
 };