Commit a910e466 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf parse: Report initial event parsing error

Record the first event parsing error and report. Implementing feedback
from Jiri Olsa:

  https://lkml.org/lkml/2019/10/28/680



An example error is:

  $ tools/perf/perf stat -e c/c/
  WARNING: multiple event parsing errors
  event syntax error: 'c/c/'
                         \___ unknown term

  valid terms: event,filter_rem,filter_opc0,edge,filter_isoc,filter_tid,filter_loc,filter_nc,inv,umask,filter_opc1,tid_en,thresh,filter_all_op,filter_not_nm,filter_state,filter_nm,config,config1,config2,name,period,percore

Initial error:

  event syntax error: 'c/c/'
                      \___ Cannot find PMU `c'. Missing kernel support?
  Run 'perf list' for a list of valid events

   Usage: perf stat [<options>] [<command>]

      -e, --event <event>   event selector. use 'perf list' to list available events

Signed-off-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Allison Randal <allison@lohutok.net>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Anju T Sudhakar <anju@linux.vnet.ibm.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Link: http://lore.kernel.org/lkml/20191116074652.9960-1-irogers@google.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent cb402730
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -113,10 +113,10 @@ static int is_tracepoint_available(const char *str, struct evlist *evlist)
	struct parse_events_error err;
	int ret;

	err.str = NULL;
	bzero(&err, sizeof(err));
	ret = parse_events(evlist, str, &err);
	if (err.str)
		pr_err("%s : %s\n", str, err.str);
		parse_events_print_error(&err, "tracepoint");
	return ret;
}

+2 −0
Original line number Diff line number Diff line
@@ -1307,6 +1307,7 @@ static int add_default_attributes(void)
	if (stat_config.null_run)
		return 0;

	bzero(&errinfo, sizeof(errinfo));
	if (transaction_run) {
		/* Handle -T as -M transaction. Once platform specific metrics
		 * support has been added to the json files, all archictures
@@ -1364,6 +1365,7 @@ static int add_default_attributes(void)
			return -1;
		}
		if (err) {
			parse_events_print_error(&errinfo, smi_cost_attrs);
			fprintf(stderr, "Cannot set up SMI cost events\n");
			return -1;
		}
+12 −4
Original line number Diff line number Diff line
@@ -3016,11 +3016,18 @@ static bool evlist__add_vfs_getname(struct evlist *evlist)
{
	bool found = false;
	struct evsel *evsel, *tmp;
	struct parse_events_error err = { .idx = 0, };
	int ret = parse_events(evlist, "probe:vfs_getname*", &err);
	struct parse_events_error err;
	int ret;

	if (ret)
	bzero(&err, sizeof(err));
	ret = parse_events(evlist, "probe:vfs_getname*", &err);
	if (ret) {
		free(err.str);
		free(err.help);
		free(err.first_str);
		free(err.first_help);
		return false;
	}

	evlist__for_each_entry_safe(evlist, evsel, tmp) {
		if (!strstarts(perf_evsel__name(evsel), "probe:vfs_getname"))
@@ -4832,8 +4839,9 @@ int cmd_trace(int argc, const char **argv)
	 * wrong in more detail.
	 */
	if (trace.perfconfig_events != NULL) {
		struct parse_events_error parse_err = { .idx = 0, };
		struct parse_events_error parse_err;

		bzero(&parse_err, sizeof(parse_err));
		err = parse_events(trace.evlist, trace.perfconfig_events, &parse_err);
		if (err) {
			parse_events_print_error(&parse_err, trace.perfconfig_events);
+2 −1
Original line number Diff line number Diff line
@@ -1768,10 +1768,11 @@ static struct terms_test test__terms[] = {

static int test_event(struct evlist_test *e)
{
	struct parse_events_error err = { .idx = 0, };
	struct parse_events_error err;
	struct evlist *evlist;
	int ret;

	bzero(&err, sizeof(err));
	if (e->valid && !e->valid()) {
		pr_debug("... SKIP");
		return 0;
+1 −1
Original line number Diff line number Diff line
@@ -523,7 +523,7 @@ int metricgroup__parse_groups(const struct option *opt,
	if (ret)
		return ret;
	pr_debug("adding %s\n", extra_events.buf);
	memset(&parse_error, 0, sizeof(struct parse_events_error));
	bzero(&parse_error, sizeof(parse_error));
	ret = parse_events(perf_evlist, extra_events.buf, &parse_error);
	if (ret) {
		parse_events_print_error(&parse_error, extra_events.buf);
Loading