diff options
Diffstat (limited to 'tools/perf/util/evsel.c')
| -rw-r--r-- | tools/perf/util/evsel.c | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 22d3267ce294..2a1729e7aee4 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2847,9 +2847,23 @@ static bool find_process(const char *name)  	return ret ? false : true;  } +static bool is_amd(const char *arch, const char *cpuid) +{ +	return arch && !strcmp("x86", arch) && cpuid && strstarts(cpuid, "AuthenticAMD"); +} + +static bool is_amd_ibs(struct evsel *evsel) +{ +	return evsel->core.attr.precise_ip +	    || (evsel->pmu_name && !strncmp(evsel->pmu_name, "ibs", 3)); +} +  int evsel__open_strerror(struct evsel *evsel, struct target *target,  			 int err, char *msg, size_t size)  { +	struct perf_env *env = evsel__env(evsel); +	const char *arch = perf_env__arch(env); +	const char *cpuid = perf_env__cpuid(env);  	char sbuf[STRERR_BUFSIZE];  	int printed = 0, enforced = 0; @@ -2909,6 +2923,10 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target,  	 "No such device - did you specify an out-of-range profile CPU?");  		break;  	case EOPNOTSUPP: +		if (evsel->core.attr.sample_type & PERF_SAMPLE_BRANCH_STACK) +			return scnprintf(msg, size, +	"%s: PMU Hardware or event type doesn't support branch stack sampling.", +					 evsel__name(evsel));  		if (evsel->core.attr.aux_output)  			return scnprintf(msg, size,  	"%s: PMU Hardware doesn't support 'aux_output' feature", @@ -2949,6 +2967,17 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target,  			return scnprintf(msg, size,  	"Invalid event (%s) in per-thread mode, enable system wide with '-a'.",  					evsel__name(evsel)); +		if (is_amd(arch, cpuid)) { +			if (is_amd_ibs(evsel)) { +				if (evsel->core.attr.exclude_kernel) +					return scnprintf(msg, size, +	"AMD IBS can't exclude kernel events.  Try running at a higher privilege level."); +				if (!evsel->core.system_wide) +					return scnprintf(msg, size, +	"AMD IBS may only be available in system-wide/per-cpu mode.  Try using -a, or -C and workload affinity"); +			} +		} +  		break;  	case ENODATA:  		return scnprintf(msg, size, "Cannot collect data source with the load latency event alone. " @@ -2965,7 +2994,7 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target,  struct perf_env *evsel__env(struct evsel *evsel)  { -	if (evsel && evsel->evlist) +	if (evsel && evsel->evlist && evsel->evlist->env)  		return evsel->evlist->env;  	return &perf_env;  }  | 
