diff options
| author | Adrian Hunter <adrian.hunter@intel.com> | 2013-08-14 08:48:24 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-08-16 16:17:58 -0400 |
| commit | e3e1a54fce81ee045dd152deb5435b136cb0b75f (patch) | |
| tree | 136a7a440b953cce38dc8f347b9a76855ff572e0 /tools | |
| parent | 8afb4c018e21c882c8fad196772ef74d494185e2 (diff) | |
perf tools: Add debug prints
It is useful to see the arguments to perf_event_open and whether the
perf events ring buffer was mmapped per-cpu or per-thread.
That information will now be displayed when verbose is 2 i.e option -vv.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1376484517-5339-3-git-send-email-adrian.hunter@intel.com
[ fixup trivial conflict with fcb14f7 ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/util/evlist.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 67 |
2 files changed, 69 insertions, 1 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index c7d111f74553..1f5105ac5c85 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include "target.h" | 14 | #include "target.h" |
| 15 | #include "evlist.h" | 15 | #include "evlist.h" |
| 16 | #include "evsel.h" | 16 | #include "evsel.h" |
| 17 | #include "debug.h" | ||
| 17 | #include <unistd.h> | 18 | #include <unistd.h> |
| 18 | 19 | ||
| 19 | #include "parse-events.h" | 20 | #include "parse-events.h" |
| @@ -486,6 +487,7 @@ static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist, int prot, int m | |||
| 486 | int nr_cpus = cpu_map__nr(evlist->cpus); | 487 | int nr_cpus = cpu_map__nr(evlist->cpus); |
| 487 | int nr_threads = thread_map__nr(evlist->threads); | 488 | int nr_threads = thread_map__nr(evlist->threads); |
| 488 | 489 | ||
| 490 | pr_debug2("perf event ring buffer mmapped per cpu\n"); | ||
| 489 | for (cpu = 0; cpu < nr_cpus; cpu++) { | 491 | for (cpu = 0; cpu < nr_cpus; cpu++) { |
| 490 | int output = -1; | 492 | int output = -1; |
| 491 | 493 | ||
| @@ -524,6 +526,7 @@ static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist, int prot, in | |||
| 524 | int thread; | 526 | int thread; |
| 525 | int nr_threads = thread_map__nr(evlist->threads); | 527 | int nr_threads = thread_map__nr(evlist->threads); |
| 526 | 528 | ||
| 529 | pr_debug2("perf event ring buffer mmapped per thread\n"); | ||
| 527 | for (thread = 0; thread < nr_threads; thread++) { | 530 | for (thread = 0; thread < nr_threads; thread++) { |
| 528 | int output = -1; | 531 | int output = -1; |
| 529 | 532 | ||
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index a29c8d03ac69..47cbe1e58b73 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include "thread_map.h" | 22 | #include "thread_map.h" |
| 23 | #include "target.h" | 23 | #include "target.h" |
| 24 | #include "perf_regs.h" | 24 | #include "perf_regs.h" |
| 25 | #include "debug.h" | ||
| 25 | 26 | ||
| 26 | static struct { | 27 | static struct { |
| 27 | bool sample_id_all; | 28 | bool sample_id_all; |
| @@ -862,6 +863,65 @@ static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread) | |||
| 862 | return fd; | 863 | return fd; |
| 863 | } | 864 | } |
| 864 | 865 | ||
| 866 | #define __PRINT_ATTR(fmt, cast, field) \ | ||
| 867 | fprintf(fp, " %-19s "fmt"\n", #field, cast attr->field) | ||
| 868 | |||
| 869 | #define PRINT_ATTR_U32(field) __PRINT_ATTR("%u" , , field) | ||
| 870 | #define PRINT_ATTR_X32(field) __PRINT_ATTR("%#x", , field) | ||
| 871 | #define PRINT_ATTR_U64(field) __PRINT_ATTR("%" PRIu64, (uint64_t), field) | ||
| 872 | #define PRINT_ATTR_X64(field) __PRINT_ATTR("%#"PRIx64, (uint64_t), field) | ||
| 873 | |||
| 874 | #define PRINT_ATTR2N(name1, field1, name2, field2) \ | ||
| 875 | fprintf(fp, " %-19s %u %-19s %u\n", \ | ||
| 876 | name1, attr->field1, name2, attr->field2) | ||
| 877 | |||
| 878 | #define PRINT_ATTR2(field1, field2) \ | ||
| 879 | PRINT_ATTR2N(#field1, field1, #field2, field2) | ||
| 880 | |||
| 881 | static size_t perf_event_attr__fprintf(struct perf_event_attr *attr, FILE *fp) | ||
| 882 | { | ||
| 883 | size_t ret = 0; | ||
| 884 | |||
| 885 | ret += fprintf(fp, "%.60s\n", graph_dotted_line); | ||
| 886 | ret += fprintf(fp, "perf_event_attr:\n"); | ||
| 887 | |||
| 888 | ret += PRINT_ATTR_U32(type); | ||
| 889 | ret += PRINT_ATTR_U32(size); | ||
| 890 | ret += PRINT_ATTR_X64(config); | ||
| 891 | ret += PRINT_ATTR_U64(sample_period); | ||
| 892 | ret += PRINT_ATTR_U64(sample_freq); | ||
| 893 | ret += PRINT_ATTR_X64(sample_type); | ||
| 894 | ret += PRINT_ATTR_X64(read_format); | ||
| 895 | |||
| 896 | ret += PRINT_ATTR2(disabled, inherit); | ||
| 897 | ret += PRINT_ATTR2(pinned, exclusive); | ||
| 898 | ret += PRINT_ATTR2(exclude_user, exclude_kernel); | ||
| 899 | ret += PRINT_ATTR2(exclude_hv, exclude_idle); | ||
| 900 | ret += PRINT_ATTR2(mmap, comm); | ||
| 901 | ret += PRINT_ATTR2(freq, inherit_stat); | ||
| 902 | ret += PRINT_ATTR2(enable_on_exec, task); | ||
| 903 | ret += PRINT_ATTR2(watermark, precise_ip); | ||
| 904 | ret += PRINT_ATTR2(mmap_data, sample_id_all); | ||
| 905 | ret += PRINT_ATTR2(exclude_host, exclude_guest); | ||
| 906 | ret += PRINT_ATTR2N("excl.callchain_kern", exclude_callchain_kernel, | ||
| 907 | "excl.callchain_user", exclude_callchain_user); | ||
| 908 | |||
| 909 | ret += PRINT_ATTR_U32(wakeup_events); | ||
| 910 | ret += PRINT_ATTR_U32(wakeup_watermark); | ||
| 911 | ret += PRINT_ATTR_X32(bp_type); | ||
| 912 | ret += PRINT_ATTR_X64(bp_addr); | ||
| 913 | ret += PRINT_ATTR_X64(config1); | ||
| 914 | ret += PRINT_ATTR_U64(bp_len); | ||
| 915 | ret += PRINT_ATTR_X64(config2); | ||
| 916 | ret += PRINT_ATTR_X64(branch_sample_type); | ||
| 917 | ret += PRINT_ATTR_X64(sample_regs_user); | ||
| 918 | ret += PRINT_ATTR_U32(sample_stack_user); | ||
| 919 | |||
| 920 | ret += fprintf(fp, "%.60s\n", graph_dotted_line); | ||
| 921 | |||
| 922 | return ret; | ||
| 923 | } | ||
| 924 | |||
| 865 | static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | 925 | static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, |
| 866 | struct thread_map *threads) | 926 | struct thread_map *threads) |
| 867 | { | 927 | { |
| @@ -886,6 +946,9 @@ retry_sample_id: | |||
| 886 | if (perf_missing_features.sample_id_all) | 946 | if (perf_missing_features.sample_id_all) |
| 887 | evsel->attr.sample_id_all = 0; | 947 | evsel->attr.sample_id_all = 0; |
| 888 | 948 | ||
| 949 | if (verbose >= 2) | ||
| 950 | perf_event_attr__fprintf(&evsel->attr, stderr); | ||
| 951 | |||
| 889 | for (cpu = 0; cpu < cpus->nr; cpu++) { | 952 | for (cpu = 0; cpu < cpus->nr; cpu++) { |
| 890 | 953 | ||
| 891 | for (thread = 0; thread < threads->nr; thread++) { | 954 | for (thread = 0; thread < threads->nr; thread++) { |
| @@ -895,8 +958,10 @@ retry_sample_id: | |||
| 895 | pid = threads->map[thread]; | 958 | pid = threads->map[thread]; |
| 896 | 959 | ||
| 897 | group_fd = get_group_fd(evsel, cpu, thread); | 960 | group_fd = get_group_fd(evsel, cpu, thread); |
| 898 | |||
| 899 | retry_open: | 961 | retry_open: |
| 962 | pr_debug2("perf_event_open: pid %d cpu %d group_fd %d flags %#lx\n", | ||
| 963 | pid, cpus->map[cpu], group_fd, flags); | ||
| 964 | |||
| 900 | FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, | 965 | FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, |
| 901 | pid, | 966 | pid, |
| 902 | cpus->map[cpu], | 967 | cpus->map[cpu], |
