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:
Родитель
017f7d1fac
Коммит
5d28a17c1c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче