perf namespaces: Add helper nsinfo__is_in_root_namespace()
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>
This commit is contained in:
parent
017f7d1fac
commit
5d28a17c1c
|
@ -60,17 +60,49 @@ void namespaces__free(struct namespaces *namespaces)
|
||||||
free(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)
|
int nsinfo__init(struct nsinfo *nsi)
|
||||||
{
|
{
|
||||||
char oldns[PATH_MAX];
|
char oldns[PATH_MAX];
|
||||||
char spath[PATH_MAX];
|
char spath[PATH_MAX];
|
||||||
char *newns = NULL;
|
char *newns = NULL;
|
||||||
char *statln = NULL;
|
|
||||||
char *nspid;
|
|
||||||
struct stat old_stat;
|
struct stat old_stat;
|
||||||
struct stat new_stat;
|
struct stat new_stat;
|
||||||
FILE *f = NULL;
|
|
||||||
size_t linesz = 0;
|
|
||||||
int rv = -1;
|
int rv = -1;
|
||||||
|
|
||||||
if (snprintf(oldns, PATH_MAX, "/proc/self/ns/mnt") >= PATH_MAX)
|
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)
|
if (snprintf(spath, PATH_MAX, "/proc/%d/status", nsi->pid) >= PATH_MAX)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
f = fopen(spath, "r");
|
rv = nsinfo__get_nspid(nsi, spath);
|
||||||
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;
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (f != NULL)
|
|
||||||
(void) fclose(f);
|
|
||||||
free(statln);
|
|
||||||
free(newns);
|
free(newns);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -299,3 +306,12 @@ int nsinfo__stat(const char *filename, struct stat *st, struct nsinfo *nsi)
|
||||||
|
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -59,6 +59,8 @@ void nsinfo__mountns_exit(struct nscookie *nc);
|
||||||
char *nsinfo__realpath(const char *path, struct nsinfo *nsi);
|
char *nsinfo__realpath(const char *path, struct nsinfo *nsi);
|
||||||
int nsinfo__stat(const char *filename, struct stat *st, 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)
|
static inline void __nsinfo__zput(struct nsinfo **nsip)
|
||||||
{
|
{
|
||||||
if (nsip) {
|
if (nsip) {
|
||||||
|
|
Loading…
Reference in New Issue