Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Do not pass NULL to parse_events()

Many cases do not use the extra error information provided by
parse_events and instead pass NULL as the struct parse_events_error
pointer. Add a wrapper for those cases so that the pointer is never
NULL.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20220809080702.6921-4-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Adrian Hunter and committed by
Arnaldo Carvalho de Melo
806731a9 1da1d607

+45 -35
+1 -1
tools/perf/arch/arm/util/cs-etm.c
··· 438 438 if (opts->full_auxtrace) { 439 439 struct evsel *tracking_evsel; 440 440 441 - err = parse_events(evlist, "dummy:u", NULL); 441 + err = parse_event(evlist, "dummy:u"); 442 442 if (err) 443 443 goto out; 444 444
+1 -1
tools/perf/arch/arm64/util/arm-spe.c
··· 257 257 evsel__set_sample_bit(arm_spe_evsel, PHYS_ADDR); 258 258 259 259 /* Add dummy event to keep tracking */ 260 - err = parse_events(evlist, "dummy:u", NULL); 260 + err = parse_event(evlist, "dummy:u"); 261 261 if (err) 262 262 return err; 263 263
+1 -1
tools/perf/arch/x86/tests/intel-cqm.c
··· 56 56 return TEST_FAIL; 57 57 } 58 58 59 - ret = parse_events(evlist, "intel_cqm/llc_occupancy/", NULL); 59 + ret = parse_event(evlist, "intel_cqm/llc_occupancy/"); 60 60 if (ret) { 61 61 pr_debug("parse_events failed, is \"intel_cqm/llc_occupancy/\" available?\n"); 62 62 err = TEST_SKIP;
+1 -1
tools/perf/arch/x86/util/intel-bts.c
··· 233 233 struct evsel *tracking_evsel; 234 234 int err; 235 235 236 - err = parse_events(evlist, "dummy:u", NULL); 236 + err = parse_event(evlist, "dummy:u"); 237 237 if (err) 238 238 return err; 239 239
+1 -1
tools/perf/arch/x86/util/intel-pt.c
··· 426 426 if (!evlist__can_select_event(evlist, sched_switch)) 427 427 return -EPERM; 428 428 429 - err = parse_events(evlist, sched_switch, NULL); 429 + err = parse_event(evlist, sched_switch); 430 430 if (err) { 431 431 pr_debug2("%s: failed to parse %s, error %d\n", 432 432 __func__, sched_switch, err);
+1 -1
tools/perf/arch/x86/util/iostat.c
··· 316 316 sprintf(iostat_cmd, iostat_cmd_template, 317 317 list->rps[idx]->pmu_idx, list->rps[idx]->pmu_idx, 318 318 list->rps[idx]->pmu_idx, list->rps[idx]->pmu_idx); 319 - ret = parse_events(evl, iostat_cmd, NULL); 319 + ret = parse_event(evl, iostat_cmd); 320 320 if (ret) 321 321 goto err; 322 322 }
+1 -1
tools/perf/arch/x86/util/topdown.c
··· 122 122 topdown_events = TOPDOWN_L1_EVENTS; 123 123 } 124 124 125 - return parse_events(evlist, topdown_events, NULL); 125 + return parse_event(evlist, topdown_events); 126 126 }
+1 -1
tools/perf/tests/code-reading.c
··· 638 638 639 639 str = do_determine_event(excl_kernel); 640 640 pr_debug("Parsing event '%s'\n", str); 641 - ret = parse_events(evlist, str, NULL); 641 + ret = parse_event(evlist, str); 642 642 if (ret < 0) { 643 643 pr_debug("parse_events failed\n"); 644 644 goto out_put;
+1 -1
tools/perf/tests/event-times.c
··· 174 174 goto out_err; 175 175 } 176 176 177 - err = parse_events(evlist, "cpu-clock:u", NULL); 177 + err = parse_event(evlist, "cpu-clock:u"); 178 178 if (err) { 179 179 pr_debug("failed to parse event cpu-clock:u\n"); 180 180 goto out_err;
+2 -2
tools/perf/tests/evsel-roundtrip-name.c
··· 27 27 28 28 for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) { 29 29 __evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name)); 30 - err = parse_events(evlist, name, NULL); 30 + err = parse_event(evlist, name); 31 31 if (err) 32 32 ret = err; 33 33 } ··· 75 75 return -ENOMEM; 76 76 77 77 for (i = 0; i < nr_names; ++i) { 78 - err = parse_events(evlist, names[i], NULL); 78 + err = parse_event(evlist, names[i]); 79 79 if (err) { 80 80 pr_debug("failed to parse event '%s', err %d\n", 81 81 names[i], err);
+1 -1
tools/perf/tests/hists_cumulate.c
··· 706 706 707 707 TEST_ASSERT_VAL("No memory", evlist); 708 708 709 - err = parse_events(evlist, "cpu-clock", NULL); 709 + err = parse_event(evlist, "cpu-clock"); 710 710 if (err) 711 711 goto out; 712 712 err = TEST_FAIL;
+2 -2
tools/perf/tests/hists_filter.c
··· 111 111 112 112 TEST_ASSERT_VAL("No memory", evlist); 113 113 114 - err = parse_events(evlist, "cpu-clock", NULL); 114 + err = parse_event(evlist, "cpu-clock"); 115 115 if (err) 116 116 goto out; 117 - err = parse_events(evlist, "task-clock", NULL); 117 + err = parse_event(evlist, "task-clock"); 118 118 if (err) 119 119 goto out; 120 120 err = TEST_FAIL;
+2 -2
tools/perf/tests/hists_link.c
··· 276 276 if (evlist == NULL) 277 277 return -ENOMEM; 278 278 279 - err = parse_events(evlist, "cpu-clock", NULL); 279 + err = parse_event(evlist, "cpu-clock"); 280 280 if (err) 281 281 goto out; 282 - err = parse_events(evlist, "task-clock", NULL); 282 + err = parse_event(evlist, "task-clock"); 283 283 if (err) 284 284 goto out; 285 285
+1 -1
tools/perf/tests/hists_output.c
··· 593 593 594 594 TEST_ASSERT_VAL("No memory", evlist); 595 595 596 - err = parse_events(evlist, "cpu-clock", NULL); 596 + err = parse_event(evlist, "cpu-clock"); 597 597 if (err) 598 598 goto out; 599 599 err = TEST_FAIL;
+2 -2
tools/perf/tests/keep-tracking.c
··· 89 89 90 90 perf_evlist__set_maps(&evlist->core, cpus, threads); 91 91 92 - CHECK__(parse_events(evlist, "dummy:u", NULL)); 93 - CHECK__(parse_events(evlist, "cycles:u", NULL)); 92 + CHECK__(parse_event(evlist, "dummy:u")); 93 + CHECK__(parse_event(evlist, "cycles:u")); 94 94 95 95 evlist__config(evlist, &opts, NULL); 96 96
+1 -1
tools/perf/tests/perf-time-to-tsc.c
··· 100 100 101 101 perf_evlist__set_maps(&evlist->core, cpus, threads); 102 102 103 - CHECK__(parse_events(evlist, "cycles:u", NULL)); 103 + CHECK__(parse_event(evlist, "cycles:u")); 104 104 105 105 evlist__config(evlist, &opts, NULL); 106 106
+6 -6
tools/perf/tests/switch-tracking.c
··· 364 364 perf_evlist__set_maps(&evlist->core, cpus, threads); 365 365 366 366 /* First event */ 367 - err = parse_events(evlist, "cpu-clock:u", NULL); 367 + err = parse_event(evlist, "cpu-clock:u"); 368 368 if (err) { 369 369 pr_debug("Failed to parse event dummy:u\n"); 370 370 goto out_err; ··· 375 375 /* Second event */ 376 376 if (perf_pmu__has_hybrid()) { 377 377 cycles = "cpu_core/cycles/u"; 378 - err = parse_events(evlist, cycles, NULL); 378 + err = parse_event(evlist, cycles); 379 379 if (err) { 380 380 cycles = "cpu_atom/cycles/u"; 381 381 pr_debug("Trying %s\n", cycles); 382 - err = parse_events(evlist, cycles, NULL); 382 + err = parse_event(evlist, cycles); 383 383 } 384 384 } else { 385 - err = parse_events(evlist, cycles, NULL); 385 + err = parse_event(evlist, cycles); 386 386 } 387 387 if (err) { 388 388 pr_debug("Failed to parse event %s\n", cycles); ··· 398 398 goto out; 399 399 } 400 400 401 - err = parse_events(evlist, sched_switch, NULL); 401 + err = parse_event(evlist, sched_switch); 402 402 if (err) { 403 403 pr_debug("Failed to parse event %s\n", sched_switch); 404 404 goto out_err; ··· 428 428 evsel__set_sample_bit(cycles_evsel, TIME); 429 429 430 430 /* Fourth event */ 431 - err = parse_events(evlist, "dummy:u", NULL); 431 + err = parse_event(evlist, "dummy:u"); 432 432 if (err) { 433 433 pr_debug("Failed to parse event dummy:u\n"); 434 434 goto out_err;
+1 -1
tools/perf/util/bpf-loader.c
··· 1879 1879 if (asprintf(&event_definition, "bpf-output/no-inherit=1,name=%s/", name) < 0) 1880 1880 return ERR_PTR(-ENOMEM); 1881 1881 1882 - err = parse_events(evlist, event_definition, NULL); 1882 + err = parse_event(evlist, event_definition); 1883 1883 free(event_definition); 1884 1884 1885 1885 if (err) {
+12 -6
tools/perf/util/parse-events.c
··· 2240 2240 return ret; 2241 2241 } 2242 2242 2243 + int parse_event(struct evlist *evlist, const char *str) 2244 + { 2245 + struct parse_events_error err; 2246 + int ret; 2247 + 2248 + parse_events_error__init(&err); 2249 + ret = parse_events(evlist, str, &err); 2250 + parse_events_error__exit(&err); 2251 + return ret; 2252 + } 2253 + 2243 2254 void parse_events_error__init(struct parse_events_error *err) 2244 2255 { 2245 2256 bzero(err, sizeof(*err)); ··· 2267 2256 void parse_events_error__handle(struct parse_events_error *err, int idx, 2268 2257 char *str, char *help) 2269 2258 { 2270 - if (WARN(!str, "WARNING: failed to provide error string\n")) 2259 + if (WARN(!str || !err, "WARNING: failed to provide error string or struct\n")) 2271 2260 goto out_free; 2272 - if (!err) { 2273 - /* Assume caller does not want message printed */ 2274 - pr_debug("event syntax error: %s\n", str); 2275 - goto out_free; 2276 - } 2277 2261 switch (err->num_errors) { 2278 2262 case 0: 2279 2263 err->idx = idx;
+4
tools/perf/util/parse-events.h
··· 24 24 25 25 int parse_events_option(const struct option *opt, const char *str, int unset); 26 26 int parse_events_option_new_evlist(const struct option *opt, const char *str, int unset); 27 + __attribute__((nonnull(1, 2, 3))) 27 28 int __parse_events(struct evlist *evlist, const char *str, struct parse_events_error *error, 28 29 struct perf_pmu *fake_pmu); 29 30 31 + __attribute__((nonnull)) 30 32 static inline int parse_events(struct evlist *evlist, const char *str, 31 33 struct parse_events_error *err) 32 34 { 33 35 return __parse_events(evlist, str, err, NULL); 34 36 } 37 + 38 + int parse_event(struct evlist *evlist, const char *str); 35 39 36 40 int parse_events_terms(struct list_head *terms, const char *str); 37 41 int parse_filter(const struct option *opt, const char *str, int unset);
+1 -1
tools/perf/util/perf_api_probe.c
··· 23 23 if (!evlist) 24 24 return -ENOMEM; 25 25 26 - if (parse_events(evlist, str, NULL)) 26 + if (parse_event(evlist, str)) 27 27 goto out_delete; 28 28 29 29 evsel = evlist__first(evlist);
+1 -1
tools/perf/util/record.c
··· 238 238 if (!temp_evlist) 239 239 return false; 240 240 241 - err = parse_events(temp_evlist, str, NULL); 241 + err = parse_event(temp_evlist, str); 242 242 if (err) 243 243 goto out_delete; 244 244