On 30/06/15 16:23, Adrian Hunter wrote: > On 30/06/15 13:56, Ingo Molnar wrote: >> >> * Adrian Hunter <adrian.hun...@intel.com> wrote: >> >>>> Yeah, so I did a 'newbie test': >>>> >>>> I pulled the tree and saw that it has a >>>> tools/perf/Documentation/intel-bts.txt >>>> file and started reading it. >>>> >>>> Based on its text: >>>> >>>> The Intel BTS kernel driver creates a new PMU for Intel BTS. The perf >>>> record >>>> option is: >>>> >>>> -e intel_bts// >>>> >>>> Currently Intel BTS is limited to per-thread tracing so the --per-thread >>>> option >>>> is also needed. >>>> >>>> I tried the following command which failed: >>>> >>>> triton:~/tip> perf record -e intel_bts// --per-thread sleep 1 >>>> invalid or unsupported event: 'intel_bts//' >>>> Run 'perf list' for a list of valid events >>>> >>>> usage: perf record [<options>] [<command>] >>>> or: perf record [<options>] -- <command> [<options>] >>>> >>>> -e, --event <event> event selector. use 'perf list' to list >>>> available events >>>> >>>> That's a really ... unhelpful message. If I typoed something I want to >>>> know that. >>>> If the kernel does not support something, I want to know about that too. >>>> Tooling >>>> telling me: "maybe you typoed something, maybe it's not supported, I >>>> really don't >>>> care" is not very productive. >>> >>> That is not entirely true. The message says "Run 'perf list' for a list of >>> valid >>> events" which will tell you if the event is valid. So you can tell the >>> difference between a typo and unsupported event. >> >> Yeah, but my point is: why doesn't the tool do this disambiguation for me? >> Tools >> are hard enough to use as-is already, no need to put artificial roadblocks >> in the >> path of first time users. > > That applies to all events e.g. > > # perf record -e sched:sched_swotch sleep 1 > invalid or unsupported event: 'sched:sched_swotch' > > Run 'perf list' for a list of valid events > > > > usage: perf record [<options>] [<command>] > > or: perf record [<options>] -- <command> [<options>] > > > > -e, --event <event> event selector. use 'perf list' to list available > events > > So it is a general problem. > >> >>>> So this was with a distro kernel, and in the hope that I'm missing some >>>> magic >>>> new kernel feature, I tried it the latest -tip kernel, but it still gives >>>> me >>>> the same failure. >>>> >>>> So the test newbie user got stuck after wasting some time. >>>> >>>> Me as a kernel developer could probably figure it out, but that's not the >>>> point: if newbies cannot discover and use our new features then it's as if >>>> they didn't exist, and I'm not pulling non-existent features! ;-) >>>> >>>> Could we please improve all this? >>> >>> 'perf list' shows the event wasn't supported, so I am not sure what more >>> the >>> "newbie" could expect. Do you have any suggestions? >> >> So I think a first time user would expect a clear message from the computer: >> what >> was wrong with what he wrote and what should he do to fix it. >> >> Btw., here's the 'perf list' output from a system running the latest -tip >> kernel: >> >> vega:~> uname -a >> Linux vega 4.1.0-02935-g390ad45394a3-dirty #567 SMP PREEMPT Mon Jun 29 >> 11:44:48 CEST 2015 x86_64 x86_64 x86_64 GNU/Linux >> vega:~> perf list | grep -i bts >> vega:~> >> >> so is there any kernel feature dependency? It's unclear. If yes, it should >> be >> mentioned in the document, and in the tooling output as well. If not then we >> have >> a bug somewhere. > > I am not aware of any dependencies, apart from perf events itself. > > Are you sure you compiled perf tools with the new patches ;-) > And it is an Intel CPU? > >> >> I.e. you need to smooth the first time user's rocky path to first use as >> much as >> technically possible. Every single such helping step will literally double >> the >> number of users who will be able to successfully make use of the new feature. >> >> As a positive example take a look at the newbie's road to 'perf trace': >> >> vega:~> trace >> Error: No permissions to read >> /sys/kernel/debug/tracing/events/raw_syscalls/sys_(enter|exit) >> Hint: Try 'sudo mount -o remount,mode=755 /sys/kernel/debug' >> >> Aha, useful message, I need to run this as root: >> >> # trace >> >> 0.000 ( 0.000 ms): sleep/28926 ... [continued]: nanosleep()) = 0 >> 0.051 ( 0.007 ms): sleep/28926 close(fd: 1 >> ) = 0 >> 0.063 ( 0.005 ms): sleep/28926 close(fd: 2 >> ) = 0 >> 0.072 ( 0.000 ms): sleep/28926 exit_group( >> >> >> Ok? > > Could do something like the following: > > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c > index 09f8d2357108..5ab8fee89361 100644 > --- a/tools/perf/util/parse-events.c > +++ b/tools/perf/util/parse-events.c > @@ -666,8 +666,13 @@ int parse_events_add_pmu(struct parse_events_evlist > *data, > struct perf_evsel *evsel; > > pmu = perf_pmu__find(name); > - if (!pmu) > + if (!pmu) { > + if ((!strcmp(name, "intel_bts") || !strcmp(name, "intel_pt")) && > + data->error) > + if (asprintf(&data->error->str, "%s is not supported by > the running kernel", name) < 0) > + return -ENOMEM; > return -EINVAL; > + } > > if (pmu->default_config) { > memcpy(&attr, pmu->default_config, > > Could then add checks for Intel hardware and bts CPU feature flag.
How is this? From: Adrian Hunter <adrian.hun...@intel.com> Date: Wed, 1 Jul 2015 11:14:50 +0300 Subject: [PATCH] perf tools: Add error messages for missing intel_bts and intel_pt support Add error messages to assist users in determining why there is no intel_bts or intel_pt support. Signed-off-by: Adrian Hunter <adrian.hun...@intel.com> --- tools/perf/arch/x86/util/header.c | 15 ++++++++++++++ tools/perf/util/header.h | 3 ++- tools/perf/util/parse-events.c | 41 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/tools/perf/arch/x86/util/header.c b/tools/perf/arch/x86/util/header.c index 146d12a1cec0..afc5bdfd2d15 100644 --- a/tools/perf/arch/x86/util/header.c +++ b/tools/perf/arch/x86/util/header.c @@ -57,3 +57,18 @@ get_cpuid(char *buffer, size_t sz) } return -1; } + +int have_intel_cpu(void) +{ + char buffer[64]; + int ret; + + ret = get_cpuid(buffer, sizeof(buffer)); + if (ret) + return -1; + + if (!strncmp(buffer, "GenuineIntel,", 13)) + return 1; + + return 0; +} diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index d4d57962c591..f6eab49d13d1 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -153,8 +153,9 @@ bool is_perf_magic(u64 magic); int write_padded(int fd, const void *bf, size_t count, size_t count_aligned); /* - * arch specific callback + * arch specific callbacks */ int get_cpuid(char *buffer, size_t sz); +int have_intel_cpu(void); #endif /* __PERF_HEADER_H */ diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 09f8d2357108..23fb777b40fa 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -656,6 +656,45 @@ static char *pmu_event_name(struct list_head *head_terms) return NULL; } +int __weak have_intel_cpu(void) +{ + return 0; +} + +static int pmu_not_found_error(char *name, struct parse_events_error *err) +{ + int ret; + + if (!err) + goto out; + + if (!strcmp(name, "intel_bts")) { + ret = have_intel_cpu(); + if (ret < 0) + goto out; + if (!ret) { + err->str = strdup("intel_bts requires an Intel CPU"); + goto out; + } + err->str = strdup("kernel does not support intel_bts (requires 64-bit v4.1 kernel or later and BTS hardware support)"); + goto out; + } + + if (!strcmp(name, "intel_pt")) { + ret = have_intel_cpu(); + if (ret < 0) + goto out; + if (!ret) { + err->str = strdup("intel_pt requires an Intel CPU (Core 5th generation or later)"); + goto out; + } + err->str = strdup("kernel does not support intel_pt (requires v4.1 kernel or later and 5th generation Intel Core processor or later)"); + goto out; + } +out: + return -EINVAL; +} + int parse_events_add_pmu(struct parse_events_evlist *data, struct list_head *list, char *name, struct list_head *head_config) @@ -667,7 +706,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data, pmu = perf_pmu__find(name); if (!pmu) - return -EINVAL; + return pmu_not_found_error(name, data->error); if (pmu->default_config) { memcpy(&attr, pmu->default_config, -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/