diff options
Diffstat (limited to 'tools/perf/tests/code-reading.c')
-rw-r--r-- | tools/perf/tests/code-reading.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c index 3bf7b145b826..99936352df4f 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c | |||
@@ -409,15 +409,21 @@ static int process_events(struct machine *machine, struct perf_evlist *evlist, | |||
409 | struct state *state) | 409 | struct state *state) |
410 | { | 410 | { |
411 | union perf_event *event; | 411 | union perf_event *event; |
412 | struct perf_mmap *md; | ||
412 | int i, ret; | 413 | int i, ret; |
413 | 414 | ||
414 | for (i = 0; i < evlist->nr_mmaps; i++) { | 415 | for (i = 0; i < evlist->nr_mmaps; i++) { |
415 | while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) { | 416 | md = &evlist->mmap[i]; |
417 | if (perf_mmap__read_init(md) < 0) | ||
418 | continue; | ||
419 | |||
420 | while ((event = perf_mmap__read_event(md)) != NULL) { | ||
416 | ret = process_event(machine, evlist, event, state); | 421 | ret = process_event(machine, evlist, event, state); |
417 | perf_evlist__mmap_consume(evlist, i); | 422 | perf_mmap__consume(md); |
418 | if (ret < 0) | 423 | if (ret < 0) |
419 | return ret; | 424 | return ret; |
420 | } | 425 | } |
426 | perf_mmap__read_done(md); | ||
421 | } | 427 | } |
422 | return 0; | 428 | return 0; |
423 | } | 429 | } |
@@ -482,6 +488,34 @@ static void fs_something(void) | |||
482 | } | 488 | } |
483 | } | 489 | } |
484 | 490 | ||
491 | static const char *do_determine_event(bool excl_kernel) | ||
492 | { | ||
493 | const char *event = excl_kernel ? "cycles:u" : "cycles"; | ||
494 | |||
495 | #ifdef __s390x__ | ||
496 | char cpuid[128], model[16], model_c[16], cpum_cf_v[16]; | ||
497 | unsigned int family; | ||
498 | int ret, cpum_cf_a; | ||
499 | |||
500 | if (get_cpuid(cpuid, sizeof(cpuid))) | ||
501 | goto out_clocks; | ||
502 | ret = sscanf(cpuid, "%*[^,],%u,%[^,],%[^,],%[^,],%x", &family, model_c, | ||
503 | model, cpum_cf_v, &cpum_cf_a); | ||
504 | if (ret != 5) /* Not available */ | ||
505 | goto out_clocks; | ||
506 | if (excl_kernel && (cpum_cf_a & 4)) | ||
507 | return event; | ||
508 | if (!excl_kernel && (cpum_cf_a & 2)) | ||
509 | return event; | ||
510 | |||
511 | /* Fall through: missing authorization */ | ||
512 | out_clocks: | ||
513 | event = excl_kernel ? "cpu-clock:u" : "cpu-clock"; | ||
514 | |||
515 | #endif | ||
516 | return event; | ||
517 | } | ||
518 | |||
485 | static void do_something(void) | 519 | static void do_something(void) |
486 | { | 520 | { |
487 | fs_something(); | 521 | fs_something(); |
@@ -592,10 +626,7 @@ static int do_test_code_reading(bool try_kcore) | |||
592 | 626 | ||
593 | perf_evlist__set_maps(evlist, cpus, threads); | 627 | perf_evlist__set_maps(evlist, cpus, threads); |
594 | 628 | ||
595 | if (excl_kernel) | 629 | str = do_determine_event(excl_kernel); |
596 | str = "cycles:u"; | ||
597 | else | ||
598 | str = "cycles"; | ||
599 | pr_debug("Parsing event '%s'\n", str); | 630 | pr_debug("Parsing event '%s'\n", str); |
600 | ret = parse_events(evlist, str, NULL); | 631 | ret = parse_events(evlist, str, NULL); |
601 | if (ret < 0) { | 632 | if (ret < 0) { |