Commit da3789628f88684d3f0fb4e6a6bc086c395ac3cb
1 parent
7a25b2d32b
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
perf tools: Stop using a global trace events description list
The pevent thing is per perf.data file, so I made it stop being static and become a perf_session member, so tools processing perf.data files use perf_session and _there_ we read the trace events description into session->pevent and then change everywhere to stop using that single global pevent variable and use the per session one. Note that it _doesn't_ fall backs to trace__event_id, as we're not interested at all in what is present in the /sys/kernel/debug/tracing/events in the workstation doing the analysis, just in what is in the perf.data file. This patch also introduces perf_session__set_tracepoints_handlers that is the perf perf.data/session way to associate handlers to tracepoint events by resolving their IDs using the events descriptions stored in a perf.data file. Make 'perf sched' use it. Reported-by: Dmitry Antipov <dmitry.antipov@linaro.org> Tested-by: Dmitry Antipov <dmitry.antipov@linaro.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: linaro-dev@lists.linaro.org Cc: patches@linaro.org Link: http://lkml.kernel.org/r/20120625232016.GA28525@infradead.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Showing 15 changed files with 314 additions and 182 deletions Side-by-side Diff
- tools/perf/builtin-kmem.c
- tools/perf/builtin-lock.c
- tools/perf/builtin-sched.c
- tools/perf/builtin-script.c
- tools/perf/util/evlist.c
- tools/perf/util/evlist.h
- tools/perf/util/header.c
- tools/perf/util/scripting-engines/trace-event-perl.c
- tools/perf/util/scripting-engines/trace-event-python.c
- tools/perf/util/session.c
- tools/perf/util/session.h
- tools/perf/util/trace-event-parse.c
- tools/perf/util/trace-event-read.c
- tools/perf/util/trace-event-scripting.c
- tools/perf/util/trace-event.h
tools/perf/builtin-kmem.c
... | ... | @@ -57,6 +57,11 @@ |
57 | 57 | |
58 | 58 | #define PATH_SYS_NODE "/sys/devices/system/node" |
59 | 59 | |
60 | +struct perf_kmem { | |
61 | + struct perf_tool tool; | |
62 | + struct perf_session *session; | |
63 | +}; | |
64 | + | |
60 | 65 | static void init_cpunode_map(void) |
61 | 66 | { |
62 | 67 | FILE *fp; |
63 | 68 | |
64 | 69 | |
... | ... | @@ -278,14 +283,16 @@ |
278 | 283 | s_alloc->alloc_cpu = -1; |
279 | 284 | } |
280 | 285 | |
281 | -static void process_raw_event(union perf_event *raw_event __used, void *data, | |
286 | +static void process_raw_event(struct perf_tool *tool, | |
287 | + union perf_event *raw_event __used, void *data, | |
282 | 288 | int cpu, u64 timestamp, struct thread *thread) |
283 | 289 | { |
290 | + struct perf_kmem *kmem = container_of(tool, struct perf_kmem, tool); | |
284 | 291 | struct event_format *event; |
285 | 292 | int type; |
286 | 293 | |
287 | - type = trace_parse_common_type(data); | |
288 | - event = trace_find_event(type); | |
294 | + type = trace_parse_common_type(kmem->session->pevent, data); | |
295 | + event = pevent_find_event(kmem->session->pevent, type); | |
289 | 296 | |
290 | 297 | if (!strcmp(event->name, "kmalloc") || |
291 | 298 | !strcmp(event->name, "kmem_cache_alloc")) { |
... | ... | @@ -306,7 +313,7 @@ |
306 | 313 | } |
307 | 314 | } |
308 | 315 | |
309 | -static int process_sample_event(struct perf_tool *tool __used, | |
316 | +static int process_sample_event(struct perf_tool *tool, | |
310 | 317 | union perf_event *event, |
311 | 318 | struct perf_sample *sample, |
312 | 319 | struct perf_evsel *evsel __used, |
313 | 320 | |
... | ... | @@ -322,16 +329,18 @@ |
322 | 329 | |
323 | 330 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
324 | 331 | |
325 | - process_raw_event(event, sample->raw_data, sample->cpu, | |
332 | + process_raw_event(tool, event, sample->raw_data, sample->cpu, | |
326 | 333 | sample->time, thread); |
327 | 334 | |
328 | 335 | return 0; |
329 | 336 | } |
330 | 337 | |
331 | -static struct perf_tool perf_kmem = { | |
332 | - .sample = process_sample_event, | |
333 | - .comm = perf_event__process_comm, | |
334 | - .ordered_samples = true, | |
338 | +static struct perf_kmem perf_kmem = { | |
339 | + .tool = { | |
340 | + .sample = process_sample_event, | |
341 | + .comm = perf_event__process_comm, | |
342 | + .ordered_samples = true, | |
343 | + }, | |
335 | 344 | }; |
336 | 345 | |
337 | 346 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) |
338 | 347 | |
... | ... | @@ -486,11 +495,15 @@ |
486 | 495 | static int __cmd_kmem(void) |
487 | 496 | { |
488 | 497 | int err = -EINVAL; |
489 | - struct perf_session *session = perf_session__new(input_name, O_RDONLY, | |
490 | - 0, false, &perf_kmem); | |
498 | + struct perf_session *session; | |
499 | + | |
500 | + session = perf_session__new(input_name, O_RDONLY, 0, false, | |
501 | + &perf_kmem.tool); | |
491 | 502 | if (session == NULL) |
492 | 503 | return -ENOMEM; |
493 | 504 | |
505 | + perf_kmem.session = session; | |
506 | + | |
494 | 507 | if (perf_session__create_kernel_maps(session) < 0) |
495 | 508 | goto out_delete; |
496 | 509 | |
... | ... | @@ -498,7 +511,7 @@ |
498 | 511 | goto out_delete; |
499 | 512 | |
500 | 513 | setup_pager(); |
501 | - err = perf_session__process_events(session, &perf_kmem); | |
514 | + err = perf_session__process_events(session, &perf_kmem.tool); | |
502 | 515 | if (err != 0) |
503 | 516 | goto out_delete; |
504 | 517 | sort_result(); |
tools/perf/builtin-lock.c
... | ... | @@ -724,8 +724,8 @@ |
724 | 724 | struct event_format *event; |
725 | 725 | int type; |
726 | 726 | |
727 | - type = trace_parse_common_type(data); | |
728 | - event = trace_find_event(type); | |
727 | + type = trace_parse_common_type(session->pevent, data); | |
728 | + event = pevent_find_event(session->pevent, type); | |
729 | 729 | |
730 | 730 | if (!strcmp(event->name, "lock_acquire")) |
731 | 731 | process_lock_acquire_event(data, event, cpu, timestamp, thread); |
tools/perf/builtin-sched.c
... | ... | @@ -43,6 +43,11 @@ |
43 | 43 | |
44 | 44 | static unsigned long nr_tasks; |
45 | 45 | |
46 | +struct perf_sched { | |
47 | + struct perf_tool tool; | |
48 | + struct perf_session *session; | |
49 | +}; | |
50 | + | |
46 | 51 | struct sched_atom; |
47 | 52 | |
48 | 53 | struct task_desc { |
... | ... | @@ -1597,6 +1602,8 @@ |
1597 | 1602 | struct perf_evsel *evsel, |
1598 | 1603 | struct machine *machine) |
1599 | 1604 | { |
1605 | + struct perf_sched *sched = container_of(tool, struct perf_sched, tool); | |
1606 | + struct pevent *pevent = sched->session->pevent; | |
1600 | 1607 | struct thread *thread = machine__findnew_thread(machine, sample->pid); |
1601 | 1608 | |
1602 | 1609 | if (thread == NULL) { |
... | ... | @@ -1612,7 +1619,8 @@ |
1612 | 1619 | tracepoint_handler f = evsel->handler.func; |
1613 | 1620 | |
1614 | 1621 | if (evsel->handler.data == NULL) |
1615 | - evsel->handler.data = trace_find_event(evsel->attr.config); | |
1622 | + evsel->handler.data = pevent_find_event(pevent, | |
1623 | + evsel->attr.config); | |
1616 | 1624 | |
1617 | 1625 | f(tool, evsel->handler.data, sample, machine, thread); |
1618 | 1626 | } |
... | ... | @@ -1620,12 +1628,14 @@ |
1620 | 1628 | return 0; |
1621 | 1629 | } |
1622 | 1630 | |
1623 | -static struct perf_tool perf_sched = { | |
1624 | - .sample = perf_sched__process_tracepoint_sample, | |
1625 | - .comm = perf_event__process_comm, | |
1626 | - .lost = perf_event__process_lost, | |
1627 | - .fork = perf_event__process_task, | |
1628 | - .ordered_samples = true, | |
1631 | +static struct perf_sched perf_sched = { | |
1632 | + .tool = { | |
1633 | + .sample = perf_sched__process_tracepoint_sample, | |
1634 | + .comm = perf_event__process_comm, | |
1635 | + .lost = perf_event__process_lost, | |
1636 | + .fork = perf_event__process_task, | |
1637 | + .ordered_samples = true, | |
1638 | + }, | |
1629 | 1639 | }; |
1630 | 1640 | |
1631 | 1641 | static void read_events(bool destroy, struct perf_session **psession) |
1632 | 1642 | |
1633 | 1643 | |
... | ... | @@ -1640,16 +1650,20 @@ |
1640 | 1650 | { "sched:sched_process_exit", process_sched_exit_event, }, |
1641 | 1651 | { "sched:sched_migrate_task", process_sched_migrate_task_event, }, |
1642 | 1652 | }; |
1643 | - struct perf_session *session = perf_session__new(input_name, O_RDONLY, | |
1644 | - 0, false, &perf_sched); | |
1653 | + struct perf_session *session; | |
1654 | + | |
1655 | + session = perf_session__new(input_name, O_RDONLY, 0, false, | |
1656 | + &perf_sched.tool); | |
1645 | 1657 | if (session == NULL) |
1646 | 1658 | die("No Memory"); |
1647 | 1659 | |
1648 | - err = perf_evlist__set_tracepoints_handlers_array(session->evlist, handlers); | |
1660 | + perf_sched.session = session; | |
1661 | + | |
1662 | + err = perf_session__set_tracepoints_handlers(session, handlers); | |
1649 | 1663 | assert(err == 0); |
1650 | 1664 | |
1651 | 1665 | if (perf_session__has_traces(session, "record -R")) { |
1652 | - err = perf_session__process_events(session, &perf_sched); | |
1666 | + err = perf_session__process_events(session, &perf_sched.tool); | |
1653 | 1667 | if (err) |
1654 | 1668 | die("Failed to process events, error %d", err); |
1655 | 1669 |
tools/perf/builtin-script.c
... | ... | @@ -28,6 +28,11 @@ |
28 | 28 | static const char *cpu_list; |
29 | 29 | static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS); |
30 | 30 | |
31 | +struct perf_script { | |
32 | + struct perf_tool tool; | |
33 | + struct perf_session *session; | |
34 | +}; | |
35 | + | |
31 | 36 | enum perf_output_field { |
32 | 37 | PERF_OUTPUT_COMM = 1U << 0, |
33 | 38 | PERF_OUTPUT_TID = 1U << 1, |
... | ... | @@ -257,7 +262,8 @@ |
257 | 262 | return 0; |
258 | 263 | } |
259 | 264 | |
260 | -static void print_sample_start(struct perf_sample *sample, | |
265 | +static void print_sample_start(struct pevent *pevent, | |
266 | + struct perf_sample *sample, | |
261 | 267 | struct thread *thread, |
262 | 268 | struct perf_evsel *evsel) |
263 | 269 | { |
... | ... | @@ -302,8 +308,14 @@ |
302 | 308 | |
303 | 309 | if (PRINT_FIELD(EVNAME)) { |
304 | 310 | if (attr->type == PERF_TYPE_TRACEPOINT) { |
305 | - type = trace_parse_common_type(sample->raw_data); | |
306 | - event = trace_find_event(type); | |
311 | + /* | |
312 | + * XXX Do we really need this here? | |
313 | + * perf_evlist__set_tracepoint_names should have done | |
314 | + * this already | |
315 | + */ | |
316 | + type = trace_parse_common_type(pevent, | |
317 | + sample->raw_data); | |
318 | + event = pevent_find_event(pevent, type); | |
307 | 319 | if (event) |
308 | 320 | evname = event->name; |
309 | 321 | } else |
... | ... | @@ -404,6 +416,7 @@ |
404 | 416 | } |
405 | 417 | |
406 | 418 | static void process_event(union perf_event *event __unused, |
419 | + struct pevent *pevent, | |
407 | 420 | struct perf_sample *sample, |
408 | 421 | struct perf_evsel *evsel, |
409 | 422 | struct machine *machine, |
... | ... | @@ -414,7 +427,7 @@ |
414 | 427 | if (output[attr->type].fields == 0) |
415 | 428 | return; |
416 | 429 | |
417 | - print_sample_start(sample, thread, evsel); | |
430 | + print_sample_start(pevent, sample, thread, evsel); | |
418 | 431 | |
419 | 432 | if (is_bts_event(attr)) { |
420 | 433 | print_sample_bts(event, sample, evsel, machine, thread); |
... | ... | @@ -422,7 +435,7 @@ |
422 | 435 | } |
423 | 436 | |
424 | 437 | if (PRINT_FIELD(TRACE)) |
425 | - print_trace_event(sample->cpu, sample->raw_data, | |
438 | + print_trace_event(pevent, sample->cpu, sample->raw_data, | |
426 | 439 | sample->raw_size); |
427 | 440 | |
428 | 441 | if (PRINT_FIELD(ADDR)) |
... | ... | @@ -453,7 +466,8 @@ |
453 | 466 | return 0; |
454 | 467 | } |
455 | 468 | |
456 | -static int default_generate_script(const char *outfile __unused) | |
469 | +static int default_generate_script(struct pevent *pevent __unused, | |
470 | + const char *outfile __unused) | |
457 | 471 | { |
458 | 472 | return 0; |
459 | 473 | } |
... | ... | @@ -491,6 +505,7 @@ |
491 | 505 | struct machine *machine) |
492 | 506 | { |
493 | 507 | struct addr_location al; |
508 | + struct perf_script *scr = container_of(tool, struct perf_script, tool); | |
494 | 509 | struct thread *thread = machine__findnew_thread(machine, event->ip.tid); |
495 | 510 | |
496 | 511 | if (thread == NULL) { |
497 | 512 | |
... | ... | @@ -522,24 +537,27 @@ |
522 | 537 | if (cpu_list && !test_bit(sample->cpu, cpu_bitmap)) |
523 | 538 | return 0; |
524 | 539 | |
525 | - scripting_ops->process_event(event, sample, evsel, machine, thread); | |
540 | + scripting_ops->process_event(event, scr->session->pevent, | |
541 | + sample, evsel, machine, thread); | |
526 | 542 | |
527 | 543 | evsel->hists.stats.total_period += sample->period; |
528 | 544 | return 0; |
529 | 545 | } |
530 | 546 | |
531 | -static struct perf_tool perf_script = { | |
532 | - .sample = process_sample_event, | |
533 | - .mmap = perf_event__process_mmap, | |
534 | - .comm = perf_event__process_comm, | |
535 | - .exit = perf_event__process_task, | |
536 | - .fork = perf_event__process_task, | |
537 | - .attr = perf_event__process_attr, | |
538 | - .event_type = perf_event__process_event_type, | |
539 | - .tracing_data = perf_event__process_tracing_data, | |
540 | - .build_id = perf_event__process_build_id, | |
541 | - .ordered_samples = true, | |
542 | - .ordering_requires_timestamps = true, | |
547 | +static struct perf_script perf_script = { | |
548 | + .tool = { | |
549 | + .sample = process_sample_event, | |
550 | + .mmap = perf_event__process_mmap, | |
551 | + .comm = perf_event__process_comm, | |
552 | + .exit = perf_event__process_task, | |
553 | + .fork = perf_event__process_task, | |
554 | + .attr = perf_event__process_attr, | |
555 | + .event_type = perf_event__process_event_type, | |
556 | + .tracing_data = perf_event__process_tracing_data, | |
557 | + .build_id = perf_event__process_build_id, | |
558 | + .ordered_samples = true, | |
559 | + .ordering_requires_timestamps = true, | |
560 | + }, | |
543 | 561 | }; |
544 | 562 | |
545 | 563 | extern volatile int session_done; |
... | ... | @@ -555,7 +573,7 @@ |
555 | 573 | |
556 | 574 | signal(SIGINT, sig_handler); |
557 | 575 | |
558 | - ret = perf_session__process_events(session, &perf_script); | |
576 | + ret = perf_session__process_events(session, &perf_script.tool); | |
559 | 577 | |
560 | 578 | if (debug_mode) |
561 | 579 | pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered); |
562 | 580 | |
... | ... | @@ -1337,10 +1355,13 @@ |
1337 | 1355 | if (!script_name) |
1338 | 1356 | setup_pager(); |
1339 | 1357 | |
1340 | - session = perf_session__new(input_name, O_RDONLY, 0, false, &perf_script); | |
1358 | + session = perf_session__new(input_name, O_RDONLY, 0, false, | |
1359 | + &perf_script.tool); | |
1341 | 1360 | if (session == NULL) |
1342 | 1361 | return -ENOMEM; |
1343 | 1362 | |
1363 | + perf_script.session = session; | |
1364 | + | |
1344 | 1365 | if (cpu_list) { |
1345 | 1366 | if (perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap)) |
1346 | 1367 | return -1; |
... | ... | @@ -1386,7 +1407,8 @@ |
1386 | 1407 | return -1; |
1387 | 1408 | } |
1388 | 1409 | |
1389 | - err = scripting_ops->generate_script("perf-script"); | |
1410 | + err = scripting_ops->generate_script(session->pevent, | |
1411 | + "perf-script"); | |
1390 | 1412 | goto out; |
1391 | 1413 | } |
1392 | 1414 |
tools/perf/util/evlist.c
... | ... | @@ -224,8 +224,8 @@ |
224 | 224 | return err; |
225 | 225 | } |
226 | 226 | |
227 | -static struct perf_evsel * | |
228 | - perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) | |
227 | +struct perf_evsel * | |
228 | +perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) | |
229 | 229 | { |
230 | 230 | struct perf_evsel *evsel; |
231 | 231 |
tools/perf/util/evlist.h
... | ... | @@ -73,6 +73,9 @@ |
73 | 73 | #define perf_evlist__set_tracepoints_handlers_array(evlist, array) \ |
74 | 74 | perf_evlist__set_tracepoints_handlers(evlist, array, ARRAY_SIZE(array)) |
75 | 75 | |
76 | +struct perf_evsel * | |
77 | +perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id); | |
78 | + | |
76 | 79 | void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel, |
77 | 80 | int cpu, int thread, u64 id); |
78 | 81 |
tools/perf/util/header.c
... | ... | @@ -1474,15 +1474,15 @@ |
1474 | 1474 | |
1475 | 1475 | static int process_tracing_data(struct perf_file_section *section __unused, |
1476 | 1476 | struct perf_header *ph __unused, |
1477 | - int feat __unused, int fd) | |
1477 | + int feat __unused, int fd, void *data) | |
1478 | 1478 | { |
1479 | - trace_report(fd, false); | |
1479 | + trace_report(fd, data, false); | |
1480 | 1480 | return 0; |
1481 | 1481 | } |
1482 | 1482 | |
1483 | 1483 | static int process_build_id(struct perf_file_section *section, |
1484 | 1484 | struct perf_header *ph, |
1485 | - int feat __unused, int fd) | |
1485 | + int feat __unused, int fd, void *data __used) | |
1486 | 1486 | { |
1487 | 1487 | if (perf_header__read_build_ids(ph, fd, section->offset, section->size)) |
1488 | 1488 | pr_debug("Failed to read buildids, continuing...\n"); |
... | ... | @@ -1493,7 +1493,7 @@ |
1493 | 1493 | int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist); |
1494 | 1494 | void (*print)(struct perf_header *h, int fd, FILE *fp); |
1495 | 1495 | int (*process)(struct perf_file_section *section, |
1496 | - struct perf_header *h, int feat, int fd); | |
1496 | + struct perf_header *h, int feat, int fd, void *data); | |
1497 | 1497 | const char *name; |
1498 | 1498 | bool full_only; |
1499 | 1499 | }; |
... | ... | @@ -1988,7 +1988,7 @@ |
1988 | 1988 | |
1989 | 1989 | static int perf_file_section__process(struct perf_file_section *section, |
1990 | 1990 | struct perf_header *ph, |
1991 | - int feat, int fd, void *data __used) | |
1991 | + int feat, int fd, void *data) | |
1992 | 1992 | { |
1993 | 1993 | if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { |
1994 | 1994 | pr_debug("Failed to lseek to %" PRIu64 " offset for feature " |
... | ... | @@ -2004,7 +2004,7 @@ |
2004 | 2004 | if (!feat_ops[feat].process) |
2005 | 2005 | return 0; |
2006 | 2006 | |
2007 | - return feat_ops[feat].process(section, ph, feat, fd); | |
2007 | + return feat_ops[feat].process(section, ph, feat, fd, data); | |
2008 | 2008 | } |
2009 | 2009 | |
2010 | 2010 | static int perf_file_header__read_pipe(struct perf_pipe_file_header *header, |
2011 | 2011 | |
... | ... | @@ -2093,9 +2093,11 @@ |
2093 | 2093 | return ret <= 0 ? -1 : 0; |
2094 | 2094 | } |
2095 | 2095 | |
2096 | -static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel) | |
2096 | +static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel, | |
2097 | + struct pevent *pevent) | |
2097 | 2098 | { |
2098 | - struct event_format *event = trace_find_event(evsel->attr.config); | |
2099 | + struct event_format *event = pevent_find_event(pevent, | |
2100 | + evsel->attr.config); | |
2099 | 2101 | char bf[128]; |
2100 | 2102 | |
2101 | 2103 | if (event == NULL) |
2102 | 2104 | |
... | ... | @@ -2109,13 +2111,14 @@ |
2109 | 2111 | return 0; |
2110 | 2112 | } |
2111 | 2113 | |
2112 | -static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist) | |
2114 | +static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist, | |
2115 | + struct pevent *pevent) | |
2113 | 2116 | { |
2114 | 2117 | struct perf_evsel *pos; |
2115 | 2118 | |
2116 | 2119 | list_for_each_entry(pos, &evlist->entries, node) { |
2117 | 2120 | if (pos->attr.type == PERF_TYPE_TRACEPOINT && |
2118 | - perf_evsel__set_tracepoint_name(pos)) | |
2121 | + perf_evsel__set_tracepoint_name(pos, pevent)) | |
2119 | 2122 | return -1; |
2120 | 2123 | } |
2121 | 2124 | |
2122 | 2125 | |
... | ... | @@ -2198,12 +2201,12 @@ |
2198 | 2201 | event_count = f_header.event_types.size / sizeof(struct perf_trace_event_type); |
2199 | 2202 | } |
2200 | 2203 | |
2201 | - perf_header__process_sections(header, fd, NULL, | |
2204 | + perf_header__process_sections(header, fd, &session->pevent, | |
2202 | 2205 | perf_file_section__process); |
2203 | 2206 | |
2204 | 2207 | lseek(fd, header->data_offset, SEEK_SET); |
2205 | 2208 | |
2206 | - if (perf_evlist__set_tracepoint_names(session->evlist)) | |
2209 | + if (perf_evlist__set_tracepoint_names(session->evlist, session->pevent)) | |
2207 | 2210 | goto out_delete_evlist; |
2208 | 2211 | |
2209 | 2212 | header->frozen = 1; |
... | ... | @@ -2419,8 +2422,8 @@ |
2419 | 2422 | lseek(session->fd, offset + sizeof(struct tracing_data_event), |
2420 | 2423 | SEEK_SET); |
2421 | 2424 | |
2422 | - size_read = trace_report(session->fd, session->repipe); | |
2423 | - | |
2425 | + size_read = trace_report(session->fd, &session->pevent, | |
2426 | + session->repipe); | |
2424 | 2427 | padding = ALIGN(size_read, sizeof(u64)) - size_read; |
2425 | 2428 | |
2426 | 2429 | if (read(session->fd, buf, padding) < 0) |
tools/perf/util/scripting-engines/trace-event-perl.c
... | ... | @@ -233,7 +233,8 @@ |
233 | 233 | define_event_symbols(event, ev_name, args->next); |
234 | 234 | } |
235 | 235 | |
236 | -static inline struct event_format *find_cache_event(int type) | |
236 | +static inline | |
237 | +struct event_format *find_cache_event(struct pevent *pevent, int type) | |
237 | 238 | { |
238 | 239 | static char ev_name[256]; |
239 | 240 | struct event_format *event; |
... | ... | @@ -241,7 +242,7 @@ |
241 | 242 | if (events[type]) |
242 | 243 | return events[type]; |
243 | 244 | |
244 | - events[type] = event = trace_find_event(type); | |
245 | + events[type] = event = pevent_find_event(pevent, type); | |
245 | 246 | if (!event) |
246 | 247 | return NULL; |
247 | 248 | |
... | ... | @@ -252,7 +253,8 @@ |
252 | 253 | return event; |
253 | 254 | } |
254 | 255 | |
255 | -static void perl_process_tracepoint(union perf_event *pevent __unused, | |
256 | +static void perl_process_tracepoint(union perf_event *perf_event __unused, | |
257 | + struct pevent *pevent, | |
256 | 258 | struct perf_sample *sample, |
257 | 259 | struct perf_evsel *evsel, |
258 | 260 | struct machine *machine __unused, |
259 | 261 | |
260 | 262 | |
... | ... | @@ -275,13 +277,13 @@ |
275 | 277 | if (evsel->attr.type != PERF_TYPE_TRACEPOINT) |
276 | 278 | return; |
277 | 279 | |
278 | - type = trace_parse_common_type(data); | |
280 | + type = trace_parse_common_type(pevent, data); | |
279 | 281 | |
280 | - event = find_cache_event(type); | |
282 | + event = find_cache_event(pevent, type); | |
281 | 283 | if (!event) |
282 | 284 | die("ug! no event found for type %d", type); |
283 | 285 | |
284 | - pid = trace_parse_common_pid(data); | |
286 | + pid = trace_parse_common_pid(pevent, data); | |
285 | 287 | |
286 | 288 | sprintf(handler, "%s::%s", event->system, event->name); |
287 | 289 | |
... | ... | @@ -314,7 +316,8 @@ |
314 | 316 | offset = field->offset; |
315 | 317 | XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0))); |
316 | 318 | } else { /* FIELD_IS_NUMERIC */ |
317 | - val = read_size(data + field->offset, field->size); | |
319 | + val = read_size(pevent, data + field->offset, | |
320 | + field->size); | |
318 | 321 | if (field->flags & FIELD_IS_SIGNED) { |
319 | 322 | XPUSHs(sv_2mortal(newSViv(val))); |
320 | 323 | } else { |
321 | 324 | |
... | ... | @@ -368,14 +371,15 @@ |
368 | 371 | LEAVE; |
369 | 372 | } |
370 | 373 | |
371 | -static void perl_process_event(union perf_event *pevent, | |
374 | +static void perl_process_event(union perf_event *event, | |
375 | + struct pevent *pevent, | |
372 | 376 | struct perf_sample *sample, |
373 | 377 | struct perf_evsel *evsel, |
374 | 378 | struct machine *machine, |
375 | 379 | struct thread *thread) |
376 | 380 | { |
377 | - perl_process_tracepoint(pevent, sample, evsel, machine, thread); | |
378 | - perl_process_event_generic(pevent, sample, evsel, machine, thread); | |
381 | + perl_process_tracepoint(event, pevent, sample, evsel, machine, thread); | |
382 | + perl_process_event_generic(event, sample, evsel, machine, thread); | |
379 | 383 | } |
380 | 384 | |
381 | 385 | static void run_start_sub(void) |
... | ... | @@ -448,7 +452,7 @@ |
448 | 452 | return 0; |
449 | 453 | } |
450 | 454 | |
451 | -static int perl_generate_script(const char *outfile) | |
455 | +static int perl_generate_script(struct pevent *pevent, const char *outfile) | |
452 | 456 | { |
453 | 457 | struct event_format *event = NULL; |
454 | 458 | struct format_field *f; |
... | ... | @@ -495,7 +499,7 @@ |
495 | 499 | fprintf(ofp, "sub trace_begin\n{\n\t# optional\n}\n\n"); |
496 | 500 | fprintf(ofp, "sub trace_end\n{\n\t# optional\n}\n\n"); |
497 | 501 | |
498 | - while ((event = trace_find_next_event(event))) { | |
502 | + while ((event = trace_find_next_event(pevent, event))) { | |
499 | 503 | fprintf(ofp, "sub %s::%s\n{\n", event->system, event->name); |
500 | 504 | fprintf(ofp, "\tmy ("); |
501 | 505 |
tools/perf/util/scripting-engines/trace-event-python.c
... | ... | @@ -190,7 +190,8 @@ |
190 | 190 | define_event_symbols(event, ev_name, args->next); |
191 | 191 | } |
192 | 192 | |
193 | -static inline struct event_format *find_cache_event(int type) | |
193 | +static inline | |
194 | +struct event_format *find_cache_event(struct pevent *pevent, int type) | |
194 | 195 | { |
195 | 196 | static char ev_name[256]; |
196 | 197 | struct event_format *event; |
... | ... | @@ -198,7 +199,7 @@ |
198 | 199 | if (events[type]) |
199 | 200 | return events[type]; |
200 | 201 | |
201 | - events[type] = event = trace_find_event(type); | |
202 | + events[type] = event = pevent_find_event(pevent, type); | |
202 | 203 | if (!event) |
203 | 204 | return NULL; |
204 | 205 | |
... | ... | @@ -209,7 +210,8 @@ |
209 | 210 | return event; |
210 | 211 | } |
211 | 212 | |
212 | -static void python_process_event(union perf_event *pevent __unused, | |
213 | +static void python_process_event(union perf_event *perf_event __unused, | |
214 | + struct pevent *pevent, | |
213 | 215 | struct perf_sample *sample, |
214 | 216 | struct perf_evsel *evsel __unused, |
215 | 217 | struct machine *machine __unused, |
216 | 218 | |
217 | 219 | |
... | ... | @@ -233,13 +235,13 @@ |
233 | 235 | if (!t) |
234 | 236 | Py_FatalError("couldn't create Python tuple"); |
235 | 237 | |
236 | - type = trace_parse_common_type(data); | |
238 | + type = trace_parse_common_type(pevent, data); | |
237 | 239 | |
238 | - event = find_cache_event(type); | |
240 | + event = find_cache_event(pevent, type); | |
239 | 241 | if (!event) |
240 | 242 | die("ug! no event found for type %d", type); |
241 | 243 | |
242 | - pid = trace_parse_common_pid(data); | |
244 | + pid = trace_parse_common_pid(pevent, data); | |
243 | 245 | |
244 | 246 | sprintf(handler_name, "%s__%s", event->system, event->name); |
245 | 247 | |
... | ... | @@ -284,7 +286,8 @@ |
284 | 286 | offset = field->offset; |
285 | 287 | obj = PyString_FromString((char *)data + offset); |
286 | 288 | } else { /* FIELD_IS_NUMERIC */ |
287 | - val = read_size(data + field->offset, field->size); | |
289 | + val = read_size(pevent, data + field->offset, | |
290 | + field->size); | |
288 | 291 | if (field->flags & FIELD_IS_SIGNED) { |
289 | 292 | if ((long long)val >= LONG_MIN && |
290 | 293 | (long long)val <= LONG_MAX) |
... | ... | @@ -438,7 +441,7 @@ |
438 | 441 | return err; |
439 | 442 | } |
440 | 443 | |
441 | -static int python_generate_script(const char *outfile) | |
444 | +static int python_generate_script(struct pevent *pevent, const char *outfile) | |
442 | 445 | { |
443 | 446 | struct event_format *event = NULL; |
444 | 447 | struct format_field *f; |
... | ... | @@ -487,7 +490,7 @@ |
487 | 490 | fprintf(ofp, "def trace_end():\n"); |
488 | 491 | fprintf(ofp, "\tprint \"in trace_end\"\n\n"); |
489 | 492 | |
490 | - while ((event = trace_find_next_event(event))) { | |
493 | + while ((event = trace_find_next_event(pevent, event))) { | |
491 | 494 | fprintf(ofp, "def %s__%s(", event->system, event->name); |
492 | 495 | fprintf(ofp, "event_name, "); |
493 | 496 | fprintf(ofp, "context, "); |
tools/perf/util/session.c
... | ... | @@ -14,6 +14,7 @@ |
14 | 14 | #include "sort.h" |
15 | 15 | #include "util.h" |
16 | 16 | #include "cpumap.h" |
17 | +#include "event-parse.h" | |
17 | 18 | |
18 | 19 | static int perf_session__open(struct perf_session *self, bool force) |
19 | 20 | { |
... | ... | @@ -1609,5 +1610,60 @@ |
1609 | 1610 | fprintf(fp, "# captured on: %s", ctime(&st.st_ctime)); |
1610 | 1611 | perf_header__fprintf_info(session, fp, full); |
1611 | 1612 | fprintf(fp, "# ========\n#\n"); |
1613 | +} | |
1614 | + | |
1615 | + | |
1616 | +int __perf_session__set_tracepoints_handlers(struct perf_session *session, | |
1617 | + const struct perf_evsel_str_handler *assocs, | |
1618 | + size_t nr_assocs) | |
1619 | +{ | |
1620 | + struct perf_evlist *evlist = session->evlist; | |
1621 | + struct event_format *format; | |
1622 | + struct perf_evsel *evsel; | |
1623 | + char *tracepoint, *name; | |
1624 | + size_t i; | |
1625 | + int err; | |
1626 | + | |
1627 | + for (i = 0; i < nr_assocs; i++) { | |
1628 | + err = -ENOMEM; | |
1629 | + tracepoint = strdup(assocs[i].name); | |
1630 | + if (tracepoint == NULL) | |
1631 | + goto out; | |
1632 | + | |
1633 | + err = -ENOENT; | |
1634 | + name = strchr(tracepoint, ':'); | |
1635 | + if (name == NULL) | |
1636 | + goto out_free; | |
1637 | + | |
1638 | + *name++ = '\0'; | |
1639 | + format = pevent_find_event_by_name(session->pevent, | |
1640 | + tracepoint, name); | |
1641 | + if (format == NULL) { | |
1642 | + /* | |
1643 | + * Adding a handler for an event not in the session, | |
1644 | + * just ignore it. | |
1645 | + */ | |
1646 | + goto next; | |
1647 | + } | |
1648 | + | |
1649 | + evsel = perf_evlist__find_tracepoint_by_id(evlist, format->id); | |
1650 | + if (evsel == NULL) | |
1651 | + goto next; | |
1652 | + | |
1653 | + err = -EEXIST; | |
1654 | + if (evsel->handler.func != NULL) | |
1655 | + goto out_free; | |
1656 | + evsel->handler.func = assocs[i].handler; | |
1657 | +next: | |
1658 | + free(tracepoint); | |
1659 | + } | |
1660 | + | |
1661 | + err = 0; | |
1662 | +out: | |
1663 | + return err; | |
1664 | + | |
1665 | +out_free: | |
1666 | + free(tracepoint); | |
1667 | + goto out; | |
1612 | 1668 | } |
tools/perf/util/session.h
... | ... | @@ -33,6 +33,7 @@ |
33 | 33 | struct machine host_machine; |
34 | 34 | struct rb_root machines; |
35 | 35 | struct perf_evlist *evlist; |
36 | + struct pevent *pevent; | |
36 | 37 | /* |
37 | 38 | * FIXME: Need to split this up further, we need global |
38 | 39 | * stats + per event stats. 'perf diff' also needs |
... | ... | @@ -158,5 +159,14 @@ |
158 | 159 | const char *cpu_list, unsigned long *cpu_bitmap); |
159 | 160 | |
160 | 161 | void perf_session__fprintf_info(struct perf_session *s, FILE *fp, bool full); |
162 | + | |
163 | +struct perf_evsel_str_handler; | |
164 | + | |
165 | +int __perf_session__set_tracepoints_handlers(struct perf_session *session, | |
166 | + const struct perf_evsel_str_handler *assocs, | |
167 | + size_t nr_assocs); | |
168 | + | |
169 | +#define perf_session__set_tracepoints_handlers(session, array) \ | |
170 | + __perf_session__set_tracepoints_handlers(session, array, ARRAY_SIZE(array)) | |
161 | 171 | #endif /* __PERF_SESSION_H */ |
tools/perf/util/trace-event-parse.c
... | ... | @@ -32,29 +32,25 @@ |
32 | 32 | int header_page_ts_size; |
33 | 33 | int header_page_data_offset; |
34 | 34 | |
35 | -struct pevent *perf_pevent; | |
36 | -static struct pevent *pevent; | |
37 | - | |
38 | 35 | bool latency_format; |
39 | 36 | |
40 | -int read_trace_init(int file_bigendian, int host_bigendian) | |
37 | +struct pevent *read_trace_init(int file_bigendian, int host_bigendian) | |
41 | 38 | { |
42 | - if (pevent) | |
43 | - return 0; | |
39 | + struct pevent *pevent = pevent_alloc(); | |
44 | 40 | |
45 | - perf_pevent = pevent_alloc(); | |
46 | - pevent = perf_pevent; | |
41 | + if (pevent != NULL) { | |
42 | + pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT); | |
43 | + pevent_set_file_bigendian(pevent, file_bigendian); | |
44 | + pevent_set_host_bigendian(pevent, host_bigendian); | |
45 | + } | |
47 | 46 | |
48 | - pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT); | |
49 | - pevent_set_file_bigendian(pevent, file_bigendian); | |
50 | - pevent_set_host_bigendian(pevent, host_bigendian); | |
51 | - | |
52 | - return 0; | |
47 | + return pevent; | |
53 | 48 | } |
54 | 49 | |
55 | 50 | static int get_common_field(struct scripting_context *context, |
56 | 51 | int *offset, int *size, const char *type) |
57 | 52 | { |
53 | + struct pevent *pevent = context->pevent; | |
58 | 54 | struct event_format *event; |
59 | 55 | struct format_field *field; |
60 | 56 | |
... | ... | @@ -150,7 +146,7 @@ |
150 | 146 | return data + field->offset; |
151 | 147 | } |
152 | 148 | |
153 | -int trace_parse_common_type(void *data) | |
149 | +int trace_parse_common_type(struct pevent *pevent, void *data) | |
154 | 150 | { |
155 | 151 | struct pevent_record record; |
156 | 152 | |
... | ... | @@ -158,7 +154,7 @@ |
158 | 154 | return pevent_data_type(pevent, &record); |
159 | 155 | } |
160 | 156 | |
161 | -int trace_parse_common_pid(void *data) | |
157 | +int trace_parse_common_pid(struct pevent *pevent, void *data) | |
162 | 158 | { |
163 | 159 | struct pevent_record record; |
164 | 160 | |
165 | 161 | |
166 | 162 | |
167 | 163 | |
168 | 164 | |
... | ... | @@ -166,27 +162,21 @@ |
166 | 162 | return pevent_data_pid(pevent, &record); |
167 | 163 | } |
168 | 164 | |
169 | -unsigned long long read_size(void *ptr, int size) | |
165 | +unsigned long long read_size(struct pevent *pevent, void *ptr, int size) | |
170 | 166 | { |
171 | 167 | return pevent_read_number(pevent, ptr, size); |
172 | 168 | } |
173 | 169 | |
174 | -struct event_format *trace_find_event(int type) | |
170 | +void print_trace_event(struct pevent *pevent, int cpu, void *data, int size) | |
175 | 171 | { |
176 | - return pevent_find_event(pevent, type); | |
177 | -} | |
178 | - | |
179 | - | |
180 | -void print_trace_event(int cpu, void *data, int size) | |
181 | -{ | |
182 | 172 | struct event_format *event; |
183 | 173 | struct pevent_record record; |
184 | 174 | struct trace_seq s; |
185 | 175 | int type; |
186 | 176 | |
187 | - type = trace_parse_common_type(data); | |
177 | + type = trace_parse_common_type(pevent, data); | |
188 | 178 | |
189 | - event = trace_find_event(type); | |
179 | + event = pevent_find_event(pevent, type); | |
190 | 180 | if (!event) { |
191 | 181 | warning("ug! no event found for type %d", type); |
192 | 182 | return; |
... | ... | @@ -203,8 +193,8 @@ |
203 | 193 | printf("\n"); |
204 | 194 | } |
205 | 195 | |
206 | -void print_event(int cpu, void *data, int size, unsigned long long nsecs, | |
207 | - char *comm) | |
196 | +void print_event(struct pevent *pevent, int cpu, void *data, int size, | |
197 | + unsigned long long nsecs, char *comm) | |
208 | 198 | { |
209 | 199 | struct pevent_record record; |
210 | 200 | struct trace_seq s; |
... | ... | @@ -227,7 +217,8 @@ |
227 | 217 | printf("\n"); |
228 | 218 | } |
229 | 219 | |
230 | -void parse_proc_kallsyms(char *file, unsigned int size __unused) | |
220 | +void parse_proc_kallsyms(struct pevent *pevent, | |
221 | + char *file, unsigned int size __unused) | |
231 | 222 | { |
232 | 223 | unsigned long long addr; |
233 | 224 | char *func; |
... | ... | @@ -258,7 +249,8 @@ |
258 | 249 | } |
259 | 250 | } |
260 | 251 | |
261 | -void parse_ftrace_printk(char *file, unsigned int size __unused) | |
252 | +void parse_ftrace_printk(struct pevent *pevent, | |
253 | + char *file, unsigned int size __unused) | |
262 | 254 | { |
263 | 255 | unsigned long long addr; |
264 | 256 | char *printk; |
265 | 257 | |
266 | 258 | |
... | ... | @@ -282,17 +274,19 @@ |
282 | 274 | } |
283 | 275 | } |
284 | 276 | |
285 | -int parse_ftrace_file(char *buf, unsigned long size) | |
277 | +int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size) | |
286 | 278 | { |
287 | 279 | return pevent_parse_event(pevent, buf, size, "ftrace"); |
288 | 280 | } |
289 | 281 | |
290 | -int parse_event_file(char *buf, unsigned long size, char *sys) | |
282 | +int parse_event_file(struct pevent *pevent, | |
283 | + char *buf, unsigned long size, char *sys) | |
291 | 284 | { |
292 | 285 | return pevent_parse_event(pevent, buf, size, sys); |
293 | 286 | } |
294 | 287 | |
295 | -struct event_format *trace_find_next_event(struct event_format *event) | |
288 | +struct event_format *trace_find_next_event(struct pevent *pevent, | |
289 | + struct event_format *event) | |
296 | 290 | { |
297 | 291 | static int idx; |
298 | 292 |
tools/perf/util/trace-event-read.c
... | ... | @@ -114,20 +114,20 @@ |
114 | 114 | }; |
115 | 115 | } |
116 | 116 | |
117 | -static unsigned int read4(void) | |
117 | +static unsigned int read4(struct pevent *pevent) | |
118 | 118 | { |
119 | 119 | unsigned int data; |
120 | 120 | |
121 | 121 | read_or_die(&data, 4); |
122 | - return __data2host4(perf_pevent, data); | |
122 | + return __data2host4(pevent, data); | |
123 | 123 | } |
124 | 124 | |
125 | -static unsigned long long read8(void) | |
125 | +static unsigned long long read8(struct pevent *pevent) | |
126 | 126 | { |
127 | 127 | unsigned long long data; |
128 | 128 | |
129 | 129 | read_or_die(&data, 8); |
130 | - return __data2host8(perf_pevent, data); | |
130 | + return __data2host8(pevent, data); | |
131 | 131 | } |
132 | 132 | |
133 | 133 | static char *read_string(void) |
134 | 134 | |
... | ... | @@ -168,12 +168,12 @@ |
168 | 168 | return str; |
169 | 169 | } |
170 | 170 | |
171 | -static void read_proc_kallsyms(void) | |
171 | +static void read_proc_kallsyms(struct pevent *pevent) | |
172 | 172 | { |
173 | 173 | unsigned int size; |
174 | 174 | char *buf; |
175 | 175 | |
176 | - size = read4(); | |
176 | + size = read4(pevent); | |
177 | 177 | if (!size) |
178 | 178 | return; |
179 | 179 | |
180 | 180 | |
181 | 181 | |
182 | 182 | |
183 | 183 | |
... | ... | @@ -181,29 +181,29 @@ |
181 | 181 | read_or_die(buf, size); |
182 | 182 | buf[size] = '\0'; |
183 | 183 | |
184 | - parse_proc_kallsyms(buf, size); | |
184 | + parse_proc_kallsyms(pevent, buf, size); | |
185 | 185 | |
186 | 186 | free(buf); |
187 | 187 | } |
188 | 188 | |
189 | -static void read_ftrace_printk(void) | |
189 | +static void read_ftrace_printk(struct pevent *pevent) | |
190 | 190 | { |
191 | 191 | unsigned int size; |
192 | 192 | char *buf; |
193 | 193 | |
194 | - size = read4(); | |
194 | + size = read4(pevent); | |
195 | 195 | if (!size) |
196 | 196 | return; |
197 | 197 | |
198 | 198 | buf = malloc_or_die(size); |
199 | 199 | read_or_die(buf, size); |
200 | 200 | |
201 | - parse_ftrace_printk(buf, size); | |
201 | + parse_ftrace_printk(pevent, buf, size); | |
202 | 202 | |
203 | 203 | free(buf); |
204 | 204 | } |
205 | 205 | |
206 | -static void read_header_files(void) | |
206 | +static void read_header_files(struct pevent *pevent) | |
207 | 207 | { |
208 | 208 | unsigned long long size; |
209 | 209 | char *header_event; |
... | ... | @@ -214,7 +214,7 @@ |
214 | 214 | if (memcmp(buf, "header_page", 12) != 0) |
215 | 215 | die("did not read header page"); |
216 | 216 | |
217 | - size = read8(); | |
217 | + size = read8(pevent); | |
218 | 218 | skip(size); |
219 | 219 | |
220 | 220 | /* |
221 | 221 | |
222 | 222 | |
223 | 223 | |
224 | 224 | |
225 | 225 | |
226 | 226 | |
227 | 227 | |
228 | 228 | |
... | ... | @@ -227,47 +227,48 @@ |
227 | 227 | if (memcmp(buf, "header_event", 13) != 0) |
228 | 228 | die("did not read header event"); |
229 | 229 | |
230 | - size = read8(); | |
230 | + size = read8(pevent); | |
231 | 231 | header_event = malloc_or_die(size); |
232 | 232 | read_or_die(header_event, size); |
233 | 233 | free(header_event); |
234 | 234 | } |
235 | 235 | |
236 | -static void read_ftrace_file(unsigned long long size) | |
236 | +static void read_ftrace_file(struct pevent *pevent, unsigned long long size) | |
237 | 237 | { |
238 | 238 | char *buf; |
239 | 239 | |
240 | 240 | buf = malloc_or_die(size); |
241 | 241 | read_or_die(buf, size); |
242 | - parse_ftrace_file(buf, size); | |
242 | + parse_ftrace_file(pevent, buf, size); | |
243 | 243 | free(buf); |
244 | 244 | } |
245 | 245 | |
246 | -static void read_event_file(char *sys, unsigned long long size) | |
246 | +static void read_event_file(struct pevent *pevent, char *sys, | |
247 | + unsigned long long size) | |
247 | 248 | { |
248 | 249 | char *buf; |
249 | 250 | |
250 | 251 | buf = malloc_or_die(size); |
251 | 252 | read_or_die(buf, size); |
252 | - parse_event_file(buf, size, sys); | |
253 | + parse_event_file(pevent, buf, size, sys); | |
253 | 254 | free(buf); |
254 | 255 | } |
255 | 256 | |
256 | -static void read_ftrace_files(void) | |
257 | +static void read_ftrace_files(struct pevent *pevent) | |
257 | 258 | { |
258 | 259 | unsigned long long size; |
259 | 260 | int count; |
260 | 261 | int i; |
261 | 262 | |
262 | - count = read4(); | |
263 | + count = read4(pevent); | |
263 | 264 | |
264 | 265 | for (i = 0; i < count; i++) { |
265 | - size = read8(); | |
266 | - read_ftrace_file(size); | |
266 | + size = read8(pevent); | |
267 | + read_ftrace_file(pevent, size); | |
267 | 268 | } |
268 | 269 | } |
269 | 270 | |
270 | -static void read_event_files(void) | |
271 | +static void read_event_files(struct pevent *pevent) | |
271 | 272 | { |
272 | 273 | unsigned long long size; |
273 | 274 | char *sys; |
274 | 275 | |
275 | 276 | |
... | ... | @@ -275,15 +276,15 @@ |
275 | 276 | int count; |
276 | 277 | int i,x; |
277 | 278 | |
278 | - systems = read4(); | |
279 | + systems = read4(pevent); | |
279 | 280 | |
280 | 281 | for (i = 0; i < systems; i++) { |
281 | 282 | sys = read_string(); |
282 | 283 | |
283 | - count = read4(); | |
284 | + count = read4(pevent); | |
284 | 285 | for (x=0; x < count; x++) { |
285 | - size = read8(); | |
286 | - read_event_file(sys, size); | |
286 | + size = read8(pevent); | |
287 | + read_event_file(pevent, sys, size); | |
287 | 288 | } |
288 | 289 | } |
289 | 290 | } |
... | ... | @@ -377,7 +378,7 @@ |
377 | 378 | return (unsigned long)ptr - (unsigned long)cpu_data[cpu].page; |
378 | 379 | } |
379 | 380 | |
380 | -struct pevent_record *trace_peek_data(int cpu) | |
381 | +struct pevent_record *trace_peek_data(struct pevent *pevent, int cpu) | |
381 | 382 | { |
382 | 383 | struct pevent_record *data; |
383 | 384 | void *page = cpu_data[cpu].page; |
384 | 385 | |
385 | 386 | |
... | ... | @@ -399,15 +400,15 @@ |
399 | 400 | /* FIXME: handle header page */ |
400 | 401 | if (header_page_ts_size != 8) |
401 | 402 | die("expected a long long type for timestamp"); |
402 | - cpu_data[cpu].timestamp = data2host8(perf_pevent, ptr); | |
403 | + cpu_data[cpu].timestamp = data2host8(pevent, ptr); | |
403 | 404 | ptr += 8; |
404 | 405 | switch (header_page_size_size) { |
405 | 406 | case 4: |
406 | - cpu_data[cpu].page_size = data2host4(perf_pevent, ptr); | |
407 | + cpu_data[cpu].page_size = data2host4(pevent, ptr); | |
407 | 408 | ptr += 4; |
408 | 409 | break; |
409 | 410 | case 8: |
410 | - cpu_data[cpu].page_size = data2host8(perf_pevent, ptr); | |
411 | + cpu_data[cpu].page_size = data2host8(pevent, ptr); | |
411 | 412 | ptr += 8; |
412 | 413 | break; |
413 | 414 | default: |
414 | 415 | |
... | ... | @@ -421,10 +422,10 @@ |
421 | 422 | |
422 | 423 | if (idx >= cpu_data[cpu].page_size) { |
423 | 424 | get_next_page(cpu); |
424 | - return trace_peek_data(cpu); | |
425 | + return trace_peek_data(pevent, cpu); | |
425 | 426 | } |
426 | 427 | |
427 | - type_len_ts = data2host4(perf_pevent, ptr); | |
428 | + type_len_ts = data2host4(pevent, ptr); | |
428 | 429 | ptr += 4; |
429 | 430 | |
430 | 431 | type_len = type_len4host(type_len_ts); |
431 | 432 | |
... | ... | @@ -434,14 +435,14 @@ |
434 | 435 | case RINGBUF_TYPE_PADDING: |
435 | 436 | if (!delta) |
436 | 437 | die("error, hit unexpected end of page"); |
437 | - length = data2host4(perf_pevent, ptr); | |
438 | + length = data2host4(pevent, ptr); | |
438 | 439 | ptr += 4; |
439 | 440 | length *= 4; |
440 | 441 | ptr += length; |
441 | 442 | goto read_again; |
442 | 443 | |
443 | 444 | case RINGBUF_TYPE_TIME_EXTEND: |
444 | - extend = data2host4(perf_pevent, ptr); | |
445 | + extend = data2host4(pevent, ptr); | |
445 | 446 | ptr += 4; |
446 | 447 | extend <<= TS_SHIFT; |
447 | 448 | extend += delta; |
... | ... | @@ -452,7 +453,7 @@ |
452 | 453 | ptr += 12; |
453 | 454 | break; |
454 | 455 | case 0: |
455 | - length = data2host4(perf_pevent, ptr); | |
456 | + length = data2host4(pevent, ptr); | |
456 | 457 | ptr += 4; |
457 | 458 | die("here! length=%d", length); |
458 | 459 | break; |
459 | 460 | |
460 | 461 | |
... | ... | @@ -477,17 +478,17 @@ |
477 | 478 | return data; |
478 | 479 | } |
479 | 480 | |
480 | -struct pevent_record *trace_read_data(int cpu) | |
481 | +struct pevent_record *trace_read_data(struct pevent *pevent, int cpu) | |
481 | 482 | { |
482 | 483 | struct pevent_record *data; |
483 | 484 | |
484 | - data = trace_peek_data(cpu); | |
485 | + data = trace_peek_data(pevent, cpu); | |
485 | 486 | cpu_data[cpu].next = NULL; |
486 | 487 | |
487 | 488 | return data; |
488 | 489 | } |
489 | 490 | |
490 | -ssize_t trace_report(int fd, bool __repipe) | |
491 | +ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |
491 | 492 | { |
492 | 493 | char buf[BUFSIZ]; |
493 | 494 | char test[] = { 23, 8, 68 }; |
494 | 495 | |
495 | 496 | |
496 | 497 | |
497 | 498 | |
498 | 499 | |
... | ... | @@ -519,30 +520,32 @@ |
519 | 520 | file_bigendian = buf[0]; |
520 | 521 | host_bigendian = bigendian(); |
521 | 522 | |
522 | - read_trace_init(file_bigendian, host_bigendian); | |
523 | + *ppevent = read_trace_init(file_bigendian, host_bigendian); | |
524 | + if (*ppevent == NULL) | |
525 | + die("read_trace_init failed"); | |
523 | 526 | |
524 | 527 | read_or_die(buf, 1); |
525 | 528 | long_size = buf[0]; |
526 | 529 | |
527 | - page_size = read4(); | |
530 | + page_size = read4(*ppevent); | |
528 | 531 | |
529 | - read_header_files(); | |
532 | + read_header_files(*ppevent); | |
530 | 533 | |
531 | - read_ftrace_files(); | |
532 | - read_event_files(); | |
533 | - read_proc_kallsyms(); | |
534 | - read_ftrace_printk(); | |
534 | + read_ftrace_files(*ppevent); | |
535 | + read_event_files(*ppevent); | |
536 | + read_proc_kallsyms(*ppevent); | |
537 | + read_ftrace_printk(*ppevent); | |
535 | 538 | |
536 | 539 | size = calc_data_size - 1; |
537 | 540 | calc_data_size = 0; |
538 | 541 | repipe = false; |
539 | 542 | |
540 | 543 | if (show_funcs) { |
541 | - pevent_print_funcs(perf_pevent); | |
544 | + pevent_print_funcs(*ppevent); | |
542 | 545 | return size; |
543 | 546 | } |
544 | 547 | if (show_printk) { |
545 | - pevent_print_printk(perf_pevent); | |
548 | + pevent_print_printk(*ppevent); | |
546 | 549 | return size; |
547 | 550 | } |
548 | 551 |
tools/perf/util/trace-event-scripting.c
... | ... | @@ -36,6 +36,7 @@ |
36 | 36 | } |
37 | 37 | |
38 | 38 | static void process_event_unsupported(union perf_event *event __unused, |
39 | + struct pevent *pevent __unused, | |
39 | 40 | struct perf_sample *sample __unused, |
40 | 41 | struct perf_evsel *evsel __unused, |
41 | 42 | struct machine *machine __unused, |
... | ... | @@ -61,7 +62,8 @@ |
61 | 62 | return -1; |
62 | 63 | } |
63 | 64 | |
64 | -static int python_generate_script_unsupported(const char *outfile __unused) | |
65 | +static int python_generate_script_unsupported(struct pevent *pevent __unused, | |
66 | + const char *outfile __unused) | |
65 | 67 | { |
66 | 68 | print_python_unsupported_msg(); |
67 | 69 | |
... | ... | @@ -122,7 +124,8 @@ |
122 | 124 | return -1; |
123 | 125 | } |
124 | 126 | |
125 | -static int perl_generate_script_unsupported(const char *outfile __unused) | |
127 | +static int perl_generate_script_unsupported(struct pevent *pevent __unused, | |
128 | + const char *outfile __unused) | |
126 | 129 | { |
127 | 130 | print_perl_unsupported_msg(); |
128 | 131 |
tools/perf/util/trace-event.h
... | ... | @@ -8,6 +8,7 @@ |
8 | 8 | struct machine; |
9 | 9 | struct perf_sample; |
10 | 10 | union perf_event; |
11 | +struct perf_tool; | |
11 | 12 | struct thread; |
12 | 13 | |
13 | 14 | extern int header_page_size_size; |
14 | 15 | |
15 | 16 | |
16 | 17 | |
17 | 18 | |
18 | 19 | |
19 | 20 | |
20 | 21 | |
21 | 22 | |
... | ... | @@ -29,35 +30,36 @@ |
29 | 30 | |
30 | 31 | int bigendian(void); |
31 | 32 | |
32 | -int read_trace_init(int file_bigendian, int host_bigendian); | |
33 | -void print_trace_event(int cpu, void *data, int size); | |
33 | +struct pevent *read_trace_init(int file_bigendian, int host_bigendian); | |
34 | +void print_trace_event(struct pevent *pevent, int cpu, void *data, int size); | |
34 | 35 | |
35 | -void print_event(int cpu, void *data, int size, unsigned long long nsecs, | |
36 | - char *comm); | |
36 | +void print_event(struct pevent *pevent, int cpu, void *data, int size, | |
37 | + unsigned long long nsecs, char *comm); | |
37 | 38 | |
38 | -int parse_ftrace_file(char *buf, unsigned long size); | |
39 | -int parse_event_file(char *buf, unsigned long size, char *sys); | |
39 | +int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size); | |
40 | +int parse_event_file(struct pevent *pevent, | |
41 | + char *buf, unsigned long size, char *sys); | |
40 | 42 | |
41 | -struct pevent_record *trace_peek_data(int cpu); | |
42 | -struct event_format *trace_find_event(int type); | |
43 | +struct pevent_record *trace_peek_data(struct pevent *pevent, int cpu); | |
43 | 44 | |
44 | 45 | unsigned long long |
45 | 46 | raw_field_value(struct event_format *event, const char *name, void *data); |
46 | 47 | void *raw_field_ptr(struct event_format *event, const char *name, void *data); |
47 | 48 | |
48 | -void parse_proc_kallsyms(char *file, unsigned int size __unused); | |
49 | -void parse_ftrace_printk(char *file, unsigned int size __unused); | |
49 | +void parse_proc_kallsyms(struct pevent *pevent, char *file, unsigned int size); | |
50 | +void parse_ftrace_printk(struct pevent *pevent, char *file, unsigned int size); | |
50 | 51 | |
51 | -ssize_t trace_report(int fd, bool repipe); | |
52 | +ssize_t trace_report(int fd, struct pevent **pevent, bool repipe); | |
52 | 53 | |
53 | -int trace_parse_common_type(void *data); | |
54 | -int trace_parse_common_pid(void *data); | |
54 | +int trace_parse_common_type(struct pevent *pevent, void *data); | |
55 | +int trace_parse_common_pid(struct pevent *pevent, void *data); | |
55 | 56 | |
56 | -struct event_format *trace_find_next_event(struct event_format *event); | |
57 | -unsigned long long read_size(void *ptr, int size); | |
57 | +struct event_format *trace_find_next_event(struct pevent *pevent, | |
58 | + struct event_format *event); | |
59 | +unsigned long long read_size(struct pevent *pevent, void *ptr, int size); | |
58 | 60 | unsigned long long eval_flag(const char *flag); |
59 | 61 | |
60 | -struct pevent_record *trace_read_data(int cpu); | |
62 | +struct pevent_record *trace_read_data(struct pevent *pevent, int cpu); | |
61 | 63 | int read_tracing_data(int fd, struct list_head *pattrs); |
62 | 64 | |
63 | 65 | struct tracing_data { |
64 | 66 | |
... | ... | @@ -77,11 +79,12 @@ |
77 | 79 | int (*start_script) (const char *script, int argc, const char **argv); |
78 | 80 | int (*stop_script) (void); |
79 | 81 | void (*process_event) (union perf_event *event, |
82 | + struct pevent *pevent, | |
80 | 83 | struct perf_sample *sample, |
81 | 84 | struct perf_evsel *evsel, |
82 | 85 | struct machine *machine, |
83 | 86 | struct thread *thread); |
84 | - int (*generate_script) (const char *outfile); | |
87 | + int (*generate_script) (struct pevent *pevent, const char *outfile); | |
85 | 88 | }; |
86 | 89 | |
87 | 90 | int script_spec_register(const char *spec, struct scripting_ops *ops); |
... | ... | @@ -90,6 +93,7 @@ |
90 | 93 | void setup_python_scripting(void); |
91 | 94 | |
92 | 95 | struct scripting_context { |
96 | + struct pevent *pevent; | |
93 | 97 | void *event_data; |
94 | 98 | }; |
95 | 99 |