diff options
| author | Steven Rostedt <srostedt@redhat.com> | 2009-10-13 14:56:24 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2009-10-13 14:56:24 -0400 |
| commit | 3d3e080ca86b410e42d74a9cdb74e78a5dcc328e (patch) | |
| tree | 4ce69e2a8890e7f00ffee1d79b850a6f68ef92f8 | |
| parent | f59f9f429f4139b9207fea9566ae1a61b7e9cadc (diff) | |
add latency format option to all output
All traces have info about interrupts disabled, preempt count
and needing rescheduling. Add an option to expose these.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | parse-events.c | 121 | ||||
| -rw-r--r-- | parse-events.h | 11 | ||||
| -rw-r--r-- | trace-cmd.c | 5 | ||||
| -rw-r--r-- | trace-read.c | 5 |
4 files changed, 122 insertions, 20 deletions
diff --git a/parse-events.c b/parse-events.c index 3581214..50ed6d9 100644 --- a/parse-events.c +++ b/parse-events.c | |||
| @@ -36,6 +36,8 @@ int header_page_size_size; | |||
| 36 | int header_page_data_offset; | 36 | int header_page_data_offset; |
| 37 | int header_page_data_size; | 37 | int header_page_data_size; |
| 38 | 38 | ||
| 39 | int latency_format; | ||
| 40 | |||
| 39 | static char *input_buf; | 41 | static char *input_buf; |
| 40 | static unsigned long long input_buf_ptr; | 42 | static unsigned long long input_buf_ptr; |
| 41 | static unsigned long long input_buf_siz; | 43 | static unsigned long long input_buf_siz; |
| @@ -1866,37 +1868,67 @@ static int get_common_info(const char *type, int *offset, int *size) | |||
| 1866 | return 0; | 1868 | return 0; |
| 1867 | } | 1869 | } |
| 1868 | 1870 | ||
| 1869 | static int parse_common_type(void *data) | 1871 | static int __parse_common(void *data, int *size, int *offset, |
| 1872 | char *name) | ||
| 1870 | { | 1873 | { |
| 1871 | static int type_offset; | ||
| 1872 | static int type_size; | ||
| 1873 | int ret; | 1874 | int ret; |
| 1874 | 1875 | ||
| 1875 | if (!type_size) { | 1876 | if (!*size) { |
| 1876 | ret = get_common_info("common_type", | 1877 | ret = get_common_info(name, offset, size); |
| 1877 | &type_offset, | ||
| 1878 | &type_size); | ||
| 1879 | if (ret < 0) | 1878 | if (ret < 0) |
| 1880 | return ret; | 1879 | return ret; |
| 1881 | } | 1880 | } |
| 1882 | return read_size(data + type_offset, type_size); | 1881 | return read_size(data + *offset, *size); |
| 1882 | } | ||
| 1883 | |||
| 1884 | static int parse_common_type(void *data) | ||
| 1885 | { | ||
| 1886 | static int type_offset; | ||
| 1887 | static int type_size; | ||
| 1888 | |||
| 1889 | return __parse_common(data, &type_size, &type_offset, | ||
| 1890 | "common_type"); | ||
| 1883 | } | 1891 | } |
| 1884 | 1892 | ||
| 1885 | static int parse_common_pid(void *data) | 1893 | static int parse_common_pid(void *data) |
| 1886 | { | 1894 | { |
| 1887 | static int pid_offset; | 1895 | static int pid_offset; |
| 1888 | static int pid_size; | 1896 | static int pid_size; |
| 1897 | |||
| 1898 | return __parse_common(data, &pid_size, &pid_offset, | ||
| 1899 | "common_pid"); | ||
| 1900 | } | ||
| 1901 | |||
| 1902 | static int parse_common_pc(void *data) | ||
| 1903 | { | ||
| 1904 | static int pc_offset; | ||
| 1905 | static int pc_size; | ||
| 1906 | |||
| 1907 | return __parse_common(data, &pc_size, &pc_offset, | ||
| 1908 | "common_preempt_count"); | ||
| 1909 | } | ||
| 1910 | |||
| 1911 | static int parse_common_flags(void *data) | ||
| 1912 | { | ||
| 1913 | static int flags_offset; | ||
| 1914 | static int flags_size; | ||
| 1915 | |||
| 1916 | return __parse_common(data, &flags_size, &flags_offset, | ||
| 1917 | "common_flags"); | ||
| 1918 | } | ||
| 1919 | |||
| 1920 | static int parse_common_lock_depth(void *data) | ||
| 1921 | { | ||
| 1922 | static int ld_offset; | ||
| 1923 | static int ld_size; | ||
| 1889 | int ret; | 1924 | int ret; |
| 1890 | 1925 | ||
| 1891 | if (!pid_size) { | 1926 | ret = __parse_common(data, &ld_size, &ld_offset, |
| 1892 | ret = get_common_info("common_pid", | 1927 | "common_lock_depth"); |
| 1893 | &pid_offset, | 1928 | if (ret < 0) |
| 1894 | &pid_size); | 1929 | return -1; |
| 1895 | if (ret < 0) | ||
| 1896 | return ret; | ||
| 1897 | } | ||
| 1898 | 1930 | ||
| 1899 | return read_size(data + pid_offset, pid_size); | 1931 | return ret; |
| 1900 | } | 1932 | } |
| 1901 | 1933 | ||
| 1902 | static struct event *find_event(int id) | 1934 | static struct event *find_event(int id) |
| @@ -2438,6 +2470,41 @@ static inline int log10_cpu(int nb) | |||
| 2438 | return 1; | 2470 | return 1; |
| 2439 | } | 2471 | } |
| 2440 | 2472 | ||
| 2473 | static void print_lat_fmt(void *data, int size) | ||
| 2474 | { | ||
| 2475 | unsigned int flags; | ||
| 2476 | unsigned int pc; | ||
| 2477 | int lock_depth; | ||
| 2478 | int hardirq; | ||
| 2479 | int softirq; | ||
| 2480 | |||
| 2481 | flags = parse_common_flags(data); | ||
| 2482 | pc = parse_common_pc(data); | ||
| 2483 | lock_depth = parse_common_lock_depth(data); | ||
| 2484 | |||
| 2485 | hardirq = flags & TRACE_FLAG_HARDIRQ; | ||
| 2486 | softirq = flags & TRACE_FLAG_SOFTIRQ; | ||
| 2487 | |||
| 2488 | printf("%c%c%c", | ||
| 2489 | (flags & TRACE_FLAG_IRQS_OFF) ? 'd' : | ||
| 2490 | (flags & TRACE_FLAG_IRQS_NOSUPPORT) ? | ||
| 2491 | 'X' : '.', | ||
| 2492 | (flags & TRACE_FLAG_NEED_RESCHED) ? | ||
| 2493 | 'N' : '.', | ||
| 2494 | (hardirq && softirq) ? 'H' : | ||
| 2495 | hardirq ? 'h' : softirq ? 's' : '.'); | ||
| 2496 | |||
| 2497 | if (pc) | ||
| 2498 | printf("%x", pc); | ||
| 2499 | else | ||
| 2500 | printf("."); | ||
| 2501 | |||
| 2502 | if (lock_depth < 0) | ||
| 2503 | printf("."); | ||
| 2504 | else | ||
| 2505 | printf("%d", lock_depth); | ||
| 2506 | } | ||
| 2507 | |||
| 2441 | /* taken from Linux, written by Frederic Weisbecker */ | 2508 | /* taken from Linux, written by Frederic Weisbecker */ |
| 2442 | static void print_graph_cpu(int cpu) | 2509 | static void print_graph_cpu(int cpu) |
| 2443 | { | 2510 | { |
| @@ -2681,6 +2748,11 @@ pretty_print_func_ent(void *data, int size, struct event *event, | |||
| 2681 | 2748 | ||
| 2682 | printf(" | "); | 2749 | printf(" | "); |
| 2683 | 2750 | ||
| 2751 | if (latency_format) { | ||
| 2752 | print_lat_fmt(data, size); | ||
| 2753 | printf(" | "); | ||
| 2754 | } | ||
| 2755 | |||
| 2684 | field = find_field(event, "func"); | 2756 | field = find_field(event, "func"); |
| 2685 | if (!field) | 2757 | if (!field) |
| 2686 | die("function entry does not have func field"); | 2758 | die("function entry does not have func field"); |
| @@ -2724,6 +2796,11 @@ pretty_print_func_ret(void *data, int size, struct event *event, | |||
| 2724 | 2796 | ||
| 2725 | printf(" | "); | 2797 | printf(" | "); |
| 2726 | 2798 | ||
| 2799 | if (latency_format) { | ||
| 2800 | print_lat_fmt(data, size); | ||
| 2801 | printf(" | "); | ||
| 2802 | } | ||
| 2803 | |||
| 2727 | field = find_field(event, "rettime"); | 2804 | field = find_field(event, "rettime"); |
| 2728 | if (!field) | 2805 | if (!field) |
| 2729 | die("can't find rettime in return graph"); | 2806 | die("can't find rettime in return graph"); |
| @@ -2794,9 +2871,15 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs) | |||
| 2794 | return pretty_print_func_graph(data, size, event, cpu, | 2871 | return pretty_print_func_graph(data, size, event, cpu, |
| 2795 | pid, comm, secs, usecs); | 2872 | pid, comm, secs, usecs); |
| 2796 | 2873 | ||
| 2797 | printf("%16s-%-5d [%03d] %5lu.%06lu: %s: ", | 2874 | if (latency_format) { |
| 2798 | comm, pid, cpu, | 2875 | printf("%8.8s-%-5d %3d", |
| 2799 | secs, usecs, event->name); | 2876 | comm, pid, cpu); |
| 2877 | print_lat_fmt(data, size); | ||
| 2878 | } else | ||
| 2879 | printf("%16s-%-5d [%03d] %5lu.%06lu: %s: ", | ||
| 2880 | comm, pid, cpu, | ||
| 2881 | secs, usecs, event->name); | ||
| 2882 | |||
| 2800 | 2883 | ||
| 2801 | if (event->flags & EVENT_FL_FAILED) { | 2884 | if (event->flags & EVENT_FL_FAILED) { |
| 2802 | printf("EVENT '%s' FAILED TO PARSE\n", | 2885 | printf("EVENT '%s' FAILED TO PARSE\n", |
diff --git a/parse-events.h b/parse-events.h index d517ba2..d9e8f4f 100644 --- a/parse-events.h +++ b/parse-events.h | |||
| @@ -234,6 +234,17 @@ extern int header_page_size_size; | |||
| 234 | extern int header_page_data_offset; | 234 | extern int header_page_data_offset; |
| 235 | extern int header_page_data_size; | 235 | extern int header_page_data_size; |
| 236 | 236 | ||
| 237 | extern int latency_format; | ||
| 238 | |||
| 237 | int parse_header_page(char *buf, unsigned long size); | 239 | int parse_header_page(char *buf, unsigned long size); |
| 238 | 240 | ||
| 241 | /* taken from kernel/trace/trace.h */ | ||
| 242 | enum trace_flag_type { | ||
| 243 | TRACE_FLAG_IRQS_OFF = 0x01, | ||
| 244 | TRACE_FLAG_IRQS_NOSUPPORT = 0x02, | ||
| 245 | TRACE_FLAG_NEED_RESCHED = 0x04, | ||
| 246 | TRACE_FLAG_HARDIRQ = 0x08, | ||
| 247 | TRACE_FLAG_SOFTIRQ = 0x10, | ||
| 248 | }; | ||
| 249 | |||
| 239 | #endif /* _PARSE_EVENTS_H */ | 250 | #endif /* _PARSE_EVENTS_H */ |
diff --git a/trace-cmd.c b/trace-cmd.c index 3657dd3..25e9692 100644 --- a/trace-cmd.c +++ b/trace-cmd.c | |||
| @@ -153,6 +153,8 @@ void warn(char *fmt, ...) | |||
| 153 | 153 | ||
| 154 | if (errno) | 154 | if (errno) |
| 155 | perror("trace-cmd"); | 155 | perror("trace-cmd"); |
| 156 | breakpoint(); | ||
| 157 | errno = 0; | ||
| 156 | 158 | ||
| 157 | va_start(ap, fmt); | 159 | va_start(ap, fmt); |
| 158 | fprintf(stderr, " "); | 160 | fprintf(stderr, " "); |
| @@ -1039,6 +1041,7 @@ void usage(char **argv) | |||
| 1039 | " -e show file endianess\n" | 1041 | " -e show file endianess\n" |
| 1040 | " -f show function list\n" | 1042 | " -f show function list\n" |
| 1041 | " -P show printk list\n" | 1043 | " -P show printk list\n" |
| 1044 | " -l show latency format (default with latency tracers)\n" | ||
| 1042 | "\n" | 1045 | "\n" |
| 1043 | " %s list [-e][-p]\n" | 1046 | " %s list [-e][-p]\n" |
| 1044 | " -e list available events\n" | 1047 | " -e list available events\n" |
| @@ -1058,6 +1061,8 @@ int main (int argc, char **argv) | |||
| 1058 | 1061 | ||
| 1059 | int c; | 1062 | int c; |
| 1060 | 1063 | ||
| 1064 | errno = 0; | ||
| 1065 | |||
| 1061 | if (argc < 2) | 1066 | if (argc < 2) |
| 1062 | usage(argv); | 1067 | usage(argv); |
| 1063 | 1068 | ||
diff --git a/trace-read.c b/trace-read.c index d3faede..b3cb20a 100644 --- a/trace-read.c +++ b/trace-read.c | |||
| @@ -613,7 +613,7 @@ void trace_report (int argc, char **argv) | |||
| 613 | {NULL, 0, NULL, 0} | 613 | {NULL, 0, NULL, 0} |
| 614 | }; | 614 | }; |
| 615 | 615 | ||
| 616 | c = getopt_long (argc-1, argv+1, "+hi:fepP", | 616 | c = getopt_long (argc-1, argv+1, "+hi:fepPl", |
| 617 | long_options, &option_index); | 617 | long_options, &option_index); |
| 618 | if (c == -1) | 618 | if (c == -1) |
| 619 | break; | 619 | break; |
| @@ -636,6 +636,9 @@ void trace_report (int argc, char **argv) | |||
| 636 | case 'p': | 636 | case 'p': |
| 637 | show_page_size = 1; | 637 | show_page_size = 1; |
| 638 | break; | 638 | break; |
| 639 | case 'l': | ||
| 640 | latency_format = 1; | ||
| 641 | break; | ||
| 639 | case 0: | 642 | case 0: |
| 640 | switch(option_index) { | 643 | switch(option_index) { |
| 641 | case 0: | 644 | case 0: |
