Commit a2a6604e authored by Dominique Martinet's avatar Dominique Martinet Committed by Arnaldo Carvalho de Melo
Browse files

perf parse-events: Add new 'fake_tp' parameter for tests



The next commit will allow tracepoints starting with digits, but most
systems do not have any available by default so tests should skip the
actual "check if it exists in /sys/kernel/debug/tracing" step.

In order to do that, add a new boolean flag specifying if we should
actually "format" the probe or not.

Originally-by: default avatarJiri Olsa <jolsa@kernel.org>
Reviewed-by: default avatarIan Rogers <irogers@google.com>
Signed-off-by: default avatarDominique Martinet <asmadeus@codewreck.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240510-perf_digit-v4-2-db1553f3233b@codewreck.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 11a42964
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2493,7 +2493,8 @@ static int test_event(const struct evlist_test *e)
		return TEST_FAIL;
	}
	parse_events_error__init(&err);
	ret = parse_events(evlist, e->name, &err);
	ret = __parse_events(evlist, e->name, /*pmu_filter=*/NULL, &err, /*fake_pmu=*/NULL,
			     /*warn_if_reordered=*/true, /*fake_tp=*/true);
	if (ret) {
		pr_debug("failed to parse event '%s', err %d\n", e->name, ret);
		parse_events_error__print(&err, e->name);
@@ -2521,7 +2522,8 @@ static int test_event_fake_pmu(const char *str)

	parse_events_error__init(&err);
	ret = __parse_events(evlist, str, /*pmu_filter=*/NULL, &err,
			     &perf_pmu__fake, /*warn_if_reordered=*/true);
			     &perf_pmu__fake, /*warn_if_reordered=*/true,
			     /*fake_tp=*/true);
	if (ret) {
		pr_debug("failed to parse event '%s', err %d\n",
			 str, ret);
+1 −1
Original line number Diff line number Diff line
@@ -842,7 +842,7 @@ static int check_parse_id(const char *id, struct parse_events_error *error,
		*cur = '/';

	ret = __parse_events(evlist, dup, /*pmu_filter=*/NULL, error, fake_pmu,
			     /*warn_if_reordered=*/true);
			     /*warn_if_reordered=*/true, /*fake_tp=*/false);
	free(dup);

	evlist__delete(evlist);
+2 −1
Original line number Diff line number Diff line
@@ -298,7 +298,8 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
#ifdef HAVE_LIBTRACEEVENT
struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
{
	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
	struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0,
					       /*format=*/true);

	if (IS_ERR(evsel))
		return evsel;
+13 −7
Original line number Diff line number Diff line
@@ -452,7 +452,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 * Returns pointer with encoded error via <linux/err.h> interface.
 */
#ifdef HAVE_LIBTRACEEVENT
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx, bool format)
{
	struct evsel *evsel = zalloc(perf_evsel__object.size);
	int err = -ENOMEM;
@@ -469,14 +469,20 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
		if (asprintf(&evsel->name, "%s:%s", sys, name) < 0)
			goto out_free;

		event_attr_init(&attr);

		if (format) {
			evsel->tp_format = trace_event__tp_format(sys, name);
			if (IS_ERR(evsel->tp_format)) {
				err = PTR_ERR(evsel->tp_format);
				goto out_free;
			}

		event_attr_init(&attr);
			attr.config = evsel->tp_format->id;
		} else {
			attr.config = (__u64) -1;
		}


		attr.sample_period = 1;
		evsel__init(evsel, &attr, idx);
	}
+2 −2
Original line number Diff line number Diff line
@@ -234,14 +234,14 @@ void free_config_terms(struct list_head *config_terms);


#ifdef HAVE_LIBTRACEEVENT
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx, bool format);

/*
 * Returns pointer with encoded error via <linux/err.h> interface.
 */
static inline struct evsel *evsel__newtp(const char *sys, const char *name)
{
	return evsel__newtp_idx(sys, name, 0);
	return evsel__newtp_idx(sys, name, 0, true);
}
#endif

Loading