Em Sun, Dec 12, 2021 at 09:47:20PM +0800, Leo Yan escreveu: > 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. Thanks, applied. - Arnaldo > Signed-off-by: Leo Yan <leo.yan@xxxxxxxxxx> > --- > tools/perf/util/namespaces.c | 76 ++++++++++++++++++++++-------------- > tools/perf/util/namespaces.h | 2 + > 2 files changed, 48 insertions(+), 30 deletions(-) > > diff --git a/tools/perf/util/namespaces.c b/tools/perf/util/namespaces.c > index 608b20c72a5c..48aa3217300b 100644 > --- a/tools/perf/util/namespaces.c > +++ b/tools/perf/util/namespaces.c > @@ -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; > +} > diff --git a/tools/perf/util/namespaces.h b/tools/perf/util/namespaces.h > index ad9775db7b9c..9ceea9643507 100644 > --- a/tools/perf/util/namespaces.h > +++ b/tools/perf/util/namespaces.h > @@ -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) { > -- > 2.25.1 -- - Arnaldo