Skip to content

Commit a2a6604

Browse files
martinetdacmel
authored andcommitted
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: Jiri Olsa <[email protected]> Reviewed-by: Ian Rogers <[email protected]> Signed-off-by: Dominique Martinet <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 11a4296 commit a2a6604

File tree

8 files changed

+34
-19
lines changed

8 files changed

+34
-19
lines changed

tools/perf/tests/parse-events.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,7 +2493,8 @@ static int test_event(const struct evlist_test *e)
24932493
return TEST_FAIL;
24942494
}
24952495
parse_events_error__init(&err);
2496-
ret = parse_events(evlist, e->name, &err);
2496+
ret = __parse_events(evlist, e->name, /*pmu_filter=*/NULL, &err, /*fake_pmu=*/NULL,
2497+
/*warn_if_reordered=*/true, /*fake_tp=*/true);
24972498
if (ret) {
24982499
pr_debug("failed to parse event '%s', err %d\n", e->name, ret);
24992500
parse_events_error__print(&err, e->name);
@@ -2521,7 +2522,8 @@ static int test_event_fake_pmu(const char *str)
25212522

25222523
parse_events_error__init(&err);
25232524
ret = __parse_events(evlist, str, /*pmu_filter=*/NULL, &err,
2524-
&perf_pmu__fake, /*warn_if_reordered=*/true);
2525+
&perf_pmu__fake, /*warn_if_reordered=*/true,
2526+
/*fake_tp=*/true);
25252527
if (ret) {
25262528
pr_debug("failed to parse event '%s', err %d\n",
25272529
str, ret);

tools/perf/tests/pmu-events.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ static int check_parse_id(const char *id, struct parse_events_error *error,
842842
*cur = '/';
843843

844844
ret = __parse_events(evlist, dup, /*pmu_filter=*/NULL, error, fake_pmu,
845-
/*warn_if_reordered=*/true);
845+
/*warn_if_reordered=*/true, /*fake_tp=*/false);
846846
free(dup);
847847

848848
evlist__delete(evlist);

tools/perf/util/evlist.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,8 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
298298
#ifdef HAVE_LIBTRACEEVENT
299299
struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
300300
{
301-
struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
301+
struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0,
302+
/*format=*/true);
302303

303304
if (IS_ERR(evsel))
304305
return evsel;

tools/perf/util/evsel.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ struct evsel *evsel__clone(struct evsel *orig)
452452
* Returns pointer with encoded error via <linux/err.h> interface.
453453
*/
454454
#ifdef HAVE_LIBTRACEEVENT
455-
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
455+
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx, bool format)
456456
{
457457
struct evsel *evsel = zalloc(perf_evsel__object.size);
458458
int err = -ENOMEM;
@@ -469,14 +469,20 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
469469
if (asprintf(&evsel->name, "%s:%s", sys, name) < 0)
470470
goto out_free;
471471

472-
evsel->tp_format = trace_event__tp_format(sys, name);
473-
if (IS_ERR(evsel->tp_format)) {
474-
err = PTR_ERR(evsel->tp_format);
475-
goto out_free;
472+
event_attr_init(&attr);
473+
474+
if (format) {
475+
evsel->tp_format = trace_event__tp_format(sys, name);
476+
if (IS_ERR(evsel->tp_format)) {
477+
err = PTR_ERR(evsel->tp_format);
478+
goto out_free;
479+
}
480+
attr.config = evsel->tp_format->id;
481+
} else {
482+
attr.config = (__u64) -1;
476483
}
477484

478-
event_attr_init(&attr);
479-
attr.config = evsel->tp_format->id;
485+
480486
attr.sample_period = 1;
481487
evsel__init(evsel, &attr, idx);
482488
}

tools/perf/util/evsel.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,14 @@ void free_config_terms(struct list_head *config_terms);
234234

235235

236236
#ifdef HAVE_LIBTRACEEVENT
237-
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
237+
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx, bool format);
238238

239239
/*
240240
* Returns pointer with encoded error via <linux/err.h> interface.
241241
*/
242242
static inline struct evsel *evsel__newtp(const char *sys, const char *name)
243243
{
244-
return evsel__newtp_idx(sys, name, 0);
244+
return evsel__newtp_idx(sys, name, 0, true);
245245
}
246246
#endif
247247

