diff options
Diffstat (limited to 'tools/perf/util')
| -rw-r--r-- | tools/perf/util/annotate.c | 26 | ||||
| -rw-r--r-- | tools/perf/util/annotate.h | 9 | ||||
| -rw-r--r-- | tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/cs-etm.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/cs-etm.h | 13 | ||||
| -rw-r--r-- | tools/perf/util/event.c | 4 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 24 | ||||
| -rw-r--r-- | tools/perf/util/evsel.h | 1 | ||||
| -rwxr-xr-x | tools/perf/util/generate-cmdlist.sh | 2 | ||||
| -rw-r--r-- | tools/perf/util/header.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/machine.c | 30 | ||||
| -rw-r--r-- | tools/perf/util/pmu.c | 28 | ||||
| -rw-r--r-- | tools/perf/util/symbol.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/syscalltbl.c | 6 | ||||
| -rw-r--r-- | tools/perf/util/trace-event-scripting.c | 4 | 
15 files changed, 96 insertions, 68 deletions
| diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index fbad8dfbb186..536ee148bff8 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -46,6 +46,7 @@  struct annotation_options annotation__default_options = {  	.use_offset     = true,  	.jump_arrows    = true, +	.offset_level	= ANNOTATION__OFFSET_JUMP_TARGETS,  };  const char 	*disassembler_style; @@ -2512,7 +2513,8 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati  		if (!notes->options->use_offset) {  			printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr);  		} else { -			if (al->jump_sources) { +			if (al->jump_sources && +			    notes->options->offset_level >= ANNOTATION__OFFSET_JUMP_TARGETS) {  				if (notes->options->show_nr_jumps) {  					int prev;  					printed = scnprintf(bf, sizeof(bf), "%*d ", @@ -2523,9 +2525,14 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati  					obj__printf(obj, bf);  					obj__set_color(obj, prev);  				} - +print_addr:  				printed = scnprintf(bf, sizeof(bf), "%*" PRIx64 ": ",  						    notes->widths.target, addr); +			} else if (ins__is_call(&disasm_line(al)->ins) && +				   notes->options->offset_level >= ANNOTATION__OFFSET_CALL) { +				goto print_addr; +			} else if (notes->options->offset_level == ANNOTATION__MAX_OFFSET_LEVEL) { +				goto print_addr;  			} else {  				printed = scnprintf(bf, sizeof(bf), "%-*s  ",  						    notes->widths.addr, " "); @@ -2642,10 +2649,11 @@ int __annotation__scnprintf_samples_period(struct annotation *notes,   */  static struct annotation_config {  	const char *name; -	bool *value; +	void *value;  } annotation__configs[] = {  	ANNOTATION__CFG(hide_src_code),  	ANNOTATION__CFG(jump_arrows), +	ANNOTATION__CFG(offset_level),  	ANNOTATION__CFG(show_linenr),  	ANNOTATION__CFG(show_nr_jumps),  	ANNOTATION__CFG(show_nr_samples), @@ -2677,8 +2685,16 @@ static int annotation__config(const char *var, const char *value,  	if (cfg == NULL)  		pr_debug("%s variable unknown, ignoring...", var); -	else -		*cfg->value = perf_config_bool(name, value); +	else if (strcmp(var, "annotate.offset_level") == 0) { +		perf_config_int(cfg->value, name, value); + +		if (*(int *)cfg->value > ANNOTATION__MAX_OFFSET_LEVEL) +			*(int *)cfg->value = ANNOTATION__MAX_OFFSET_LEVEL; +		else if (*(int *)cfg->value < ANNOTATION__MIN_OFFSET_LEVEL) +			*(int *)cfg->value = ANNOTATION__MIN_OFFSET_LEVEL; +	} else { +		*(bool *)cfg->value = perf_config_bool(name, value); +	}  	return 0;  } diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index db8d09bea07e..f28a9e43421d 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -70,8 +70,17 @@ struct annotation_options {  	     show_nr_jumps,  	     show_nr_samples,  	     show_total_period; +	u8   offset_level;  }; +enum { +	ANNOTATION__OFFSET_JUMP_TARGETS = 1, +	ANNOTATION__OFFSET_CALL, +	ANNOTATION__MAX_OFFSET_LEVEL, +}; + +#define ANNOTATION__MIN_OFFSET_LEVEL ANNOTATION__OFFSET_JUMP_TARGETS +  extern struct annotation_options annotation__default_options;  struct annotation; diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c index 640af88331b4..c8b98fa22997 100644 --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c @@ -1,6 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0  /* - * SPDX-License-Identifier: GPL-2.0 - *   * Copyright(C) 2015-2018 Linaro Limited.   *   * Author: Tor Jeremiassen <[email protected]> diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 1b0d422373be..40020b1ca54f 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -1,6 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0  /* - * SPDX-License-Identifier: GPL-2.0 - *   * Copyright(C) 2015-2018 Linaro Limited.   *   * Author: Tor Jeremiassen <[email protected]> diff --git a/tools/perf/util/cs-etm.h b/tools/perf/util/cs-etm.h index 5864d5dca616..37f8d48179ca 100644 --- a/tools/perf/util/cs-etm.h +++ b/tools/perf/util/cs-etm.h @@ -1,18 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Copyright(C) 2015 Linaro Limited. All rights reserved.   * Author: Mathieu Poirier <[email protected]> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published by - * the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program.  If not, see <http://www.gnu.org/licenses/>.   */  #ifndef INCLUDE__UTIL_PERF_CS_ETM_H__ diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index f0a6cbd033cc..98ff3a6a3d50 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -1421,7 +1421,9 @@ size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp)  size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp)  {  	bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT; -	const char *in_out = out ? "OUT" : "IN "; +	const char *in_out = !out ? "IN         " : +		!(event->header.misc & PERF_RECORD_MISC_SWITCH_OUT_PREEMPT) ? +				    "OUT        " : "OUT preempt";  	if (event->header.type == PERF_RECORD_SWITCH)  		return fprintf(fp, " %s\n", in_out); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 1ac8d9236efd..4cd2cf93f726 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -930,8 +930,11 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,  	 * than leader in case leader 'leads' the sampling.  	 */  	if ((leader != evsel) && leader->sample_read) { -		attr->sample_freq   = 0; -		attr->sample_period = 0; +		attr->freq           = 0; +		attr->sample_freq    = 0; +		attr->sample_period  = 0; +		attr->write_backward = 0; +		attr->sample_id_all  = 0;  	}  	if (opts->no_samples) @@ -1922,7 +1925,8 @@ try_fallback:  		goto fallback_missing_features;  	} else if (!perf_missing_features.group_read &&  		    evsel->attr.inherit && -		   (evsel->attr.read_format & PERF_FORMAT_GROUP)) { +		   (evsel->attr.read_format & PERF_FORMAT_GROUP) && +		   perf_evsel__is_group_leader(evsel)) {  		perf_missing_features.group_read = true;  		pr_debug2("switching off group read\n");  		goto fallback_missing_features; @@ -2754,8 +2758,14 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,  		   (paranoid = perf_event_paranoid()) > 1) {  		const char *name = perf_evsel__name(evsel);  		char *new_name; +		const char *sep = ":"; -		if (asprintf(&new_name, "%s%su", name, strchr(name, ':') ? "" : ":") < 0) +		/* Is there already the separator in the name. */ +		if (strchr(name, '/') || +		    strchr(name, ':')) +			sep = ""; + +		if (asprintf(&new_name, "%s%su", name, sep) < 0)  			return false;  		if (evsel->name) @@ -2870,8 +2880,7 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,  #if defined(__i386__) || defined(__x86_64__)  		if (evsel->attr.type == PERF_TYPE_HARDWARE)  			return scnprintf(msg, size, "%s", -	"No hardware sampling interrupt available.\n" -	"No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it."); +	"No hardware sampling interrupt available.\n");  #endif  		break;  	case EBUSY: @@ -2894,8 +2903,7 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,  	return scnprintf(msg, size,  	"The sys_perf_event_open() syscall returned with %d (%s) for event (%s).\n" -	"/bin/dmesg may provide additional information.\n" -	"No CONFIG_PERF_EVENTS=y kernel support configured?", +	"/bin/dmesg | grep -i perf may provide additional information.\n",  			 err, str_error_r(err, sbuf, sizeof(sbuf)),  			 perf_evsel__name(evsel));  } diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index d3ee3af618ef..92ec009a292d 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -115,6 +115,7 @@ struct perf_evsel {  	unsigned int		sample_size;  	int			id_pos;  	int			is_pos; +	bool			uniquified_name;  	bool			snapshot;  	bool 			supported;  	bool 			needs_swap; diff --git a/tools/perf/util/generate-cmdlist.sh b/tools/perf/util/generate-cmdlist.sh index ff17920a5ebc..c3cef36d4176 100755 --- a/tools/perf/util/generate-cmdlist.sh +++ b/tools/perf/util/generate-cmdlist.sh @@ -38,7 +38,7 @@ do  done  echo "#endif /* HAVE_LIBELF_SUPPORT */" -echo "#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE)" +echo "#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)"  sed -n -e 's/^perf-\([^ 	]*\)[ 	].* audit*/\1/p' command-list.txt |  sort |  while read cmd diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 121df1683c36..a8bff2178fbc 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1320,7 +1320,8 @@ static int build_mem_topology(struct memory_node *nodes, u64 size, u64 *cntp)  	dir = opendir(path);  	if (!dir) { -		pr_warning("failed: can't open node sysfs data\n"); +		pr_debug2("%s: could't read %s, does this arch have topology information?\n", +			  __func__, path);  		return -1;  	} diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 2eca8478e24f..32d50492505d 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1019,13 +1019,6 @@ int machine__load_vmlinux_path(struct machine *machine, enum map_type type)  	return ret;  } -static void map_groups__fixup_end(struct map_groups *mg) -{ -	int i; -	for (i = 0; i < MAP__NR_TYPES; ++i) -		__map_groups__fixup_end(mg, i); -} -  static char *get_kernel_version(const char *root_dir)  {  	char version[PATH_MAX]; @@ -1233,6 +1226,7 @@ int machine__create_kernel_maps(struct machine *machine)  {  	struct dso *kernel = machine__get_kernel(machine);  	const char *name = NULL; +	struct map *map;  	u64 addr = 0;  	int ret; @@ -1259,13 +1253,25 @@ int machine__create_kernel_maps(struct machine *machine)  			machine__destroy_kernel_maps(machine);  			return -1;  		} -		machine__set_kernel_mmap(machine, addr, 0); + +		/* we have a real start address now, so re-order the kmaps */ +		map = machine__kernel_map(machine); + +		map__get(map); +		map_groups__remove(&machine->kmaps, map); + +		/* assume it's the last in the kmaps */ +		machine__set_kernel_mmap(machine, addr, ~0ULL); + +		map_groups__insert(&machine->kmaps, map); +		map__put(map);  	} -	/* -	 * Now that we have all the maps created, just set the ->end of them: -	 */ -	map_groups__fixup_end(&machine->kmaps); +	/* update end address of the kernel map using adjacent module address */ +	map = map__next(machine__kernel_map(machine)); +	if (map) +		machine__set_kernel_mmap(machine, addr, map->start); +  	return 0;  } diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 064bdcb7bd78..d2fb597c9a8c 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -539,9 +539,10 @@ static bool pmu_is_uncore(const char *name)  /*   *  PMU CORE devices have different name other than cpu in sysfs on some - *  platforms. looking for possible sysfs files to identify as core device. + *  platforms. + *  Looking for possible sysfs files to identify the arm core device.   */ -static int is_pmu_core(const char *name) +static int is_arm_pmu_core(const char *name)  {  	struct stat st;  	char path[PATH_MAX]; @@ -550,18 +551,18 @@ static int is_pmu_core(const char *name)  	if (!sysfs)  		return 0; -	/* Look for cpu sysfs (x86 and others) */ -	scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu", sysfs); -	if ((stat(path, &st) == 0) && -			(strncmp(name, "cpu", strlen("cpu")) == 0)) -		return 1; -  	/* Look for cpu sysfs (specific to arm) */  	scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/cpus",  				sysfs, name);  	if (stat(path, &st) == 0)  		return 1; +	/* Look for cpu sysfs (specific to s390) */ +	scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s", +		  sysfs, name); +	if (stat(path, &st) == 0 && !strncmp(name, "cpum_", 5)) +		return 1; +  	return 0;  } @@ -580,7 +581,7 @@ char * __weak get_cpuid_str(struct perf_pmu *pmu __maybe_unused)   * cpuid string generated on this platform.   * Otherwise return non-zero.   */ -int __weak strcmp_cpuid_str(const char *mapcpuid, const char *cpuid) +int strcmp_cpuid_str(const char *mapcpuid, const char *cpuid)  {  	regex_t re;  	regmatch_t pmatch[1]; @@ -662,6 +663,7 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)  	struct pmu_events_map *map;  	struct pmu_event *pe;  	const char *name = pmu->name; +	const char *pname;  	map = perf_pmu__find_map(pmu);  	if (!map) @@ -680,11 +682,9 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)  			break;  		} -		if (!is_pmu_core(name)) { -			/* check for uncore devices */ -			if (pe->pmu == NULL) -				continue; -			if (strncmp(pe->pmu, name, strlen(pe->pmu))) +		if (!is_arm_pmu_core(name)) { +			pname = pe->pmu ? pe->pmu : "cpu"; +			if (strncmp(pname, name, strlen(pname)))  				continue;  		} diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 62b2dd2253eb..1466814ebada 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -2091,16 +2091,14 @@ static bool symbol__read_kptr_restrict(void)  int symbol__annotation_init(void)  { +	if (symbol_conf.init_annotation) +		return 0; +  	if (symbol_conf.initialized) {  		pr_err("Annotation needs to be init before symbol__init()\n");  		return -1;  	} -	if (symbol_conf.init_annotation) { -		pr_warning("Annotation being initialized multiple times\n"); -		return 0; -	} -  	symbol_conf.priv_size += sizeof(struct annotation);  	symbol_conf.init_annotation = true;  	return 0; diff --git a/tools/perf/util/syscalltbl.c b/tools/perf/util/syscalltbl.c index 895122d638dd..0ee7f568d60c 100644 --- a/tools/perf/util/syscalltbl.c +++ b/tools/perf/util/syscalltbl.c @@ -17,7 +17,7 @@  #include <stdlib.h>  #include <linux/compiler.h> -#ifdef HAVE_SYSCALL_TABLE +#ifdef HAVE_SYSCALL_TABLE_SUPPORT  #include <string.h>  #include "string2.h"  #include "util.h" @@ -139,7 +139,7 @@ int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_g  	return syscalltbl__strglobmatch_next(tbl, syscall_glob, idx);  } -#else /* HAVE_SYSCALL_TABLE */ +#else /* HAVE_SYSCALL_TABLE_SUPPORT */  #include <libaudit.h> @@ -176,4 +176,4 @@ int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_g  {  	return syscalltbl__strglobmatch_next(tbl, syscall_glob, idx);  } -#endif /* HAVE_SYSCALL_TABLE */ +#endif /* HAVE_SYSCALL_TABLE_SUPPORT */ diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c index 0ac9077f62a2..b1e5c3a2b8e3 100644 --- a/tools/perf/util/trace-event-scripting.c +++ b/tools/perf/util/trace-event-scripting.c @@ -98,7 +98,7 @@ static void register_python_scripting(struct scripting_ops *scripting_ops)  	}  } -#ifdef NO_LIBPYTHON +#ifndef HAVE_LIBPYTHON_SUPPORT  void setup_python_scripting(void)  {  	register_python_scripting(&python_scripting_unsupported_ops); @@ -161,7 +161,7 @@ static void register_perl_scripting(struct scripting_ops *scripting_ops)  	}  } -#ifdef NO_LIBPERL +#ifndef HAVE_LIBPERL_SUPPORT  void setup_perl_scripting(void)  {  	register_perl_scripting(&perl_scripting_unsupported_ops); |