Commit da3789628f88684d3f0fb4e6a6bc086c395ac3cb

Authored by Arnaldo Carvalho de Melo
1 parent 7a25b2d32b

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
... ... @@ -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