tools/perf/util/metricgroup.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,8 @@ static int parse_ids(bool metric_no_merge, struct perf_pmu *fake_pmu,
15021502
pr_debug("Parsing metric events '%s'\n", events.buf);
15031503
parse_events_error__init(&parse_error);
15041504
ret = __parse_events(parsed_evlist, events.buf, /*pmu_filter=*/NULL,
1505-
&parse_error, fake_pmu, /*warn_if_reordered=*/false);
1505+
&parse_error, fake_pmu, /*warn_if_reordered=*/false,
1506+
/*fake_tp=*/false);
15061507
if (ret) {
15071508
parse_events_error__print(&parse_error, events.buf);
15081509
goto err_out;

tools/perf/util/parse-events.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,8 @@ static int add_tracepoint(struct parse_events_state *parse_state,
550550
struct parse_events_terms *head_config, void *loc_)
551551
{
552552
YYLTYPE *loc = loc_;
553-
struct evsel *evsel = evsel__newtp_idx(sys_name, evt_name, parse_state->idx++);
553+
struct evsel *evsel = evsel__newtp_idx(sys_name, evt_name, parse_state->idx++,
554+
!parse_state->fake_tp);
554555

555556
if (IS_ERR(evsel)) {
556557
tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name, loc->first_column);
@@ -2135,14 +2136,15 @@ static int parse_events__sort_events_and_fix_groups(struct list_head *list)
21352136

21362137
int __parse_events(struct evlist *evlist, const char *str, const char *pmu_filter,
21372138
struct parse_events_error *err, struct perf_pmu *fake_pmu,
2138-
bool warn_if_reordered)
2139+
bool warn_if_reordered, bool fake_tp)
21392140
{
21402141
struct parse_events_state parse_state = {
21412142
.list = LIST_HEAD_INIT(parse_state.list),
21422143
.idx = evlist->core.nr_entries,
21432144
.error = err,
21442145
.stoken = PE_START_EVENTS,
21452146
.fake_pmu = fake_pmu,
2147+
.fake_tp = fake_tp,
21462148
.pmu_filter = pmu_filter,
21472149
.match_legacy_cache_terms = true,
21482150
};
@@ -2352,7 +2354,8 @@ int parse_events_option(const struct option *opt, const char *str,
23522354

23532355
parse_events_error__init(&err);
23542356
ret = __parse_events(*args->evlistp, str, args->pmu_filter, &err,
2355-
/*fake_pmu=*/NULL, /*warn_if_reordered=*/true);
2357+
/*fake_pmu=*/NULL, /*warn_if_reordered=*/true,
2358+
/*fake_tp=*/false);
23562359

23572360
if (ret) {
23582361
parse_events_error__print(&err, str);

tools/perf/util/parse-events.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ int parse_events_option_new_evlist(const struct option *opt, const char *str, in
3232
__attribute__((nonnull(1, 2, 4)))
3333
int __parse_events(struct evlist *evlist, const char *str, const char *pmu_filter,
3434
struct parse_events_error *error, struct perf_pmu *fake_pmu,
35-
bool warn_if_reordered);
35+
bool warn_if_reordered, bool fake_tp);
3636

3737
__attribute__((nonnull(1, 2, 3)))
3838
static inline int parse_events(struct evlist *evlist, const char *str,
3939
struct parse_events_error *err)
4040
{
4141
return __parse_events(evlist, str, /*pmu_filter=*/NULL, err, /*fake_pmu=*/NULL,
42-
/*warn_if_reordered=*/true);
42+
/*warn_if_reordered=*/true, /*fake_tp=*/false);
4343
}
4444

4545
int parse_event(struct evlist *evlist, const char *str);
@@ -152,6 +152,8 @@ struct parse_events_state {
152152
int stoken;
153153
/* Special fake PMU marker for testing. */
154154
struct perf_pmu *fake_pmu;
155+
/* Skip actual tracepoint processing for testing. */
156+
bool fake_tp;
155157
/* If non-null, when wildcard matching only match the given PMU. */
156158
const char *pmu_filter;
157159
/* Should PE_LEGACY_NAME tokens be generated for config terms? */

0 commit comments

Comments
 (0)