diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-kmem.c | 36 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 39 | ||||
-rw-r--r-- | tools/perf/builtin-sched.c | 38 | ||||
-rw-r--r-- | tools/perf/builtin-timechart.c | 56 | ||||
-rw-r--r-- | tools/perf/builtin-trace.c | 48 | ||||
-rw-r--r-- | tools/perf/util/event.c | 67 | ||||
-rw-r--r-- | tools/perf/util/event.h | 17 |
7 files changed, 155 insertions, 146 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 047fef74bd52..f218990de0cd 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -320,35 +320,23 @@ process_raw_event(event_t *raw_event __used, void *more_data, | |||
320 | 320 | ||
321 | static int process_sample_event(event_t *event) | 321 | static int process_sample_event(event_t *event) |
322 | { | 322 | { |
323 | u64 ip = event->ip.ip; | 323 | struct sample_data data; |
324 | u64 timestamp = -1; | 324 | struct thread *thread; |
325 | u32 cpu = -1; | ||
326 | u64 period = 1; | ||
327 | void *more_data = event->ip.__more_data; | ||
328 | struct thread *thread = threads__findnew(event->ip.pid); | ||
329 | |||
330 | if (sample_type & PERF_SAMPLE_TIME) { | ||
331 | timestamp = *(u64 *)more_data; | ||
332 | more_data += sizeof(u64); | ||
333 | } | ||
334 | 325 | ||
335 | if (sample_type & PERF_SAMPLE_CPU) { | 326 | memset(&data, 0, sizeof(data)); |
336 | cpu = *(u32 *)more_data; | 327 | data.time = -1; |
337 | more_data += sizeof(u32); | 328 | data.cpu = -1; |
338 | more_data += sizeof(u32); /* reserved */ | 329 | data.period = 1; |
339 | } | ||
340 | 330 | ||
341 | if (sample_type & PERF_SAMPLE_PERIOD) { | 331 | event__parse_sample(event, sample_type, &data); |
342 | period = *(u64 *)more_data; | ||
343 | more_data += sizeof(u64); | ||
344 | } | ||
345 | 332 | ||
346 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", | 333 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
347 | event->header.misc, | 334 | event->header.misc, |
348 | event->ip.pid, event->ip.tid, | 335 | data.pid, data.tid, |
349 | (void *)(long)ip, | 336 | (void *)(long)data.ip, |
350 | (long long)period); | 337 | (long long)data.period); |
351 | 338 | ||
339 | thread = threads__findnew(event->ip.pid); | ||
352 | if (thread == NULL) { | 340 | if (thread == NULL) { |
353 | pr_debug("problem processing %d event, skipping it.\n", | 341 | pr_debug("problem processing %d event, skipping it.\n", |
354 | event->header.type); | 342 | event->header.type); |
@@ -357,7 +345,7 @@ static int process_sample_event(event_t *event) | |||
357 | 345 | ||
358 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 346 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
359 | 347 | ||
360 | process_raw_event(event, more_data, cpu, timestamp, thread); | 348 | process_raw_event(event, data.raw_data, data.cpu, data.time, thread); |
361 | 349 | ||
362 | return 0; | 350 | return 0; |
363 | } | 351 | } |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 383c4ab4f9af..2b9eb3a553ed 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -605,44 +605,41 @@ static int validate_chain(struct ip_callchain *chain, event_t *event) | |||
605 | 605 | ||
606 | static int process_sample_event(event_t *event) | 606 | static int process_sample_event(event_t *event) |
607 | { | 607 | { |
608 | u64 ip = event->ip.ip; | 608 | struct sample_data data; |
609 | u64 period = 1; | ||
610 | void *more_data = event->ip.__more_data; | ||
611 | struct ip_callchain *chain = NULL; | ||
612 | int cpumode; | 609 | int cpumode; |
613 | struct addr_location al; | 610 | struct addr_location al; |
614 | struct thread *thread = threads__findnew(event->ip.pid); | 611 | struct thread *thread; |
615 | 612 | ||
616 | if (sample_type & PERF_SAMPLE_PERIOD) { | 613 | memset(&data, 0, sizeof(data)); |
617 | period = *(u64 *)more_data; | 614 | data.period = 1; |
618 | more_data += sizeof(u64); | 615 | |
619 | } | 616 | event__parse_sample(event, sample_type, &data); |
620 | 617 | ||
621 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", | 618 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
622 | event->header.misc, | 619 | event->header.misc, |
623 | event->ip.pid, event->ip.tid, | 620 | data.pid, data.tid, |
624 | (void *)(long)ip, | 621 | (void *)(long)data.ip, |
625 | (long long)period); | 622 | (long long)data.period); |
626 | 623 | ||
627 | if (sample_type & PERF_SAMPLE_CALLCHAIN) { | 624 | if (sample_type & PERF_SAMPLE_CALLCHAIN) { |
628 | unsigned int i; | 625 | unsigned int i; |
629 | 626 | ||
630 | chain = (void *)more_data; | 627 | dump_printf("... chain: nr:%Lu\n", data.callchain->nr); |
631 | |||
632 | dump_printf("... chain: nr:%Lu\n", chain->nr); | ||
633 | 628 | ||
634 | if (validate_chain(chain, event) < 0) { | 629 | if (validate_chain(data.callchain, event) < 0) { |
635 | pr_debug("call-chain problem with event, " | 630 | pr_debug("call-chain problem with event, " |
636 | "skipping it.\n"); | 631 | "skipping it.\n"); |
637 | return 0; | 632 | return 0; |
638 | } | 633 | } |
639 | 634 | ||
640 | if (dump_trace) { | 635 | if (dump_trace) { |
641 | for (i = 0; i < chain->nr; i++) | 636 | for (i = 0; i < data.callchain->nr; i++) |
642 | dump_printf("..... %2d: %016Lx\n", i, chain->ips[i]); | 637 | dump_printf("..... %2d: %016Lx\n", |
638 | i, data.callchain->ips[i]); | ||
643 | } | 639 | } |
644 | } | 640 | } |
645 | 641 | ||
642 | thread = threads__findnew(data.pid); | ||
646 | if (thread == NULL) { | 643 | if (thread == NULL) { |
647 | pr_debug("problem processing %d event, skipping it.\n", | 644 | pr_debug("problem processing %d event, skipping it.\n", |
648 | event->header.type); | 645 | event->header.type); |
@@ -657,7 +654,7 @@ static int process_sample_event(event_t *event) | |||
657 | cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | 654 | cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; |
658 | 655 | ||
659 | thread__find_addr_location(thread, cpumode, | 656 | thread__find_addr_location(thread, cpumode, |
660 | MAP__FUNCTION, ip, &al, NULL); | 657 | MAP__FUNCTION, data.ip, &al, NULL); |
661 | /* | 658 | /* |
662 | * We have to do this here as we may have a dso with no symbol hit that | 659 | * We have to do this here as we may have a dso with no symbol hit that |
663 | * has a name longer than the ones with symbols sampled. | 660 | * has a name longer than the ones with symbols sampled. |
@@ -675,12 +672,12 @@ static int process_sample_event(event_t *event) | |||
675 | if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name)) | 672 | if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name)) |
676 | return 0; | 673 | return 0; |
677 | 674 | ||
678 | if (hist_entry__add(&al, chain, period)) { | 675 | if (hist_entry__add(&al, data.callchain, data.period)) { |
679 | pr_debug("problem incrementing symbol count, skipping event\n"); | 676 | pr_debug("problem incrementing symbol count, skipping event\n"); |
680 | return -1; | 677 | return -1; |
681 | } | 678 | } |
682 | 679 | ||
683 | event__stats.total += period; | 680 | event__stats.total += data.period; |
684 | 681 | ||
685 | return 0; | 682 | return 0; |
686 | } | 683 | } |
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 26b782f26ee1..45c46c790493 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
@@ -1598,40 +1598,26 @@ process_raw_event(event_t *raw_event __used, void *more_data, | |||
1598 | 1598 | ||
1599 | static int process_sample_event(event_t *event) | 1599 | static int process_sample_event(event_t *event) |
1600 | { | 1600 | { |
1601 | struct sample_data data; | ||
1601 | struct thread *thread; | 1602 | struct thread *thread; |
1602 | u64 ip = event->ip.ip; | ||
1603 | u64 timestamp = -1; | ||
1604 | u32 cpu = -1; | ||
1605 | u64 period = 1; | ||
1606 | void *more_data = event->ip.__more_data; | ||
1607 | 1603 | ||
1608 | if (!(sample_type & PERF_SAMPLE_RAW)) | 1604 | if (!(sample_type & PERF_SAMPLE_RAW)) |
1609 | return 0; | 1605 | return 0; |
1610 | 1606 | ||
1611 | thread = threads__findnew(event->ip.pid); | 1607 | memset(&data, 0, sizeof(data)); |
1608 | data.time = -1; | ||
1609 | data.cpu = -1; | ||
1610 | data.period = -1; | ||
1612 | 1611 | ||
1613 | if (sample_type & PERF_SAMPLE_TIME) { | 1612 | event__parse_sample(event, sample_type, &data); |
1614 | timestamp = *(u64 *)more_data; | ||
1615 | more_data += sizeof(u64); | ||
1616 | } | ||
1617 | |||
1618 | if (sample_type & PERF_SAMPLE_CPU) { | ||
1619 | cpu = *(u32 *)more_data; | ||
1620 | more_data += sizeof(u32); | ||
1621 | more_data += sizeof(u32); /* reserved */ | ||
1622 | } | ||
1623 | |||
1624 | if (sample_type & PERF_SAMPLE_PERIOD) { | ||
1625 | period = *(u64 *)more_data; | ||
1626 | more_data += sizeof(u64); | ||
1627 | } | ||
1628 | 1613 | ||
1629 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", | 1614 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
1630 | event->header.misc, | 1615 | event->header.misc, |
1631 | event->ip.pid, event->ip.tid, | 1616 | data.pid, data.tid, |
1632 | (void *)(long)ip, | 1617 | (void *)(long)data.ip, |
1633 | (long long)period); | 1618 | (long long)data.period); |
1634 | 1619 | ||
1620 | thread = threads__findnew(data.pid); | ||
1635 | if (thread == NULL) { | 1621 | if (thread == NULL) { |
1636 | pr_debug("problem processing %d event, skipping it.\n", | 1622 | pr_debug("problem processing %d event, skipping it.\n", |
1637 | event->header.type); | 1623 | event->header.type); |
@@ -1640,10 +1626,10 @@ static int process_sample_event(event_t *event) | |||
1640 | 1626 | ||
1641 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 1627 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
1642 | 1628 | ||
1643 | if (profile_cpu != -1 && profile_cpu != (int) cpu) | 1629 | if (profile_cpu != -1 && profile_cpu != (int)data.cpu) |
1644 | return 0; | 1630 | return 0; |
1645 | 1631 | ||
1646 | process_raw_event(event, more_data, cpu, timestamp, thread); | 1632 | process_raw_event(event, data.raw_data, data.cpu, data.time, thread); |
1647 | 1633 | ||
1648 | return 0; | 1634 | return 0; |
1649 | } | 1635 | } |
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index c0f29ed09966..f472df9561ee 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
@@ -483,48 +483,22 @@ static void sched_switch(int cpu, u64 timestamp, struct trace_entry *te) | |||
483 | static int | 483 | static int |
484 | process_sample_event(event_t *event) | 484 | process_sample_event(event_t *event) |
485 | { | 485 | { |
486 | int cursor = 0; | 486 | struct sample_data data; |
487 | u64 addr = 0; | ||
488 | u64 stamp = 0; | ||
489 | u32 cpu = 0; | ||
490 | u32 pid = 0; | ||
491 | u32 size, *size_ptr; | ||
492 | struct trace_entry *te; | 487 | struct trace_entry *te; |
493 | 488 | ||
494 | if (sample_type & PERF_SAMPLE_IP) | 489 | memset(&data, 0, sizeof(data)); |
495 | cursor++; | ||
496 | |||
497 | if (sample_type & PERF_SAMPLE_TID) { | ||
498 | pid = event->sample.array[cursor]>>32; | ||
499 | cursor++; | ||
500 | } | ||
501 | if (sample_type & PERF_SAMPLE_TIME) { | ||
502 | stamp = event->sample.array[cursor++]; | ||
503 | 490 | ||
504 | if (!first_time || first_time > stamp) | 491 | event__parse_sample(event, sample_type, &data); |
505 | first_time = stamp; | ||
506 | if (last_time < stamp) | ||
507 | last_time = stamp; | ||
508 | 492 | ||
493 | if (sample_type & PERF_SAMPLE_TIME) { | ||
494 | if (!first_time || first_time > data.time) | ||
495 | first_time = data.time; | ||
496 | if (last_time < data.time) | ||
497 | last_time = data.time; | ||
509 | } | 498 | } |
510 | if (sample_type & PERF_SAMPLE_ADDR) | ||
511 | addr = event->sample.array[cursor++]; | ||
512 | if (sample_type & PERF_SAMPLE_ID) | ||
513 | cursor++; | ||
514 | if (sample_type & PERF_SAMPLE_STREAM_ID) | ||
515 | cursor++; | ||
516 | if (sample_type & PERF_SAMPLE_CPU) | ||
517 | cpu = event->sample.array[cursor++] & 0xFFFFFFFF; | ||
518 | if (sample_type & PERF_SAMPLE_PERIOD) | ||
519 | cursor++; | ||
520 | |||
521 | size_ptr = (void *)&event->sample.array[cursor]; | ||
522 | |||
523 | size = *size_ptr; | ||
524 | size_ptr++; | ||
525 | 499 | ||
526 | te = (void *)size_ptr; | 500 | te = (void *)data.raw_data; |
527 | if (sample_type & PERF_SAMPLE_RAW && size > 0) { | 501 | if (sample_type & PERF_SAMPLE_RAW && data.raw_size > 0) { |
528 | char *event_str; | 502 | char *event_str; |
529 | struct power_entry *pe; | 503 | struct power_entry *pe; |
530 | 504 | ||
@@ -536,19 +510,19 @@ process_sample_event(event_t *event) | |||
536 | return 0; | 510 | return 0; |
537 | 511 | ||
538 | if (strcmp(event_str, "power:power_start") == 0) | 512 | if (strcmp(event_str, "power:power_start") == 0) |
539 | c_state_start(cpu, stamp, pe->value); | 513 | c_state_start(data.cpu, data.time, pe->value); |
540 | 514 | ||
541 | if (strcmp(event_str, "power:power_end") == 0) | 515 | if (strcmp(event_str, "power:power_end") == 0) |
542 | c_state_end(cpu, stamp); | 516 | c_state_end(data.cpu, data.time); |
543 | 517 | ||
544 | if (strcmp(event_str, "power:power_frequency") == 0) | 518 | if (strcmp(event_str, "power:power_frequency") == 0) |
545 | p_state_change(cpu, stamp, pe->value); | 519 | p_state_change(data.cpu, data.time, pe->value); |
546 | 520 | ||
547 | if (strcmp(event_str, "sched:sched_wakeup") == 0) | 521 | if (strcmp(event_str, "sched:sched_wakeup") == 0) |
548 | sched_wakeup(cpu, stamp, pid, te); | 522 | sched_wakeup(data.cpu, data.time, data.pid, te); |
549 | 523 | ||
550 | if (strcmp(event_str, "sched:sched_switch") == 0) | 524 | if (strcmp(event_str, "sched:sched_switch") == 0) |
551 | sched_switch(cpu, stamp, te); | 525 | sched_switch(data.cpu, data.time, te); |
552 | } | 526 | } |
553 | return 0; | 527 | return 0; |
554 | } | 528 | } |
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index abb914aa7be6..c2fcc34486f5 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -66,58 +66,40 @@ static u64 sample_type; | |||
66 | 66 | ||
67 | static int process_sample_event(event_t *event) | 67 | static int process_sample_event(event_t *event) |
68 | { | 68 | { |
69 | u64 ip = event->ip.ip; | 69 | struct sample_data data; |
70 | u64 timestamp = -1; | 70 | struct thread *thread; |
71 | u32 cpu = -1; | ||
72 | u64 period = 1; | ||
73 | void *more_data = event->ip.__more_data; | ||
74 | struct thread *thread = threads__findnew(event->ip.pid); | ||
75 | |||
76 | if (sample_type & PERF_SAMPLE_TIME) { | ||
77 | timestamp = *(u64 *)more_data; | ||
78 | more_data += sizeof(u64); | ||
79 | } | ||
80 | 71 | ||
81 | if (sample_type & PERF_SAMPLE_CPU) { | 72 | memset(&data, 0, sizeof(data)); |
82 | cpu = *(u32 *)more_data; | 73 | data.time = -1; |
83 | more_data += sizeof(u32); | 74 | data.cpu = -1; |
84 | more_data += sizeof(u32); /* reserved */ | 75 | data.period = 1; |
85 | } | ||
86 | 76 | ||
87 | if (sample_type & PERF_SAMPLE_PERIOD) { | 77 | event__parse_sample(event, sample_type, &data); |
88 | period = *(u64 *)more_data; | ||
89 | more_data += sizeof(u64); | ||
90 | } | ||
91 | 78 | ||
92 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", | 79 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
93 | event->header.misc, | 80 | event->header.misc, |
94 | event->ip.pid, event->ip.tid, | 81 | data.pid, data.tid, |
95 | (void *)(long)ip, | 82 | (void *)(long)data.ip, |
96 | (long long)period); | 83 | (long long)data.period); |
97 | 84 | ||
85 | thread = threads__findnew(event->ip.pid); | ||
98 | if (thread == NULL) { | 86 | if (thread == NULL) { |
99 | pr_debug("problem processing %d event, skipping it.\n", | 87 | pr_debug("problem processing %d event, skipping it.\n", |
100 | event->header.type); | 88 | event->header.type); |
101 | return -1; | 89 | return -1; |
102 | } | 90 | } |
103 | 91 | ||
104 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | ||
105 | |||
106 | if (sample_type & PERF_SAMPLE_RAW) { | 92 | if (sample_type & PERF_SAMPLE_RAW) { |
107 | struct { | ||
108 | u32 size; | ||
109 | char data[0]; | ||
110 | } *raw = more_data; | ||
111 | |||
112 | /* | 93 | /* |
113 | * FIXME: better resolve from pid from the struct trace_entry | 94 | * FIXME: better resolve from pid from the struct trace_entry |
114 | * field, although it should be the same than this perf | 95 | * field, although it should be the same than this perf |
115 | * event pid | 96 | * event pid |
116 | */ | 97 | */ |
117 | scripting_ops->process_event(cpu, raw->data, raw->size, | 98 | scripting_ops->process_event(data.cpu, data.raw_data, |
118 | timestamp, thread->comm); | 99 | data.raw_size, |
100 | data.time, thread->comm); | ||
119 | } | 101 | } |
120 | event__stats.total += period; | 102 | event__stats.total += data.period; |
121 | 103 | ||
122 | return 0; | 104 | return 0; |
123 | } | 105 | } |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 414b89d1bde9..4dcecafa85dc 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -310,3 +310,70 @@ int event__preprocess_sample(const event_t *self, struct addr_location *al, | |||
310 | al->level == 'H' ? "[hypervisor]" : "<not found>"); | 310 | al->level == 'H' ? "[hypervisor]" : "<not found>"); |
311 | return 0; | 311 | return 0; |
312 | } | 312 | } |
313 | |||
314 | int event__parse_sample(event_t *event, u64 type, struct sample_data *data) | ||
315 | { | ||
316 | u64 *array = event->sample.array; | ||
317 | |||
318 | if (type & PERF_SAMPLE_IP) { | ||
319 | data->ip = event->ip.ip; | ||
320 | array++; | ||
321 | } | ||
322 | |||
323 | if (type & PERF_SAMPLE_TID) { | ||
324 | u32 *p = (u32 *)array; | ||
325 | data->pid = p[0]; | ||
326 | data->tid = p[1]; | ||
327 | array++; | ||
328 | } | ||
329 | |||
330 | if (type & PERF_SAMPLE_TIME) { | ||
331 | data->time = *array; | ||
332 | array++; | ||
333 | } | ||
334 | |||
335 | if (type & PERF_SAMPLE_ADDR) { | ||
336 | data->addr = *array; | ||
337 | array++; | ||
338 | } | ||
339 | |||
340 | if (type & PERF_SAMPLE_ID) { | ||
341 | data->id = *array; | ||
342 | array++; | ||
343 | } | ||
344 | |||
345 | if (type & PERF_SAMPLE_STREAM_ID) { | ||
346 | data->stream_id = *array; | ||
347 | array++; | ||
348 | } | ||
349 | |||
350 | if (type & PERF_SAMPLE_CPU) { | ||
351 | u32 *p = (u32 *)array; | ||
352 | data->cpu = *p; | ||
353 | array++; | ||
354 | } | ||
355 | |||
356 | if (type & PERF_SAMPLE_PERIOD) { | ||
357 | data->period = *array; | ||
358 | array++; | ||
359 | } | ||
360 | |||
361 | if (type & PERF_SAMPLE_READ) { | ||
362 | pr_debug("PERF_SAMPLE_READ is unsuported for now\n"); | ||
363 | return -1; | ||
364 | } | ||
365 | |||
366 | if (type & PERF_SAMPLE_CALLCHAIN) { | ||
367 | data->callchain = (struct ip_callchain *)array; | ||
368 | array += 1 + data->callchain->nr; | ||
369 | } | ||
370 | |||
371 | if (type & PERF_SAMPLE_RAW) { | ||
372 | u32 *p = (u32 *)array; | ||
373 | data->raw_size = *p; | ||
374 | p++; | ||
375 | data->raw_data = p; | ||
376 | } | ||
377 | |||
378 | return 0; | ||
379 | } | ||
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index a4cc8105cf67..c7a78eef8e52 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
@@ -56,11 +56,25 @@ struct read_event { | |||
56 | u64 id; | 56 | u64 id; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | struct sample_event{ | 59 | struct sample_event { |
60 | struct perf_event_header header; | 60 | struct perf_event_header header; |
61 | u64 array[]; | 61 | u64 array[]; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | struct sample_data { | ||
65 | u64 ip; | ||
66 | u32 pid, tid; | ||
67 | u64 time; | ||
68 | u64 addr; | ||
69 | u64 id; | ||
70 | u64 stream_id; | ||
71 | u32 cpu; | ||
72 | u64 period; | ||
73 | struct ip_callchain *callchain; | ||
74 | u32 raw_size; | ||
75 | void *raw_data; | ||
76 | }; | ||
77 | |||
64 | #define BUILD_ID_SIZE 20 | 78 | #define BUILD_ID_SIZE 20 |
65 | 79 | ||
66 | struct build_id_event { | 80 | struct build_id_event { |
@@ -155,5 +169,6 @@ int event__process_task(event_t *self); | |||
155 | struct addr_location; | 169 | struct addr_location; |
156 | int event__preprocess_sample(const event_t *self, struct addr_location *al, | 170 | int event__preprocess_sample(const event_t *self, struct addr_location *al, |
157 | symbol_filter_t filter); | 171 | symbol_filter_t filter); |
172 | int event__parse_sample(event_t *event, u64 type, struct sample_data *data); | ||
158 | 173 | ||
159 | #endif /* __PERF_RECORD_H */ | 174 | #endif /* __PERF_RECORD_H */ |