diff options
Diffstat (limited to 'tools/perf/util/stat-display.c')
| -rw-r--r-- | tools/perf/util/stat-display.c | 45 | 
1 files changed, 33 insertions, 12 deletions
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c index bc31fccc0057..9e757d18d713 100644 --- a/tools/perf/util/stat-display.c +++ b/tools/perf/util/stat-display.c @@ -16,6 +16,7 @@  #include <linux/ctype.h>  #include "cgroup.h"  #include <api/fs/fs.h> +#include "util.h"  #define CNTR_NOT_SUPPORTED	"<not supported>"  #define CNTR_NOT_COUNTED	"<not counted>" @@ -110,15 +111,15 @@ static void aggr_printout(struct perf_stat_config *config,  			config->csv_sep);  			break;  	case AGGR_NONE: -		if (evsel->percore) { +		if (evsel->percore && !config->percore_show_thread) {  			fprintf(config->output, "S%d-D%d-C%*d%s",  				cpu_map__id_to_socket(id),  				cpu_map__id_to_die(id), -				config->csv_output ? 0 : -5, +				config->csv_output ? 0 : -3,  				cpu_map__id_to_cpu(id), config->csv_sep);  		} else { -			fprintf(config->output, "CPU%*d%s ", -				config->csv_output ? 0 : -5, +			fprintf(config->output, "CPU%*d%s", +				config->csv_output ? 0 : -7,  				evsel__cpus(evsel)->map[id],  				config->csv_sep);  		} @@ -628,7 +629,7 @@ static void aggr_cb(struct perf_stat_config *config,  static void print_counter_aggrdata(struct perf_stat_config *config,  				   struct evsel *counter, int s,  				   char *prefix, bool metric_only, -				   bool *first) +				   bool *first, int cpu)  {  	struct aggr_data ad;  	FILE *output = config->output; @@ -654,7 +655,7 @@ static void print_counter_aggrdata(struct perf_stat_config *config,  		fprintf(output, "%s", prefix);  	uval = val * counter->scale; -	printout(config, id, nr, counter, uval, prefix, +	printout(config, cpu != -1 ? cpu : id, nr, counter, uval, prefix,  		 run, ena, 1.0, &rt_stat);  	if (!metric_only)  		fputc('\n', output); @@ -687,7 +688,7 @@ static void print_aggr(struct perf_stat_config *config,  		evlist__for_each_entry(evlist, counter) {  			print_counter_aggrdata(config, counter, s,  					       prefix, metric_only, -					       &first); +					       &first, -1);  		}  		if (metric_only)  			fputc('\n', output); @@ -1097,7 +1098,6 @@ static void print_footer(struct perf_stat_config *config)  {  	double avg = avg_stats(config->walltime_nsecs_stats) / NSEC_PER_SEC;  	FILE *output = config->output; -	int n;  	if (!config->null_run)  		fprintf(output, "\n"); @@ -1131,9 +1131,7 @@ static void print_footer(struct perf_stat_config *config)  	}  	fprintf(output, "\n\n"); -	if (config->print_free_counters_hint && -	    sysctl__read_int("kernel/nmi_watchdog", &n) >= 0 && -	    n > 0) +	if (config->print_free_counters_hint && sysctl__nmi_watchdog_enabled())  		fprintf(output,  "Some events weren't counted. Try disabling the NMI watchdog:\n"  "	echo 0 > /proc/sys/kernel/nmi_watchdog\n" @@ -1146,6 +1144,26 @@ static void print_footer(struct perf_stat_config *config)  			"the same PMU. Try reorganizing the group.\n");  } +static void print_percore_thread(struct perf_stat_config *config, +				 struct evsel *counter, char *prefix) +{ +	int s, s2, id; +	bool first = true; + +	for (int i = 0; i < perf_evsel__nr_cpus(counter); i++) { +		s2 = config->aggr_get_id(config, evsel__cpus(counter), i); +		for (s = 0; s < config->aggr_map->nr; s++) { +			id = config->aggr_map->map[s]; +			if (s2 == id) +				break; +		} + +		print_counter_aggrdata(config, counter, s, +				       prefix, false, +				       &first, i); +	} +} +  static void print_percore(struct perf_stat_config *config,  			  struct evsel *counter, char *prefix)  { @@ -1157,13 +1175,16 @@ static void print_percore(struct perf_stat_config *config,  	if (!(config->aggr_map || config->aggr_get_id))  		return; +	if (config->percore_show_thread) +		return print_percore_thread(config, counter, prefix); +  	for (s = 0; s < config->aggr_map->nr; s++) {  		if (prefix && metric_only)  			fprintf(output, "%s", prefix);  		print_counter_aggrdata(config, counter, s,  				       prefix, metric_only, -				       &first); +				       &first, -1);  	}  	if (metric_only)  |