diff options
author | Ingo Molnar <mingo@kernel.org> | 2013-11-07 10:24:57 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-11-07 10:24:57 -0500 |
commit | 4d9218daae2b00379b2bb81eaf4fe5143f372db1 (patch) | |
tree | 575efccf53ea7ced32e2896f8d2ed491e4673471 | |
parent | 8a4d0b56b031455adcbe4a9383c3b497456fcfac (diff) | |
parent | 8ce000e83848578a621d64eccdc88bd34c2fc70c (diff) |
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
* Fix version when building out of tree, as when using one of these:
$ make help | grep perf
perf-tar-src-pkg - Build perf-3.12.0.tar source tarball
perf-targz-src-pkg - Build perf-3.12.0.tar.gz source tarball
perf-tarbz2-src-pkg - Build perf-3.12.0.tar.bz2 source tarball
perf-tarxz-src-pkg - Build perf-3.12.0.tar.xz source tarball
$
from David Ahern.
* Don't relookup fields by name in each sample in 'trace',
by Arnaldo Carvalho de Melo.
* 'perf record' code cleanups, from David Ahern.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | scripts/package/Makefile | 4 | ||||
-rw-r--r-- | tools/perf/builtin-inject.c | 10 | ||||
-rw-r--r-- | tools/perf/builtin-kmem.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-lock.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-record.c | 48 | ||||
-rw-r--r-- | tools/perf/builtin-sched.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-timechart.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-trace.c | 205 | ||||
-rwxr-xr-x | tools/perf/util/PERF-VERSION-GEN | 3 | ||||
-rw-r--r-- | tools/perf/util/evlist.c | 2 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 5 | ||||
-rw-r--r-- | tools/perf/util/session.c | 4 | ||||
-rw-r--r-- | tools/perf/util/sort.h | 1 |
13 files changed, 239 insertions, 59 deletions
diff --git a/scripts/package/Makefile b/scripts/package/Makefile index a4f31c900fa6..c5d473393816 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile | |||
@@ -115,7 +115,9 @@ git --git-dir=$(srctree)/.git archive --prefix=$(perf-tar)/ \ | |||
115 | -o $(perf-tar).tar; \ | 115 | -o $(perf-tar).tar; \ |
116 | mkdir -p $(perf-tar); \ | 116 | mkdir -p $(perf-tar); \ |
117 | git --git-dir=$(srctree)/.git rev-parse HEAD > $(perf-tar)/HEAD; \ | 117 | git --git-dir=$(srctree)/.git rev-parse HEAD > $(perf-tar)/HEAD; \ |
118 | tar rf $(perf-tar).tar $(perf-tar)/HEAD; \ | 118 | (cd $(srctree)/tools/perf; \ |
119 | util/PERF-VERSION-GEN ../../$(perf-tar)/ 2>/dev/null); \ | ||
120 | tar rf $(perf-tar).tar $(perf-tar)/HEAD $(perf-tar)/PERF-VERSION-FILE; \ | ||
119 | rm -r $(perf-tar); \ | 121 | rm -r $(perf-tar); \ |
120 | $(if $(findstring tar-src,$@),, \ | 122 | $(if $(findstring tar-src,$@),, \ |
121 | $(if $(findstring bz2,$@),bzip2, \ | 123 | $(if $(findstring bz2,$@),bzip2, \ |
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 409ceaf3b9b9..6a2508589460 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c | |||
@@ -106,8 +106,8 @@ static int perf_event__repipe_sample(struct perf_tool *tool, | |||
106 | struct perf_evsel *evsel, | 106 | struct perf_evsel *evsel, |
107 | struct machine *machine) | 107 | struct machine *machine) |
108 | { | 108 | { |
109 | if (evsel->handler.func) { | 109 | if (evsel->handler) { |
110 | inject_handler f = evsel->handler.func; | 110 | inject_handler f = evsel->handler; |
111 | return f(tool, event, sample, evsel, machine); | 111 | return f(tool, event, sample, evsel, machine); |
112 | } | 112 | } |
113 | 113 | ||
@@ -383,11 +383,11 @@ static int __cmd_inject(struct perf_inject *inject) | |||
383 | if (perf_evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID")) | 383 | if (perf_evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID")) |
384 | return -EINVAL; | 384 | return -EINVAL; |
385 | 385 | ||
386 | evsel->handler.func = perf_inject__sched_switch; | 386 | evsel->handler = perf_inject__sched_switch; |
387 | } else if (!strcmp(name, "sched:sched_process_exit")) | 387 | } else if (!strcmp(name, "sched:sched_process_exit")) |
388 | evsel->handler.func = perf_inject__sched_process_exit; | 388 | evsel->handler = perf_inject__sched_process_exit; |
389 | else if (!strncmp(name, "sched:sched_stat_", 17)) | 389 | else if (!strncmp(name, "sched:sched_stat_", 17)) |
390 | evsel->handler.func = perf_inject__sched_stat; | 390 | evsel->handler = perf_inject__sched_stat; |
391 | } | 391 | } |
392 | } | 392 | } |
393 | 393 | ||
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index a28970f7ddfb..929462aa4943 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -317,8 +317,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, | |||
317 | 317 | ||
318 | dump_printf(" ... thread: %s:%d\n", thread__comm_str(thread), thread->tid); | 318 | dump_printf(" ... thread: %s:%d\n", thread__comm_str(thread), thread->tid); |
319 | 319 | ||
320 | if (evsel->handler.func != NULL) { | 320 | if (evsel->handler != NULL) { |
321 | tracepoint_handler f = evsel->handler.func; | 321 | tracepoint_handler f = evsel->handler; |
322 | return f(evsel, sample); | 322 | return f(evsel, sample); |
323 | } | 323 | } |
324 | 324 | ||
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 35f9aaa565cc..c852c7a85d32 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c | |||
@@ -819,8 +819,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, | |||
819 | return -1; | 819 | return -1; |
820 | } | 820 | } |
821 | 821 | ||
822 | if (evsel->handler.func != NULL) { | 822 | if (evsel->handler != NULL) { |
823 | tracepoint_handler f = evsel->handler.func; | 823 | tracepoint_handler f = evsel->handler; |
824 | return f(evsel, sample); | 824 | return f(evsel, sample); |
825 | } | 825 | } |
826 | 826 | ||
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index ea4c04f7437e..15280b5e5574 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -74,14 +74,8 @@ struct perf_record { | |||
74 | bool no_buildid; | 74 | bool no_buildid; |
75 | bool no_buildid_cache; | 75 | bool no_buildid_cache; |
76 | long samples; | 76 | long samples; |
77 | off_t post_processing_offset; | ||
78 | }; | 77 | }; |
79 | 78 | ||
80 | static void advance_output(struct perf_record *rec, size_t size) | ||
81 | { | ||
82 | rec->bytes_written += size; | ||
83 | } | ||
84 | |||
85 | static int write_output(struct perf_record *rec, void *buf, size_t size) | 79 | static int write_output(struct perf_record *rec, void *buf, size_t size) |
86 | { | 80 | { |
87 | struct perf_data_file *file = &rec->file; | 81 | struct perf_data_file *file = &rec->file; |
@@ -252,13 +246,14 @@ static int process_buildids(struct perf_record *rec) | |||
252 | { | 246 | { |
253 | struct perf_data_file *file = &rec->file; | 247 | struct perf_data_file *file = &rec->file; |
254 | struct perf_session *session = rec->session; | 248 | struct perf_session *session = rec->session; |
249 | u64 start = session->header.data_offset; | ||
255 | 250 | ||
256 | u64 size = lseek(file->fd, 0, SEEK_CUR); | 251 | u64 size = lseek(file->fd, 0, SEEK_CUR); |
257 | if (size == 0) | 252 | if (size == 0) |
258 | return 0; | 253 | return 0; |
259 | 254 | ||
260 | return __perf_session__process_events(session, rec->post_processing_offset, | 255 | return __perf_session__process_events(session, start, |
261 | size - rec->post_processing_offset, | 256 | size - start, |
262 | size, &build_id__mark_dso_hit_ops); | 257 | size, &build_id__mark_dso_hit_ops); |
263 | } | 258 | } |
264 | 259 | ||
@@ -342,9 +337,28 @@ out: | |||
342 | return rc; | 337 | return rc; |
343 | } | 338 | } |
344 | 339 | ||
340 | static void perf_record__init_features(struct perf_record *rec) | ||
341 | { | ||
342 | struct perf_evlist *evsel_list = rec->evlist; | ||
343 | struct perf_session *session = rec->session; | ||
344 | int feat; | ||
345 | |||
346 | for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++) | ||
347 | perf_header__set_feat(&session->header, feat); | ||
348 | |||
349 | if (rec->no_buildid) | ||
350 | perf_header__clear_feat(&session->header, HEADER_BUILD_ID); | ||
351 | |||
352 | if (!have_tracepoints(&evsel_list->entries)) | ||
353 | perf_header__clear_feat(&session->header, HEADER_TRACING_DATA); | ||
354 | |||
355 | if (!rec->opts.branch_stack) | ||
356 | perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK); | ||
357 | } | ||
358 | |||
345 | static int __cmd_record(struct perf_record *rec, int argc, const char **argv) | 359 | static int __cmd_record(struct perf_record *rec, int argc, const char **argv) |
346 | { | 360 | { |
347 | int err, feat; | 361 | int err; |
348 | unsigned long waking = 0; | 362 | unsigned long waking = 0; |
349 | const bool forks = argc > 0; | 363 | const bool forks = argc > 0; |
350 | struct machine *machine; | 364 | struct machine *machine; |
@@ -371,17 +385,7 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv) | |||
371 | 385 | ||
372 | rec->session = session; | 386 | rec->session = session; |
373 | 387 | ||
374 | for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++) | 388 | perf_record__init_features(rec); |
375 | perf_header__set_feat(&session->header, feat); | ||
376 | |||
377 | if (rec->no_buildid) | ||
378 | perf_header__clear_feat(&session->header, HEADER_BUILD_ID); | ||
379 | |||
380 | if (!have_tracepoints(&evsel_list->entries)) | ||
381 | perf_header__clear_feat(&session->header, HEADER_TRACING_DATA); | ||
382 | |||
383 | if (!rec->opts.branch_stack) | ||
384 | perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK); | ||
385 | 389 | ||
386 | if (forks) { | 390 | if (forks) { |
387 | err = perf_evlist__prepare_workload(evsel_list, &opts->target, | 391 | err = perf_evlist__prepare_workload(evsel_list, &opts->target, |
@@ -425,8 +429,6 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv) | |||
425 | goto out_delete_session; | 429 | goto out_delete_session; |
426 | } | 430 | } |
427 | 431 | ||
428 | rec->post_processing_offset = lseek(file->fd, 0, SEEK_CUR); | ||
429 | |||
430 | machine = &session->machines.host; | 432 | machine = &session->machines.host; |
431 | 433 | ||
432 | if (file->is_pipe) { | 434 | if (file->is_pipe) { |
@@ -452,7 +454,7 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv) | |||
452 | pr_err("Couldn't record tracing data.\n"); | 454 | pr_err("Couldn't record tracing data.\n"); |
453 | goto out_delete_session; | 455 | goto out_delete_session; |
454 | } | 456 | } |
455 | advance_output(rec, err); | 457 | rec->bytes_written += err; |
456 | } | 458 | } |
457 | } | 459 | } |
458 | 460 | ||
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index a81ab1828aa5..0f3c65518a2c 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
@@ -1427,8 +1427,8 @@ static int perf_sched__process_tracepoint_sample(struct perf_tool *tool __maybe_ | |||
1427 | evsel->hists.stats.total_period += sample->period; | 1427 | evsel->hists.stats.total_period += sample->period; |
1428 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); | 1428 | hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); |
1429 | 1429 | ||
1430 | if (evsel->handler.func != NULL) { | 1430 | if (evsel->handler != NULL) { |
1431 | tracepoint_handler f = evsel->handler.func; | 1431 | tracepoint_handler f = evsel->handler; |
1432 | err = f(tool, evsel, sample, machine); | 1432 | err = f(tool, evsel, sample, machine); |
1433 | } | 1433 | } |
1434 | 1434 | ||
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index e11c61d9bda4..41c9bde2fb67 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
@@ -483,8 +483,8 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, | |||
483 | if (sample->cpu > numcpus) | 483 | if (sample->cpu > numcpus) |
484 | numcpus = sample->cpu; | 484 | numcpus = sample->cpu; |
485 | 485 | ||
486 | if (evsel->handler.func != NULL) { | 486 | if (evsel->handler != NULL) { |
487 | tracepoint_handler f = evsel->handler.func; | 487 | tracepoint_handler f = evsel->handler; |
488 | return f(evsel, sample); | 488 | return f(evsel, sample); |
489 | } | 489 | } |
490 | 490 | ||
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index b3e57dc64546..329b7832b5da 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -35,6 +35,189 @@ | |||
35 | # define MADV_UNMERGEABLE 13 | 35 | # define MADV_UNMERGEABLE 13 |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | struct tp_field { | ||
39 | int offset; | ||
40 | union { | ||
41 | u64 (*integer)(struct tp_field *field, struct perf_sample *sample); | ||
42 | void *(*pointer)(struct tp_field *field, struct perf_sample *sample); | ||
43 | }; | ||
44 | }; | ||
45 | |||
46 | #define TP_UINT_FIELD(bits) \ | ||
47 | static u64 tp_field__u##bits(struct tp_field *field, struct perf_sample *sample) \ | ||
48 | { \ | ||
49 | return *(u##bits *)(sample->raw_data + field->offset); \ | ||
50 | } | ||
51 | |||
52 | TP_UINT_FIELD(8); | ||
53 | TP_UINT_FIELD(16); | ||
54 | TP_UINT_FIELD(32); | ||
55 | TP_UINT_FIELD(64); | ||
56 | |||
57 | #define TP_UINT_FIELD__SWAPPED(bits) \ | ||
58 | static u64 tp_field__swapped_u##bits(struct tp_field *field, struct perf_sample *sample) \ | ||
59 | { \ | ||
60 | u##bits value = *(u##bits *)(sample->raw_data + field->offset); \ | ||
61 | return bswap_##bits(value);\ | ||
62 | } | ||
63 | |||
64 | TP_UINT_FIELD__SWAPPED(16); | ||
65 | TP_UINT_FIELD__SWAPPED(32); | ||
66 | TP_UINT_FIELD__SWAPPED(64); | ||
67 | |||
68 | static int tp_field__init_uint(struct tp_field *field, | ||
69 | struct format_field *format_field, | ||
70 | bool needs_swap) | ||
71 | { | ||
72 | field->offset = format_field->offset; | ||
73 | |||
74 | switch (format_field->size) { | ||
75 | case 1: | ||
76 | field->integer = tp_field__u8; | ||
77 | break; | ||
78 | case 2: | ||
79 | field->integer = needs_swap ? tp_field__swapped_u16 : tp_field__u16; | ||
80 | break; | ||
81 | case 4: | ||
82 | field->integer = needs_swap ? tp_field__swapped_u32 : tp_field__u32; | ||
83 | break; | ||
84 | case 8: | ||
85 | field->integer = needs_swap ? tp_field__swapped_u64 : tp_field__u64; | ||
86 | break; | ||
87 | default: | ||
88 | return -1; | ||
89 | } | ||
90 | |||
91 | return 0; | ||
92 | } | ||
93 | |||
94 | static void *tp_field__ptr(struct tp_field *field, struct perf_sample *sample) | ||
95 | { | ||
96 | return sample->raw_data + field->offset; | ||
97 | } | ||
98 | |||
99 | static int tp_field__init_ptr(struct tp_field *field, struct format_field *format_field) | ||
100 | { | ||
101 | field->offset = format_field->offset; | ||
102 | field->pointer = tp_field__ptr; | ||
103 | return 0; | ||
104 | } | ||
105 | |||
106 | struct syscall_tp { | ||
107 | struct tp_field id; | ||
108 | union { | ||
109 | struct tp_field args, ret; | ||
110 | }; | ||
111 | }; | ||
112 | |||
113 | static int perf_evsel__init_tp_uint_field(struct perf_evsel *evsel, | ||
114 | struct tp_field *field, | ||
115 | const char *name) | ||
116 | { | ||
117 | struct format_field *format_field = perf_evsel__field(evsel, name); | ||
118 | |||
119 | if (format_field == NULL) | ||
120 | return -1; | ||
121 | |||
122 | return tp_field__init_uint(field, format_field, evsel->needs_swap); | ||
123 | } | ||
124 | |||
125 | #define perf_evsel__init_sc_tp_uint_field(evsel, name) \ | ||
126 | ({ struct syscall_tp *sc = evsel->priv;\ | ||
127 | perf_evsel__init_tp_uint_field(evsel, &sc->name, #name); }) | ||
128 | |||
129 | static int perf_evsel__init_tp_ptr_field(struct perf_evsel *evsel, | ||
130 | struct tp_field *field, | ||
131 | const char *name) | ||
132 | { | ||
133 | struct format_field *format_field = perf_evsel__field(evsel, name); | ||
134 | |||
135 | if (format_field == NULL) | ||
136 | return -1; | ||
137 | |||
138 | return tp_field__init_ptr(field, format_field); | ||
139 | } | ||
140 | |||
141 | #define perf_evsel__init_sc_tp_ptr_field(evsel, name) \ | ||
142 | ({ struct syscall_tp *sc = evsel->priv;\ | ||
143 | perf_evsel__init_tp_ptr_field(evsel, &sc->name, #name); }) | ||
144 | |||
145 | static void perf_evsel__delete_priv(struct perf_evsel *evsel) | ||
146 | { | ||
147 | free(evsel->priv); | ||
148 | evsel->priv = NULL; | ||
149 | perf_evsel__delete(evsel); | ||
150 | } | ||
151 | |||
152 | static struct perf_evsel *perf_evsel__syscall_newtp(const char *direction, | ||
153 | void *handler, int idx) | ||
154 | { | ||
155 | struct perf_evsel *evsel = perf_evsel__newtp("raw_syscalls", direction, idx); | ||
156 | |||
157 | if (evsel) { | ||
158 | evsel->priv = malloc(sizeof(struct syscall_tp)); | ||
159 | |||
160 | if (evsel->priv == NULL) | ||
161 | goto out_delete; | ||
162 | |||
163 | if (perf_evsel__init_sc_tp_uint_field(evsel, id)) | ||
164 | goto out_delete; | ||
165 | |||
166 | evsel->handler = handler; | ||
167 | } | ||
168 | |||
169 | return evsel; | ||
170 | |||
171 | out_delete: | ||
172 | perf_evsel__delete_priv(evsel); | ||
173 | return NULL; | ||
174 | } | ||
175 | |||
176 | #define perf_evsel__sc_tp_uint(evsel, name, sample) \ | ||
177 | ({ struct syscall_tp *fields = evsel->priv; \ | ||
178 | fields->name.integer(&fields->name, sample); }) | ||
179 | |||
180 | #define perf_evsel__sc_tp_ptr(evsel, name, sample) \ | ||
181 | ({ struct syscall_tp *fields = evsel->priv; \ | ||
182 | fields->name.pointer(&fields->name, sample); }) | ||
183 | |||
184 | static int perf_evlist__add_syscall_newtp(struct perf_evlist *evlist, | ||
185 | void *sys_enter_handler, | ||
186 | void *sys_exit_handler) | ||
187 | { | ||
188 | int ret = -1; | ||
189 | int idx = evlist->nr_entries; | ||
190 | struct perf_evsel *sys_enter, *sys_exit; | ||
191 | |||
192 | sys_enter = perf_evsel__syscall_newtp("sys_enter", sys_enter_handler, idx++); | ||
193 | if (sys_enter == NULL) | ||
194 | goto out; | ||
195 | |||
196 | if (perf_evsel__init_sc_tp_ptr_field(sys_enter, args)) | ||
197 | goto out_delete_sys_enter; | ||
198 | |||
199 | sys_exit = perf_evsel__syscall_newtp("sys_exit", sys_exit_handler, idx++); | ||
200 | if (sys_exit == NULL) | ||
201 | goto out_delete_sys_enter; | ||
202 | |||
203 | if (perf_evsel__init_sc_tp_uint_field(sys_exit, ret)) | ||
204 | goto out_delete_sys_exit; | ||
205 | |||
206 | perf_evlist__add(evlist, sys_enter); | ||
207 | perf_evlist__add(evlist, sys_exit); | ||
208 | |||
209 | ret = 0; | ||
210 | out: | ||
211 | return ret; | ||
212 | |||
213 | out_delete_sys_exit: | ||
214 | perf_evsel__delete_priv(sys_exit); | ||
215 | out_delete_sys_enter: | ||
216 | perf_evsel__delete_priv(sys_enter); | ||
217 | goto out; | ||
218 | } | ||
219 | |||
220 | |||
38 | struct syscall_arg { | 221 | struct syscall_arg { |
39 | unsigned long val; | 222 | unsigned long val; |
40 | struct thread *thread; | 223 | struct thread *thread; |
@@ -1392,7 +1575,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, | |||
1392 | void *args; | 1575 | void *args; |
1393 | size_t printed = 0; | 1576 | size_t printed = 0; |
1394 | struct thread *thread; | 1577 | struct thread *thread; |
1395 | int id = perf_evsel__intval(evsel, sample, "id"); | 1578 | int id = perf_evsel__sc_tp_uint(evsel, id, sample); |
1396 | struct syscall *sc = trace__syscall_info(trace, evsel, id); | 1579 | struct syscall *sc = trace__syscall_info(trace, evsel, id); |
1397 | struct thread_trace *ttrace; | 1580 | struct thread_trace *ttrace; |
1398 | 1581 | ||
@@ -1407,12 +1590,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, | |||
1407 | if (ttrace == NULL) | 1590 | if (ttrace == NULL) |
1408 | return -1; | 1591 | return -1; |
1409 | 1592 | ||
1410 | args = perf_evsel__rawptr(evsel, sample, "args"); | 1593 | args = perf_evsel__sc_tp_ptr(evsel, args, sample); |
1411 | if (args == NULL) { | ||
1412 | fprintf(trace->output, "Problems reading syscall arguments\n"); | ||
1413 | return -1; | ||
1414 | } | ||
1415 | |||
1416 | ttrace = thread->priv; | 1594 | ttrace = thread->priv; |
1417 | 1595 | ||
1418 | if (ttrace->entry_str == NULL) { | 1596 | if (ttrace->entry_str == NULL) { |
@@ -1445,7 +1623,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel, | |||
1445 | int ret; | 1623 | int ret; |
1446 | u64 duration = 0; | 1624 | u64 duration = 0; |
1447 | struct thread *thread; | 1625 | struct thread *thread; |
1448 | int id = perf_evsel__intval(evsel, sample, "id"); | 1626 | int id = perf_evsel__sc_tp_uint(evsel, id, sample); |
1449 | struct syscall *sc = trace__syscall_info(trace, evsel, id); | 1627 | struct syscall *sc = trace__syscall_info(trace, evsel, id); |
1450 | struct thread_trace *ttrace; | 1628 | struct thread_trace *ttrace; |
1451 | 1629 | ||
@@ -1463,7 +1641,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel, | |||
1463 | if (trace->summary) | 1641 | if (trace->summary) |
1464 | thread__update_stats(ttrace, id, sample); | 1642 | thread__update_stats(ttrace, id, sample); |
1465 | 1643 | ||
1466 | ret = perf_evsel__intval(evsel, sample, "ret"); | 1644 | ret = perf_evsel__sc_tp_uint(evsel, ret, sample); |
1467 | 1645 | ||
1468 | if (id == trace->audit.open_id && ret >= 0 && trace->last_vfs_getname) { | 1646 | if (id == trace->audit.open_id && ret >= 0 && trace->last_vfs_getname) { |
1469 | trace__set_fd_pathname(thread, ret, trace->last_vfs_getname); | 1647 | trace__set_fd_pathname(thread, ret, trace->last_vfs_getname); |
@@ -1570,7 +1748,7 @@ static int trace__process_sample(struct perf_tool *tool, | |||
1570 | struct trace *trace = container_of(tool, struct trace, tool); | 1748 | struct trace *trace = container_of(tool, struct trace, tool); |
1571 | int err = 0; | 1749 | int err = 0; |
1572 | 1750 | ||
1573 | tracepoint_handler handler = evsel->handler.func; | 1751 | tracepoint_handler handler = evsel->handler; |
1574 | 1752 | ||
1575 | if (skip_sample(trace, sample)) | 1753 | if (skip_sample(trace, sample)) |
1576 | return 0; | 1754 | return 0; |
@@ -1656,7 +1834,7 @@ static void perf_evlist__add_vfs_getname(struct perf_evlist *evlist) | |||
1656 | return; | 1834 | return; |
1657 | } | 1835 | } |
1658 | 1836 | ||
1659 | evsel->handler.func = trace__vfs_getname; | 1837 | evsel->handler = trace__vfs_getname; |
1660 | perf_evlist__add(evlist, evsel); | 1838 | perf_evlist__add(evlist, evsel); |
1661 | } | 1839 | } |
1662 | 1840 | ||
@@ -1675,8 +1853,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) | |||
1675 | goto out; | 1853 | goto out; |
1676 | } | 1854 | } |
1677 | 1855 | ||
1678 | if (perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_enter", trace__sys_enter) || | 1856 | if (perf_evlist__add_syscall_newtp(evlist, trace__sys_enter, trace__sys_exit)) |
1679 | perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_exit", trace__sys_exit)) | ||
1680 | goto out_error_tp; | 1857 | goto out_error_tp; |
1681 | 1858 | ||
1682 | perf_evlist__add_vfs_getname(evlist); | 1859 | perf_evlist__add_vfs_getname(evlist); |
@@ -1768,7 +1945,7 @@ again: | |||
1768 | goto next_event; | 1945 | goto next_event; |
1769 | } | 1946 | } |
1770 | 1947 | ||
1771 | handler = evsel->handler.func; | 1948 | handler = evsel->handler; |
1772 | handler(trace, evsel, &sample); | 1949 | handler(trace, evsel, &sample); |
1773 | next_event: | 1950 | next_event: |
1774 | perf_evlist__mmap_consume(evlist, i); | 1951 | perf_evlist__mmap_consume(evlist, i); |
diff --git a/tools/perf/util/PERF-VERSION-GEN b/tools/perf/util/PERF-VERSION-GEN index ce7a804b2951..39f17507578d 100755 --- a/tools/perf/util/PERF-VERSION-GEN +++ b/tools/perf/util/PERF-VERSION-GEN | |||
@@ -19,6 +19,9 @@ if test -d ../../.git -o -f ../../.git | |||
19 | then | 19 | then |
20 | TAG=$(git describe --abbrev=0 --match "v[0-9].[0-9]*" 2>/dev/null ) | 20 | TAG=$(git describe --abbrev=0 --match "v[0-9].[0-9]*" 2>/dev/null ) |
21 | CID=$(git log -1 --abbrev=4 --pretty=format:"%h" 2>/dev/null) && CID="-g$CID" | 21 | CID=$(git log -1 --abbrev=4 --pretty=format:"%h" 2>/dev/null) && CID="-g$CID" |
22 | elif test -f ../../PERF-VERSION-FILE | ||
23 | then | ||
24 | TAG=$(cut -d' ' -f3 ../../PERF-VERSION-FILE | sed -e 's/\"//g') | ||
22 | fi | 25 | fi |
23 | if test -z "$TAG" | 26 | if test -z "$TAG" |
24 | then | 27 | then |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 1c173ccb0ef2..b939221efd8d 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -255,7 +255,7 @@ int perf_evlist__add_newtp(struct perf_evlist *evlist, | |||
255 | if (evsel == NULL) | 255 | if (evsel == NULL) |
256 | return -1; | 256 | return -1; |
257 | 257 | ||
258 | evsel->handler.func = handler; | 258 | evsel->handler = handler; |
259 | perf_evlist__add(evlist, evsel); | 259 | perf_evlist__add(evlist, evsel); |
260 | return 0; | 260 | return 0; |
261 | } | 261 | } |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 5aa68cddc7d9..64ec8e1a7a28 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -74,10 +74,7 @@ struct perf_evsel { | |||
74 | off_t id_offset; | 74 | off_t id_offset; |
75 | }; | 75 | }; |
76 | struct cgroup_sel *cgrp; | 76 | struct cgroup_sel *cgrp; |
77 | struct { | 77 | void *handler; |
78 | void *func; | ||
79 | void *data; | ||
80 | } handler; | ||
81 | struct cpu_map *cpus; | 78 | struct cpu_map *cpus; |
82 | unsigned int sample_size; | 79 | unsigned int sample_size; |
83 | int id_pos; | 80 | int id_pos; |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 0ce46943d627..f36d24a02445 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -1650,9 +1650,9 @@ int __perf_session__set_tracepoints_handlers(struct perf_session *session, | |||
1650 | continue; | 1650 | continue; |
1651 | 1651 | ||
1652 | err = -EEXIST; | 1652 | err = -EEXIST; |
1653 | if (evsel->handler.func != NULL) | 1653 | if (evsel->handler != NULL) |
1654 | goto out; | 1654 | goto out; |
1655 | evsel->handler.func = assocs[i].handler; | 1655 | evsel->handler = assocs[i].handler; |
1656 | } | 1656 | } |
1657 | 1657 | ||
1658 | err = 0; | 1658 | err = 0; |
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index f4cc147e0220..43e5ff42a609 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h | |||
@@ -22,7 +22,6 @@ | |||
22 | #include "parse-events.h" | 22 | #include "parse-events.h" |
23 | 23 | ||
24 | #include "thread.h" | 24 | #include "thread.h" |
25 | #include "sort.h" | ||
26 | 25 | ||
27 | extern regex_t parent_regex; | 26 | extern regex_t parent_regex; |
28 | extern const char *sort_order; | 27 | extern const char *sort_order; |