diff options
Diffstat (limited to 'tools/perf/builtin-stat.c')
| -rw-r--r-- | tools/perf/builtin-stat.c | 38 | 
1 files changed, 29 insertions, 9 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index cc9fa48d636f..b9ad32f21e57 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -667,6 +667,13 @@ static enum counter_recovery stat_handle_error(struct evsel *counter)  			evsel_list->core.threads->err_thread = -1;  			return COUNTER_RETRY;  		} +	} else if (counter->skippable) { +		if (verbose > 0) +			ui__warning("skipping event %s that kernel failed to open .\n", +				    evsel__name(counter)); +		counter->supported = false; +		counter->errored = true; +		return COUNTER_SKIP;  	}  	evsel__open_strerror(counter, &target, errno, msg, sizeof(msg)); @@ -1890,15 +1897,28 @@ static int add_default_attributes(void)  		 * caused by exposing latent bugs. This is fixed properly in:  		 * https://lore.kernel.org/lkml/bff481ba-e60a-763f-0aa0-3ee53302c480@linux.intel.com/  		 */ -		if (metricgroup__has_metric("TopdownL1") && !perf_pmu__has_hybrid() && -		    metricgroup__parse_groups(evsel_list, "TopdownL1", -					    /*metric_no_group=*/false, -					    /*metric_no_merge=*/false, -					    /*metric_no_threshold=*/true, -					    stat_config.user_requested_cpu_list, -					    stat_config.system_wide, -					    &stat_config.metric_events) < 0) -			return -1; +		if (metricgroup__has_metric("TopdownL1") && !perf_pmu__has_hybrid()) { +			struct evlist *metric_evlist = evlist__new(); +			struct evsel *metric_evsel; + +			if (!metric_evlist) +				return -1; + +			if (metricgroup__parse_groups(metric_evlist, "TopdownL1", +							/*metric_no_group=*/false, +							/*metric_no_merge=*/false, +							/*metric_no_threshold=*/true, +							stat_config.user_requested_cpu_list, +							stat_config.system_wide, +							&stat_config.metric_events) < 0) +				return -1; + +			evlist__for_each_entry(metric_evlist, metric_evsel) { +				metric_evsel->skippable = true; +			} +			evlist__splice_list_tail(evsel_list, &metric_evlist->core.entries); +			evlist__delete(metric_evlist); +		}  		/* Platform specific attrs */  		if (evlist__add_default_attrs(evsel_list, default_null_attrs) < 0)  | 
