diff options
Diffstat (limited to 'tools/perf/util/util.c')
| -rw-r--r-- | tools/perf/util/util.c | 207 | 
1 files changed, 10 insertions, 197 deletions
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index a61535cf1bca..5eda6e19c947 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c @@ -1,10 +1,8 @@  // SPDX-License-Identifier: GPL-2.0 -#include "../perf.h"  #include "util.h"  #include "debug.h" -#include "namespaces.h" +#include "event.h"  #include <api/fs/fs.h> -#include <sys/mman.h>  #include <sys/stat.h>  #include <sys/utsname.h>  #include <dirent.h> @@ -16,10 +14,12 @@  #include <string.h>  #include <errno.h>  #include <limits.h> +#include <linux/capability.h>  #include <linux/kernel.h>  #include <linux/log2.h>  #include <linux/time64.h>  #include <unistd.h> +#include "cap.h"  #include "strlist.h"  #include "string2.h" @@ -39,28 +39,6 @@ void perf_set_multithreaded(void)  	perf_singlethreaded = false;  } -unsigned int page_size; - -#ifdef _SC_LEVEL1_DCACHE_LINESIZE -#define cache_line_size(cacheline_sizep) *cacheline_sizep = sysconf(_SC_LEVEL1_DCACHE_LINESIZE) -#else -static void cache_line_size(int *cacheline_sizep) -{ -	if (sysfs__read_int("devices/system/cpu/cpu0/cache/index0/coherency_line_size", cacheline_sizep)) -		pr_debug("cannot determine cache line size"); -} -#endif - -int cacheline_size(void) -{ -	static int size; - -	if (!size) -		cache_line_size(&size); - -	return size; -} -  int sysctl_perf_event_max_stack = PERF_MAX_STACK_DEPTH;  int sysctl_perf_event_max_contexts_per_stack = PERF_MAX_CONTEXTS_PER_STACK; @@ -252,178 +230,6 @@ out:  	return list;  } -static int slow_copyfile(const char *from, const char *to, struct nsinfo *nsi) -{ -	int err = -1; -	char *line = NULL; -	size_t n; -	FILE *from_fp, *to_fp; -	struct nscookie nsc; - -	nsinfo__mountns_enter(nsi, &nsc); -	from_fp = fopen(from, "r"); -	nsinfo__mountns_exit(&nsc); -	if (from_fp == NULL) -		goto out; - -	to_fp = fopen(to, "w"); -	if (to_fp == NULL) -		goto out_fclose_from; - -	while (getline(&line, &n, from_fp) > 0) -		if (fputs(line, to_fp) == EOF) -			goto out_fclose_to; -	err = 0; -out_fclose_to: -	fclose(to_fp); -	free(line); -out_fclose_from: -	fclose(from_fp); -out: -	return err; -} - -int copyfile_offset(int ifd, loff_t off_in, int ofd, loff_t off_out, u64 size) -{ -	void *ptr; -	loff_t pgoff; - -	pgoff = off_in & ~(page_size - 1); -	off_in -= pgoff; - -	ptr = mmap(NULL, off_in + size, PROT_READ, MAP_PRIVATE, ifd, pgoff); -	if (ptr == MAP_FAILED) -		return -1; - -	while (size) { -		ssize_t ret = pwrite(ofd, ptr + off_in, size, off_out); -		if (ret < 0 && errno == EINTR) -			continue; -		if (ret <= 0) -			break; - -		size -= ret; -		off_in += ret; -		off_out += ret; -	} -	munmap(ptr, off_in + size); - -	return size ? -1 : 0; -} - -static int copyfile_mode_ns(const char *from, const char *to, mode_t mode, -			    struct nsinfo *nsi) -{ -	int fromfd, tofd; -	struct stat st; -	int err; -	char *tmp = NULL, *ptr = NULL; -	struct nscookie nsc; - -	nsinfo__mountns_enter(nsi, &nsc); -	err = stat(from, &st); -	nsinfo__mountns_exit(&nsc); -	if (err) -		goto out; -	err = -1; - -	/* extra 'x' at the end is to reserve space for '.' */ -	if (asprintf(&tmp, "%s.XXXXXXx", to) < 0) { -		tmp = NULL; -		goto out; -	} -	ptr = strrchr(tmp, '/'); -	if (!ptr) -		goto out; -	ptr = memmove(ptr + 1, ptr, strlen(ptr) - 1); -	*ptr = '.'; - -	tofd = mkstemp(tmp); -	if (tofd < 0) -		goto out; - -	if (fchmod(tofd, mode)) -		goto out_close_to; - -	if (st.st_size == 0) { /* /proc? do it slowly... */ -		err = slow_copyfile(from, tmp, nsi); -		goto out_close_to; -	} - -	nsinfo__mountns_enter(nsi, &nsc); -	fromfd = open(from, O_RDONLY); -	nsinfo__mountns_exit(&nsc); -	if (fromfd < 0) -		goto out_close_to; - -	err = copyfile_offset(fromfd, 0, tofd, 0, st.st_size); - -	close(fromfd); -out_close_to: -	close(tofd); -	if (!err) -		err = link(tmp, to); -	unlink(tmp); -out: -	free(tmp); -	return err; -} - -int copyfile_ns(const char *from, const char *to, struct nsinfo *nsi) -{ -	return copyfile_mode_ns(from, to, 0755, nsi); -} - -int copyfile_mode(const char *from, const char *to, mode_t mode) -{ -	return copyfile_mode_ns(from, to, mode, NULL); -} - -int copyfile(const char *from, const char *to) -{ -	return copyfile_mode(from, to, 0755); -} - -static ssize_t ion(bool is_read, int fd, void *buf, size_t n) -{ -	void *buf_start = buf; -	size_t left = n; - -	while (left) { -		/* buf must be treated as const if !is_read. */ -		ssize_t ret = is_read ? read(fd, buf, left) : -					write(fd, buf, left); - -		if (ret < 0 && errno == EINTR) -			continue; -		if (ret <= 0) -			return ret; - -		left -= ret; -		buf  += ret; -	} - -	BUG_ON((size_t)(buf - buf_start) != n); -	return n; -} - -/* - * Read exactly 'n' bytes or return an error. - */ -ssize_t readn(int fd, void *buf, size_t n) -{ -	return ion(true, fd, buf, n); -} - -/* - * Write exactly 'n' bytes or return an error. - */ -ssize_t writen(int fd, const void *buf, size_t n) -{ -	/* ion does not modify buf. */ -	return ion(false, fd, (void *)buf, n); -} -  size_t hex_width(u64 v)  {  	size_t n = 1; @@ -443,6 +249,13 @@ int perf_event_paranoid(void)  	return value;  } + +bool perf_event_paranoid_check(int max_level) +{ +	return perf_cap__capable(CAP_SYS_ADMIN) || +			perf_event_paranoid() <= max_level; +} +  static int  fetch_ubuntu_kernel_version(unsigned int *puint)  {  |