aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2013-11-07 10:24:57 -0500
committerIngo Molnar <mingo@kernel.org>2013-11-07 10:24:57 -0500
commit4d9218daae2b00379b2bb81eaf4fe5143f372db1 (patch)
tree575efccf53ea7ced32e2896f8d2ed491e4673471
parent8a4d0b56b031455adcbe4a9383c3b497456fcfac (diff)
parent8ce000e83848578a621d64eccdc88bd34c2fc70c (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/Makefile4
-rw-r--r--tools/perf/builtin-inject.c10
-rw-r--r--tools/perf/builtin-kmem.c4
-rw-r--r--tools/perf/builtin-lock.c4
-rw-r--r--tools/perf/builtin-record.c48
-rw-r--r--tools/perf/builtin-sched.c4
-rw-r--r--tools/perf/builtin-timechart.c4
-rw-r--r--tools/perf/builtin-trace.c205
-rwxr-xr-xtools/perf/util/PERF-VERSION-GEN3
-rw-r--r--tools/perf/util/evlist.c2
-rw-r--r--tools/perf/util/evsel.h5
-rw-r--r--tools/perf/util/session.c4
-rw-r--r--tools/perf/util/sort.h1
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; \
116mkdir -p $(perf-tar); \ 116mkdir -p $(perf-tar); \
117git --git-dir=$(srctree)/.git rev-parse HEAD > $(perf-tar)/HEAD; \ 117git --git-dir=$(srctree)/.git rev-parse HEAD > $(perf-tar)/HEAD; \
118tar rf $(perf-tar).tar $(perf-tar)/HEAD; \ 118(cd $(srctree)/tools/perf; \
119util/PERF-VERSION-GEN ../../$(perf-tar)/ 2>/dev/null); \
120tar rf $(perf-tar).tar $(perf-tar)/HEAD $(perf-tar)/PERF-VERSION-FILE; \
119rm -r $(perf-tar); \ 121rm -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
80static void advance_output(struct perf_record *rec, size_t size)
81{
82 rec->bytes_written += size;
83}
84
85static int write_output(struct perf_record *rec, void *buf, size_t size) 79static 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
340static 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
345static int __cmd_record(struct perf_record *rec, int argc, const char **argv) 359static 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
38struct 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) \
47static 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
52TP_UINT_FIELD(8);
53TP_UINT_FIELD(16);
54TP_UINT_FIELD(32);
55TP_UINT_FIELD(64);
56
57#define TP_UINT_FIELD__SWAPPED(bits) \
58static 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
64TP_UINT_FIELD__SWAPPED(16);
65TP_UINT_FIELD__SWAPPED(32);
66TP_UINT_FIELD__SWAPPED(64);
67
68static 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
94static void *tp_field__ptr(struct tp_field *field, struct perf_sample *sample)
95{
96 return sample->raw_data + field->offset;
97}
98
99static 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
106struct syscall_tp {
107 struct tp_field id;
108 union {
109 struct tp_field args, ret;
110 };
111};
112
113static 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
129static 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
145static 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
152static 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
171out_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
184static 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;
210out:
211 return ret;
212
213out_delete_sys_exit:
214 perf_evsel__delete_priv(sys_exit);
215out_delete_sys_enter:
216 perf_evsel__delete_priv(sys_enter);
217 goto out;
218}
219
220
38struct syscall_arg { 221struct 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);
1773next_event: 1950next_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
19then 19then
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"
22elif test -f ../../PERF-VERSION-FILE
23then
24 TAG=$(cut -d' ' -f3 ../../PERF-VERSION-FILE | sed -e 's/\"//g')
22fi 25fi
23if test -z "$TAG" 26if test -z "$TAG"
24then 27then
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
27extern regex_t parent_regex; 26extern regex_t parent_regex;
28extern const char *sort_order; 27extern const char *sort_order;