diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2022-03-23 09:58:40 +0100 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2022-03-23 09:58:40 +0100 | 
| commit | b690490d6d466972ade172ee2e7f6ffa49e7e910 (patch) | |
| tree | 50a93da28c9128e19eb7a3038aecf75dab6b36e1 /tools/perf/util/namespaces.c | |
| parent | f97ec5d75e9261a5da78dc28a8955b7cc0c4468b (diff) | |
| parent | 0f203948230720e849ad50d158adac1cd32c282f (diff) | |
Merge branch 'for-5.18/amd-sfh' into for-linus
- dead code elimination (Christophe JAILLET)
Diffstat (limited to 'tools/perf/util/namespaces.c')
| -rw-r--r-- | tools/perf/util/namespaces.c | 76 | 
1 files changed, 46 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; +}  | 
