diff options
author | Steven Rostedt <srostedt@redhat.com> | 2009-11-25 23:25:23 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-11-25 23:25:23 -0500 |
commit | 1ca1a3143f0581da2372064d4d9ec0b375d615f2 (patch) | |
tree | 902d8e662c698f4080b9bb50100d191c407eb39e | |
parent | 4225dc9bd6d6af6f4deb4354658be599347d9145 (diff) |
Move cpu_data into tracecmd_handle structure
Make the cpu_data part of the tracecmd handle.
Also did some more clean ups in returns.
Added the libparsevent hack for trace_read_data to handle the
function graph output.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | trace-cmd.h | 3 | ||||
-rw-r--r-- | trace-input.c | 144 | ||||
-rw-r--r-- | trace-read.c | 7 |
3 files changed, 89 insertions, 65 deletions
diff --git a/trace-cmd.h b/trace-cmd.h index 162cd66..e9e3b1e 100644 --- a/trace-cmd.h +++ b/trace-cmd.h | |||
@@ -39,5 +39,8 @@ int tracecmd_init_data(struct tracecmd_handle *handle); | |||
39 | struct record * | 39 | struct record * |
40 | tracecmd_peek_data(struct tracecmd_handle *handle, int cpu); | 40 | tracecmd_peek_data(struct tracecmd_handle *handle, int cpu); |
41 | 41 | ||
42 | struct record * | ||
43 | tracecmd_read_data(struct tracecmd_handle *handle, int cpu); | ||
44 | |||
42 | 45 | ||
43 | #endif /* _TRACE_CMD_H */ | 46 | #endif /* _TRACE_CMD_H */ |
diff --git a/trace-input.c b/trace-input.c index 7e9d4c6..99d24e4 100644 --- a/trace-input.c +++ b/trace-input.c | |||
@@ -18,15 +18,6 @@ | |||
18 | 18 | ||
19 | #include "trace-cmd.h" | 19 | #include "trace-cmd.h" |
20 | 20 | ||
21 | struct tracecmd_handle { | ||
22 | int fd; | ||
23 | int long_size; | ||
24 | int page_size; | ||
25 | int print_events; | ||
26 | int read_page; | ||
27 | int cpus; | ||
28 | }; | ||
29 | |||
30 | struct cpu_data { | 21 | struct cpu_data { |
31 | unsigned long long offset; | 22 | unsigned long long offset; |
32 | unsigned long long size; | 23 | unsigned long long size; |
@@ -38,7 +29,16 @@ struct cpu_data { | |||
38 | int page_size; | 29 | int page_size; |
39 | }; | 30 | }; |
40 | 31 | ||
41 | static struct cpu_data *cpu_data; | 32 | struct tracecmd_handle { |
33 | int fd; | ||
34 | int long_size; | ||
35 | int page_size; | ||
36 | int print_events; | ||
37 | int read_page; | ||
38 | int cpus; | ||
39 | struct cpu_data *cpu_data; | ||
40 | }; | ||
41 | |||
42 | 42 | ||
43 | static int do_read(struct tracecmd_handle *handle, void *data, int size) | 43 | static int do_read(struct tracecmd_handle *handle, void *data, int size) |
44 | { | 44 | { |
@@ -437,17 +437,18 @@ static unsigned int ts4host(unsigned int type_len_ts) | |||
437 | return type_len_ts >> 5; | 437 | return type_len_ts >> 5; |
438 | } | 438 | } |
439 | 439 | ||
440 | static int calc_index(void *ptr, int cpu) | 440 | static int calc_index(struct tracecmd_handle *handle, |
441 | void *ptr, int cpu) | ||
441 | { | 442 | { |
442 | return (unsigned long)ptr - (unsigned long)cpu_data[cpu].page; | 443 | return (unsigned long)ptr - (unsigned long)handle->cpu_data[cpu].page; |
443 | } | 444 | } |
444 | 445 | ||
445 | static void | 446 | static void |
446 | update_cpu_data_index(struct tracecmd_handle *handle, int cpu) | 447 | update_cpu_data_index(struct tracecmd_handle *handle, int cpu) |
447 | { | 448 | { |
448 | cpu_data[cpu].offset += handle->page_size; | 449 | handle->cpu_data[cpu].offset += handle->page_size; |
449 | cpu_data[cpu].size -= handle->page_size; | 450 | handle->cpu_data[cpu].size -= handle->page_size; |
450 | cpu_data[cpu].index = 0; | 451 | handle->cpu_data[cpu].index = 0; |
451 | } | 452 | } |
452 | 453 | ||
453 | static void get_next_page(struct tracecmd_handle *handle, int cpu) | 454 | static void get_next_page(struct tracecmd_handle *handle, int cpu) |
@@ -455,13 +456,13 @@ static void get_next_page(struct tracecmd_handle *handle, int cpu) | |||
455 | off64_t save_seek; | 456 | off64_t save_seek; |
456 | off64_t ret; | 457 | off64_t ret; |
457 | 458 | ||
458 | if (!cpu_data[cpu].page) | 459 | if (!handle->cpu_data[cpu].page) |
459 | return; | 460 | return; |
460 | 461 | ||
461 | if (handle->read_page) { | 462 | if (handle->read_page) { |
462 | if (cpu_data[cpu].size <= handle->page_size) { | 463 | if (handle->cpu_data[cpu].size <= handle->page_size) { |
463 | free(cpu_data[cpu].page); | 464 | free(handle->cpu_data[cpu].page); |
464 | cpu_data[cpu].page = NULL; | 465 | handle->cpu_data[cpu].page = NULL; |
465 | return; | 466 | return; |
466 | } | 467 | } |
467 | 468 | ||
@@ -470,10 +471,10 @@ static void get_next_page(struct tracecmd_handle *handle, int cpu) | |||
470 | /* other parts of the code may expect the pointer to not move */ | 471 | /* other parts of the code may expect the pointer to not move */ |
471 | save_seek = lseek64(input_fd, 0, SEEK_CUR); | 472 | save_seek = lseek64(input_fd, 0, SEEK_CUR); |
472 | 473 | ||
473 | ret = lseek64(handle->fd, cpu_data[cpu].offset, SEEK_SET); | 474 | ret = lseek64(handle->fd, handle->cpu_data[cpu].offset, SEEK_SET); |
474 | if (ret < 0) | 475 | if (ret < 0) |
475 | die("failed to lseek"); | 476 | die("failed to lseek"); |
476 | ret = read(handle->fd, cpu_data[cpu].page, handle->page_size); | 477 | ret = read(handle->fd, handle->cpu_data[cpu].page, handle->page_size); |
477 | if (ret < 0) | 478 | if (ret < 0) |
478 | die("failed to read page"); | 479 | die("failed to read page"); |
479 | 480 | ||
@@ -483,19 +484,19 @@ static void get_next_page(struct tracecmd_handle *handle, int cpu) | |||
483 | return; | 484 | return; |
484 | } | 485 | } |
485 | 486 | ||
486 | munmap(cpu_data[cpu].page, handle->page_size); | 487 | munmap(handle->cpu_data[cpu].page, handle->page_size); |
487 | cpu_data[cpu].page = NULL; | 488 | handle->cpu_data[cpu].page = NULL; |
488 | 489 | ||
489 | if (cpu_data[cpu].size <= handle->page_size) | 490 | if (handle->cpu_data[cpu].size <= handle->page_size) |
490 | return; | 491 | return; |
491 | 492 | ||
492 | update_cpu_data_index(handle, cpu); | 493 | update_cpu_data_index(handle, cpu); |
493 | 494 | ||
494 | cpu_data[cpu].page = mmap(NULL, handle->page_size, PROT_READ, MAP_PRIVATE, | 495 | handle->cpu_data[cpu].page = mmap(NULL, handle->page_size, PROT_READ, MAP_PRIVATE, |
495 | input_fd, cpu_data[cpu].offset); | 496 | input_fd, handle->cpu_data[cpu].offset); |
496 | if (cpu_data[cpu].page == MAP_FAILED) | 497 | if (handle->cpu_data[cpu].page == MAP_FAILED) |
497 | die("failed to mmap cpu %d at offset 0x%llx", | 498 | die("failed to mmap cpu %d at offset 0x%llx", |
498 | cpu, cpu_data[cpu].offset); | 499 | cpu, handle->cpu_data[cpu].offset); |
499 | } | 500 | } |
500 | 501 | ||
501 | enum old_ring_buffer_type { | 502 | enum old_ring_buffer_type { |
@@ -533,7 +534,7 @@ read_old_format(struct tracecmd_handle *handle, void **ptr, int cpu) | |||
533 | extend = data2host4(ptr); | 534 | extend = data2host4(ptr); |
534 | extend <<= TS_SHIFT; | 535 | extend <<= TS_SHIFT; |
535 | extend += delta; | 536 | extend += delta; |
536 | cpu_data[cpu].timestamp += extend; | 537 | handle->cpu_data[cpu].timestamp += extend; |
537 | *ptr += 4; | 538 | *ptr += 4; |
538 | return NULL; | 539 | return NULL; |
539 | 540 | ||
@@ -551,19 +552,19 @@ read_old_format(struct tracecmd_handle *handle, void **ptr, int cpu) | |||
551 | break; | 552 | break; |
552 | } | 553 | } |
553 | 554 | ||
554 | cpu_data[cpu].timestamp += delta; | 555 | handle->cpu_data[cpu].timestamp += delta; |
555 | 556 | ||
556 | data = malloc_or_die(sizeof(*data)); | 557 | data = malloc_or_die(sizeof(*data)); |
557 | memset(data, 0, sizeof(*data)); | 558 | memset(data, 0, sizeof(*data)); |
558 | 559 | ||
559 | data->ts = cpu_data[cpu].timestamp; | 560 | data->ts = handle->cpu_data[cpu].timestamp; |
560 | data->size = length; | 561 | data->size = length; |
561 | data->data = *ptr; | 562 | data->data = *ptr; |
562 | 563 | ||
563 | *ptr += ((length+3)/4) * 4; | 564 | *ptr += ((length+3)/4) * 4; |
564 | 565 | ||
565 | cpu_data[cpu].index = calc_index(*ptr, cpu); | 566 | handle->cpu_data[cpu].index = calc_index(handle, *ptr, cpu); |
566 | cpu_data[cpu].next = data; | 567 | handle->cpu_data[cpu].next = data; |
567 | 568 | ||
568 | return data; | 569 | return data; |
569 | } | 570 | } |
@@ -572,8 +573,8 @@ struct record * | |||
572 | tracecmd_peek_data(struct tracecmd_handle *handle, int cpu) | 573 | tracecmd_peek_data(struct tracecmd_handle *handle, int cpu) |
573 | { | 574 | { |
574 | struct record *data; | 575 | struct record *data; |
575 | void *page = cpu_data[cpu].page; | 576 | void *page = handle->cpu_data[cpu].page; |
576 | int index = cpu_data[cpu].index; | 577 | int index = handle->cpu_data[cpu].index; |
577 | void *ptr = page + index; | 578 | void *ptr = page + index; |
578 | unsigned long long extend; | 579 | unsigned long long extend; |
579 | unsigned int type_len_ts; | 580 | unsigned int type_len_ts; |
@@ -581,8 +582,8 @@ tracecmd_peek_data(struct tracecmd_handle *handle, int cpu) | |||
581 | unsigned int delta; | 582 | unsigned int delta; |
582 | unsigned int length; | 583 | unsigned int length; |
583 | 584 | ||
584 | if (cpu_data[cpu].next) | 585 | if (handle->cpu_data[cpu].next) |
585 | return cpu_data[cpu].next; | 586 | return handle->cpu_data[cpu].next; |
586 | 587 | ||
587 | if (!page) | 588 | if (!page) |
588 | return NULL; | 589 | return NULL; |
@@ -591,27 +592,27 @@ tracecmd_peek_data(struct tracecmd_handle *handle, int cpu) | |||
591 | /* FIXME: handle header page */ | 592 | /* FIXME: handle header page */ |
592 | if (header_page_ts_size != 8) | 593 | if (header_page_ts_size != 8) |
593 | die("expected a long long type for timestamp"); | 594 | die("expected a long long type for timestamp"); |
594 | cpu_data[cpu].timestamp = data2host8(ptr); | 595 | handle->cpu_data[cpu].timestamp = data2host8(ptr); |
595 | ptr += 8; | 596 | ptr += 8; |
596 | switch (header_page_size_size) { | 597 | switch (header_page_size_size) { |
597 | case 4: | 598 | case 4: |
598 | cpu_data[cpu].page_size = data2host4(ptr); | 599 | handle->cpu_data[cpu].page_size = data2host4(ptr); |
599 | ptr += 4; | 600 | ptr += 4; |
600 | break; | 601 | break; |
601 | case 8: | 602 | case 8: |
602 | cpu_data[cpu].page_size = data2host8(ptr); | 603 | handle->cpu_data[cpu].page_size = data2host8(ptr); |
603 | ptr += 8; | 604 | ptr += 8; |
604 | break; | 605 | break; |
605 | default: | 606 | default: |
606 | die("bad long size"); | 607 | die("bad long size"); |
607 | } | 608 | } |
608 | ptr = cpu_data[cpu].page + header_page_data_offset; | 609 | ptr = handle->cpu_data[cpu].page + header_page_data_offset; |
609 | } | 610 | } |
610 | 611 | ||
611 | read_again: | 612 | read_again: |
612 | index = calc_index(ptr, cpu); | 613 | index = calc_index(handle, ptr, cpu); |
613 | 614 | ||
614 | if (index >= cpu_data[cpu].page_size) { | 615 | if (index >= handle->cpu_data[cpu].page_size) { |
615 | get_next_page(handle, cpu); | 616 | get_next_page(handle, cpu); |
616 | return trace_peek_data(cpu); | 617 | return trace_peek_data(cpu); |
617 | } | 618 | } |
@@ -648,7 +649,7 @@ read_again: | |||
648 | ptr += 4; | 649 | ptr += 4; |
649 | extend <<= TS_SHIFT; | 650 | extend <<= TS_SHIFT; |
650 | extend += delta; | 651 | extend += delta; |
651 | cpu_data[cpu].timestamp += extend; | 652 | handle->cpu_data[cpu].timestamp += extend; |
652 | goto read_again; | 653 | goto read_again; |
653 | 654 | ||
654 | case RINGBUF_TYPE_TIME_STAMP: | 655 | case RINGBUF_TYPE_TIME_STAMP: |
@@ -664,28 +665,29 @@ read_again: | |||
664 | break; | 665 | break; |
665 | } | 666 | } |
666 | 667 | ||
667 | cpu_data[cpu].timestamp += delta; | 668 | handle->cpu_data[cpu].timestamp += delta; |
668 | 669 | ||
669 | data = malloc_or_die(sizeof(*data)); | 670 | data = malloc_or_die(sizeof(*data)); |
670 | memset(data, 0, sizeof(*data)); | 671 | memset(data, 0, sizeof(*data)); |
671 | 672 | ||
672 | data->ts = cpu_data[cpu].timestamp; | 673 | data->ts = handle->cpu_data[cpu].timestamp; |
673 | data->size = length; | 674 | data->size = length; |
674 | data->data = ptr; | 675 | data->data = ptr; |
675 | ptr += length; | 676 | ptr += length; |
676 | 677 | ||
677 | cpu_data[cpu].index = calc_index(ptr, cpu); | 678 | handle->cpu_data[cpu].index = calc_index(handle, ptr, cpu); |
678 | cpu_data[cpu].next = data; | 679 | handle->cpu_data[cpu].next = data; |
679 | 680 | ||
680 | return data; | 681 | return data; |
681 | } | 682 | } |
682 | 683 | ||
683 | struct record *trace_read_data(int cpu) | 684 | struct record * |
685 | tracecmd_read_data(struct tracecmd_handle *handle, int cpu) | ||
684 | { | 686 | { |
685 | struct record *data; | 687 | struct record *data; |
686 | 688 | ||
687 | data = trace_peek_data(cpu); | 689 | data = trace_peek_data(cpu); |
688 | cpu_data[cpu].next = NULL; | 690 | handle->cpu_data[cpu].next = NULL; |
689 | 691 | ||
690 | return data; | 692 | return data; |
691 | } | 693 | } |
@@ -695,15 +697,15 @@ static void init_read(struct tracecmd_handle *handle, int cpu) | |||
695 | off64_t ret; | 697 | off64_t ret; |
696 | off64_t save_seek; | 698 | off64_t save_seek; |
697 | 699 | ||
698 | cpu_data[cpu].page = malloc_or_die(handle->page_size); | 700 | handle->cpu_data[cpu].page = malloc_or_die(handle->page_size); |
699 | 701 | ||
700 | /* other parts of the code may expect the pointer to not move */ | 702 | /* other parts of the code may expect the pointer to not move */ |
701 | save_seek = lseek64(input_fd, 0, SEEK_CUR); | 703 | save_seek = lseek64(input_fd, 0, SEEK_CUR); |
702 | 704 | ||
703 | ret = lseek64(input_fd, (off64_t)cpu_data[cpu].offset, SEEK_SET); | 705 | ret = lseek64(input_fd, (off64_t)handle->cpu_data[cpu].offset, SEEK_SET); |
704 | if (ret < 0) | 706 | if (ret < 0) |
705 | die("failed to lseek"); | 707 | die("failed to lseek"); |
706 | ret = read(input_fd, cpu_data[cpu].page, handle->page_size); | 708 | ret = read(input_fd, handle->cpu_data[cpu].page, handle->page_size); |
707 | if (ret < 0) | 709 | if (ret < 0) |
708 | die("failed to read page"); | 710 | die("failed to read page"); |
709 | 711 | ||
@@ -713,7 +715,7 @@ static void init_read(struct tracecmd_handle *handle, int cpu) | |||
713 | 715 | ||
714 | static void init_cpu(struct tracecmd_handle *handle, int cpu) | 716 | static void init_cpu(struct tracecmd_handle *handle, int cpu) |
715 | { | 717 | { |
716 | if (!cpu_data[cpu].size) { | 718 | if (!handle->cpu_data[cpu].size) { |
717 | printf("CPU %d is empty\n", cpu); | 719 | printf("CPU %d is empty\n", cpu); |
718 | return; | 720 | return; |
719 | } | 721 | } |
@@ -723,9 +725,9 @@ static void init_cpu(struct tracecmd_handle *handle, int cpu) | |||
723 | return; | 725 | return; |
724 | } | 726 | } |
725 | 727 | ||
726 | cpu_data[cpu].page = mmap(NULL, handle->page_size, PROT_READ, | 728 | handle->cpu_data[cpu].page = mmap(NULL, handle->page_size, PROT_READ, |
727 | MAP_PRIVATE, input_fd, cpu_data[cpu].offset); | 729 | MAP_PRIVATE, input_fd, handle->cpu_data[cpu].offset); |
728 | if (cpu_data[cpu].page == MAP_FAILED) { | 730 | if (handle->cpu_data[cpu].page == MAP_FAILED) { |
729 | /* fall back to just reading pages */ | 731 | /* fall back to just reading pages */ |
730 | fprintf(stderr, "Can not mmap file, will read instead\n"); | 732 | fprintf(stderr, "Can not mmap file, will read instead\n"); |
731 | handle->read_page = 1; | 733 | handle->read_page = 1; |
@@ -742,29 +744,41 @@ int tracecmd_init_data(struct tracecmd_handle *handle) | |||
742 | int cpu; | 744 | int cpu; |
743 | 745 | ||
744 | size = read8(handle); | 746 | size = read8(handle); |
745 | cmdlines = malloc_or_die(size); | 747 | if (size < 0) |
746 | do_read_check(handle, cmdlines, size); | 748 | return -1; |
749 | cmdlines = malloc(size); | ||
750 | if (!cmdlines) | ||
751 | return -1; | ||
752 | if (do_read_check(handle, cmdlines, size)) { | ||
753 | free(cmdlines); | ||
754 | return -1; | ||
755 | } | ||
747 | parse_cmdlines(cmdlines, size); | 756 | parse_cmdlines(cmdlines, size); |
748 | free(cmdlines); | 757 | free(cmdlines); |
749 | 758 | ||
750 | handle->cpus = read4(handle); | 759 | handle->cpus = read4(handle); |
760 | if (handle->cpus < 0) | ||
761 | return -1; | ||
751 | 762 | ||
752 | parse_set_info(handle->cpus, handle->long_size); | 763 | parse_set_info(handle->cpus, handle->long_size); |
753 | 764 | ||
754 | /* | 765 | /* |
755 | * Check if this is a latency report or not. | 766 | * Check if this is a latency report or not. |
756 | */ | 767 | */ |
757 | do_read_check(handle, buf, 10); | 768 | if (do_read_check(handle, buf, 10)) |
769 | return -1; | ||
758 | if (strncmp(buf, "latency", 7) == 0) | 770 | if (strncmp(buf, "latency", 7) == 0) |
759 | return 1; | 771 | return 1; |
760 | 772 | ||
761 | cpu_data = malloc_or_die(sizeof(*cpu_data) * handle->cpus); | 773 | handle->cpu_data = malloc(sizeof(*handle->cpu_data) * handle->cpus); |
762 | memset(cpu_data, 0, sizeof(*cpu_data) * handle->cpus); | 774 | if (!handle->cpu_data) |
775 | return -1; | ||
776 | memset(handle->cpu_data, 0, sizeof(*handle->cpu_data) * handle->cpus); | ||
763 | 777 | ||
764 | for (cpu = 0; cpu < handle->cpus; cpu++) { | 778 | for (cpu = 0; cpu < handle->cpus; cpu++) { |
765 | cpu_data[cpu].cpu = cpu; | 779 | handle->cpu_data[cpu].cpu = cpu; |
766 | cpu_data[cpu].offset = read8(handle); | 780 | handle->cpu_data[cpu].offset = read8(handle); |
767 | cpu_data[cpu].size = read8(handle); | 781 | handle->cpu_data[cpu].size = read8(handle); |
768 | 782 | ||
769 | init_cpu(handle, cpu); | 783 | init_cpu(handle, cpu); |
770 | } | 784 | } |
diff --git a/trace-read.c b/trace-read.c index aab17d2..1c30f46 100644 --- a/trace-read.c +++ b/trace-read.c | |||
@@ -55,6 +55,13 @@ struct record *trace_peek_data(int cpu) | |||
55 | return tracecmd_peek_data(trace_handle, cpu); | 55 | return tracecmd_peek_data(trace_handle, cpu); |
56 | } | 56 | } |
57 | 57 | ||
58 | struct record *trace_read_data(int cpu) | ||
59 | { | ||
60 | /* work around for libparsevent */ | ||
61 | |||
62 | return tracecmd_read_data(trace_handle, cpu); | ||
63 | } | ||
64 | |||
58 | static void show_data(int cpu) | 65 | static void show_data(int cpu) |
59 | { | 66 | { |
60 | struct record *record; | 67 | struct record *record; |