diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-06-27 12:08:42 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-06-27 12:08:42 -0400 |
| commit | da3789628f88684d3f0fb4e6a6bc086c395ac3cb (patch) | |
| tree | f1573d6b2c8fa4e46f47c5558135a0a56d4397ef /tools/perf/builtin-script.c | |
| parent | 7a25b2d32b9cb0b813d56ee6109acf90f3c9f1e5 (diff) | |
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>
Diffstat (limited to 'tools/perf/builtin-script.c')
| -rw-r--r-- | tools/perf/builtin-script.c | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 8fecd3b8130a..1e60ab70b2b1 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c | |||
| @@ -28,6 +28,11 @@ static bool system_wide; | |||
| 28 | static const char *cpu_list; | 28 | static const char *cpu_list; |
| 29 | static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS); | 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 | enum perf_output_field { | 36 | enum perf_output_field { |
| 32 | PERF_OUTPUT_COMM = 1U << 0, | 37 | PERF_OUTPUT_COMM = 1U << 0, |
| 33 | PERF_OUTPUT_TID = 1U << 1, | 38 | PERF_OUTPUT_TID = 1U << 1, |
| @@ -257,7 +262,8 @@ static int perf_session__check_output_opt(struct perf_session *session) | |||
| 257 | return 0; | 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 | struct thread *thread, | 267 | struct thread *thread, |
| 262 | struct perf_evsel *evsel) | 268 | struct perf_evsel *evsel) |
| 263 | { | 269 | { |
| @@ -302,8 +308,14 @@ static void print_sample_start(struct perf_sample *sample, | |||
| 302 | 308 | ||
| 303 | if (PRINT_FIELD(EVNAME)) { | 309 | if (PRINT_FIELD(EVNAME)) { |
| 304 | if (attr->type == PERF_TYPE_TRACEPOINT) { | 310 | if (attr->type == PERF_TYPE_TRACEPOINT) { |
| 305 | type = trace_parse_common_type(sample->raw_data); | 311 | /* |
| 306 | event = trace_find_event(type); | 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 | if (event) | 319 | if (event) |
| 308 | evname = event->name; | 320 | evname = event->name; |
| 309 | } else | 321 | } else |
| @@ -404,6 +416,7 @@ static void print_sample_bts(union perf_event *event, | |||
| 404 | } | 416 | } |
| 405 | 417 | ||
| 406 | static void process_event(union perf_event *event __unused, | 418 | static void process_event(union perf_event *event __unused, |
| 419 | struct pevent *pevent, | ||
| 407 | struct perf_sample *sample, | 420 | struct perf_sample *sample, |
| 408 | struct perf_evsel *evsel, | 421 | struct perf_evsel *evsel, |
| 409 | struct machine *machine, | 422 | struct machine *machine, |
| @@ -414,7 +427,7 @@ static void process_event(union perf_event *event __unused, | |||
| 414 | if (output[attr->type].fields == 0) | 427 | if (output[attr->type].fields == 0) |
| 415 | return; | 428 | return; |
| 416 | 429 | ||
| 417 | print_sample_start(sample, thread, evsel); | 430 | print_sample_start(pevent, sample, thread, evsel); |
| 418 | 431 | ||
| 419 | if (is_bts_event(attr)) { | 432 | if (is_bts_event(attr)) { |
| 420 | print_sample_bts(event, sample, evsel, machine, thread); | 433 | print_sample_bts(event, sample, evsel, machine, thread); |
| @@ -422,7 +435,7 @@ static void process_event(union perf_event *event __unused, | |||
| 422 | } | 435 | } |
| 423 | 436 | ||
| 424 | if (PRINT_FIELD(TRACE)) | 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 | sample->raw_size); | 439 | sample->raw_size); |
| 427 | 440 | ||
| 428 | if (PRINT_FIELD(ADDR)) | 441 | if (PRINT_FIELD(ADDR)) |
| @@ -453,7 +466,8 @@ static int default_stop_script(void) | |||
| 453 | return 0; | 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 | return 0; | 472 | return 0; |
| 459 | } | 473 | } |
| @@ -491,6 +505,7 @@ static int process_sample_event(struct perf_tool *tool __used, | |||
| 491 | struct machine *machine) | 505 | struct machine *machine) |
| 492 | { | 506 | { |
| 493 | struct addr_location al; | 507 | struct addr_location al; |
| 508 | struct perf_script *scr = container_of(tool, struct perf_script, tool); | ||
| 494 | struct thread *thread = machine__findnew_thread(machine, event->ip.tid); | 509 | struct thread *thread = machine__findnew_thread(machine, event->ip.tid); |
| 495 | 510 | ||
| 496 | if (thread == NULL) { | 511 | if (thread == NULL) { |
| @@ -522,24 +537,27 @@ static int process_sample_event(struct perf_tool *tool __used, | |||
| 522 | if (cpu_list && !test_bit(sample->cpu, cpu_bitmap)) | 537 | if (cpu_list && !test_bit(sample->cpu, cpu_bitmap)) |
| 523 | return 0; | 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 | evsel->hists.stats.total_period += sample->period; | 543 | evsel->hists.stats.total_period += sample->period; |
| 528 | return 0; | 544 | return 0; |
| 529 | } | 545 | } |
| 530 | 546 | ||
| 531 | static struct perf_tool perf_script = { | 547 | static struct perf_script perf_script = { |
| 532 | .sample = process_sample_event, | 548 | .tool = { |
| 533 | .mmap = perf_event__process_mmap, | 549 | .sample = process_sample_event, |
| 534 | .comm = perf_event__process_comm, | 550 | .mmap = perf_event__process_mmap, |
| 535 | .exit = perf_event__process_task, | 551 | .comm = perf_event__process_comm, |
| 536 | .fork = perf_event__process_task, | 552 | .exit = perf_event__process_task, |
| 537 | .attr = perf_event__process_attr, | 553 | .fork = perf_event__process_task, |
| 538 | .event_type = perf_event__process_event_type, | 554 | .attr = perf_event__process_attr, |
| 539 | .tracing_data = perf_event__process_tracing_data, | 555 | .event_type = perf_event__process_event_type, |
| 540 | .build_id = perf_event__process_build_id, | 556 | .tracing_data = perf_event__process_tracing_data, |
| 541 | .ordered_samples = true, | 557 | .build_id = perf_event__process_build_id, |
| 542 | .ordering_requires_timestamps = true, | 558 | .ordered_samples = true, |
| 559 | .ordering_requires_timestamps = true, | ||
| 560 | }, | ||
| 543 | }; | 561 | }; |
| 544 | 562 | ||
| 545 | extern volatile int session_done; | 563 | extern volatile int session_done; |
| @@ -555,7 +573,7 @@ static int __cmd_script(struct perf_session *session) | |||
| 555 | 573 | ||
| 556 | signal(SIGINT, sig_handler); | 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 | if (debug_mode) | 578 | if (debug_mode) |
| 561 | pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered); | 579 | pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered); |
| @@ -1337,10 +1355,13 @@ int cmd_script(int argc, const char **argv, const char *prefix __used) | |||
| 1337 | if (!script_name) | 1355 | if (!script_name) |
| 1338 | setup_pager(); | 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 | if (session == NULL) | 1360 | if (session == NULL) |
| 1342 | return -ENOMEM; | 1361 | return -ENOMEM; |
| 1343 | 1362 | ||
| 1363 | perf_script.session = session; | ||
| 1364 | |||
| 1344 | if (cpu_list) { | 1365 | if (cpu_list) { |
| 1345 | if (perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap)) | 1366 | if (perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap)) |
| 1346 | return -1; | 1367 | return -1; |
| @@ -1386,7 +1407,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __used) | |||
| 1386 | return -1; | 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 | goto out; | 1412 | goto out; |
| 1391 | } | 1413 | } |
| 1392 | 1414 | ||
