diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-16 19:38:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-16 19:38:57 -0400 |
commit | 2a83dc7e37045ecf6791bb98e7b91c3f761e5efe (patch) | |
tree | 4a820de1fbcd2f1290afeb7f2e06a98c18410e87 /tools | |
parent | 17cf7db27b3af29ebbc14466785236878aad98eb (diff) | |
parent | ad466db5b0c302e85ad96c42a43194c234cbd862 (diff) |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar:
"Tooling fixes, plus a simple hardware-enablement patch for the Intel
RAPL PMU (energy use measurement) on Haswell CPUs, which I hope is
still fine at this stage"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf tools: Instead of redirecting flex output, use -o
perf tools: Fix double free in perf test 21 (code-reading.c)
perf stat: Initialize statistics correctly
perf bench: Set more defaults in the 'numa' suite
perf bench: Fix segfault at the end of an 'all' execution
perf bench: Update manpage to mention numa and futex
perf probe: Use dwarf_getcfi_elf() instead of dwarf_getcfi()
perf probe: Fix to handle errors in line_range searching
perf probe: Fix --line option behavior
perf tools: Pick up libdw without explicit LIBDW_DIR
MAINTAINERS: Change e-mail to kernel.org one
perf callchains: Disable unwind libraries when libelf isn't found
tools lib traceevent: Do not call warning() directly
tools lib traceevent: Print event name when show warning if possible
perf top: Fix documentation of invalid -s option
perf/x86: Enable DRAM RAPL support on Intel Haswell
Diffstat (limited to 'tools')
-rw-r--r-- | tools/lib/traceevent/event-parse.c | 109 | ||||
-rw-r--r-- | tools/perf/Documentation/perf-bench.txt | 22 | ||||
-rw-r--r-- | tools/perf/Documentation/perf-top.txt | 1 | ||||
-rw-r--r-- | tools/perf/Makefile.perf | 4 | ||||
-rw-r--r-- | tools/perf/bench/numa.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-stat.c | 11 | ||||
-rw-r--r-- | tools/perf/config/Makefile | 7 | ||||
-rw-r--r-- | tools/perf/tests/code-reading.c | 1 | ||||
-rw-r--r-- | tools/perf/util/probe-finder.c | 15 |
9 files changed, 117 insertions, 57 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index 1587ea392ad6..baec7d887da4 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c | |||
@@ -50,6 +50,18 @@ static int show_warning = 1; | |||
50 | warning(fmt, ##__VA_ARGS__); \ | 50 | warning(fmt, ##__VA_ARGS__); \ |
51 | } while (0) | 51 | } while (0) |
52 | 52 | ||
53 | #define do_warning_event(event, fmt, ...) \ | ||
54 | do { \ | ||
55 | if (!show_warning) \ | ||
56 | continue; \ | ||
57 | \ | ||
58 | if (event) \ | ||
59 | warning("[%s:%s] " fmt, event->system, \ | ||
60 | event->name, ##__VA_ARGS__); \ | ||
61 | else \ | ||
62 | warning(fmt, ##__VA_ARGS__); \ | ||
63 | } while (0) | ||
64 | |||
53 | static void init_input_buf(const char *buf, unsigned long long size) | 65 | static void init_input_buf(const char *buf, unsigned long long size) |
54 | { | 66 | { |
55 | input_buf = buf; | 67 | input_buf = buf; |
@@ -1355,7 +1367,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f | |||
1355 | } | 1367 | } |
1356 | 1368 | ||
1357 | if (!field->type) { | 1369 | if (!field->type) { |
1358 | do_warning("%s: no type found", __func__); | 1370 | do_warning_event(event, "%s: no type found", __func__); |
1359 | goto fail; | 1371 | goto fail; |
1360 | } | 1372 | } |
1361 | field->name = last_token; | 1373 | field->name = last_token; |
@@ -1402,7 +1414,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f | |||
1402 | free_token(token); | 1414 | free_token(token); |
1403 | type = read_token(&token); | 1415 | type = read_token(&token); |
1404 | if (type == EVENT_NONE) { | 1416 | if (type == EVENT_NONE) { |
1405 | do_warning("failed to find token"); | 1417 | do_warning_event(event, "failed to find token"); |
1406 | goto fail; | 1418 | goto fail; |
1407 | } | 1419 | } |
1408 | } | 1420 | } |
@@ -1636,7 +1648,7 @@ process_cond(struct event_format *event, struct print_arg *top, char **tok) | |||
1636 | right = alloc_arg(); | 1648 | right = alloc_arg(); |
1637 | 1649 | ||
1638 | if (!arg || !left || !right) { | 1650 | if (!arg || !left || !right) { |
1639 | do_warning("%s: not enough memory!", __func__); | 1651 | do_warning_event(event, "%s: not enough memory!", __func__); |
1640 | /* arg will be freed at out_free */ | 1652 | /* arg will be freed at out_free */ |
1641 | free_arg(left); | 1653 | free_arg(left); |
1642 | free_arg(right); | 1654 | free_arg(right); |
@@ -1686,7 +1698,7 @@ process_array(struct event_format *event, struct print_arg *top, char **tok) | |||
1686 | 1698 | ||
1687 | arg = alloc_arg(); | 1699 | arg = alloc_arg(); |
1688 | if (!arg) { | 1700 | if (!arg) { |
1689 | do_warning("%s: not enough memory!", __func__); | 1701 | do_warning_event(event, "%s: not enough memory!", __func__); |
1690 | /* '*tok' is set to top->op.op. No need to free. */ | 1702 | /* '*tok' is set to top->op.op. No need to free. */ |
1691 | *tok = NULL; | 1703 | *tok = NULL; |
1692 | return EVENT_ERROR; | 1704 | return EVENT_ERROR; |
@@ -1792,7 +1804,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
1792 | if (arg->type == PRINT_OP && !arg->op.left) { | 1804 | if (arg->type == PRINT_OP && !arg->op.left) { |
1793 | /* handle single op */ | 1805 | /* handle single op */ |
1794 | if (token[1]) { | 1806 | if (token[1]) { |
1795 | do_warning("bad op token %s", token); | 1807 | do_warning_event(event, "bad op token %s", token); |
1796 | goto out_free; | 1808 | goto out_free; |
1797 | } | 1809 | } |
1798 | switch (token[0]) { | 1810 | switch (token[0]) { |
@@ -1802,7 +1814,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
1802 | case '-': | 1814 | case '-': |
1803 | break; | 1815 | break; |
1804 | default: | 1816 | default: |
1805 | do_warning("bad op token %s", token); | 1817 | do_warning_event(event, "bad op token %s", token); |
1806 | goto out_free; | 1818 | goto out_free; |
1807 | 1819 | ||
1808 | } | 1820 | } |
@@ -1888,7 +1900,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
1888 | char *new_atom; | 1900 | char *new_atom; |
1889 | 1901 | ||
1890 | if (left->type != PRINT_ATOM) { | 1902 | if (left->type != PRINT_ATOM) { |
1891 | do_warning("bad pointer type"); | 1903 | do_warning_event(event, "bad pointer type"); |
1892 | goto out_free; | 1904 | goto out_free; |
1893 | } | 1905 | } |
1894 | new_atom = realloc(left->atom.atom, | 1906 | new_atom = realloc(left->atom.atom, |
@@ -1930,7 +1942,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
1930 | type = process_array(event, arg, tok); | 1942 | type = process_array(event, arg, tok); |
1931 | 1943 | ||
1932 | } else { | 1944 | } else { |
1933 | do_warning("unknown op '%s'", token); | 1945 | do_warning_event(event, "unknown op '%s'", token); |
1934 | event->flags |= EVENT_FL_FAILED; | 1946 | event->flags |= EVENT_FL_FAILED; |
1935 | /* the arg is now the left side */ | 1947 | /* the arg is now the left side */ |
1936 | goto out_free; | 1948 | goto out_free; |
@@ -1951,7 +1963,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
1951 | return type; | 1963 | return type; |
1952 | 1964 | ||
1953 | out_warn_free: | 1965 | out_warn_free: |
1954 | do_warning("%s: not enough memory!", __func__); | 1966 | do_warning_event(event, "%s: not enough memory!", __func__); |
1955 | out_free: | 1967 | out_free: |
1956 | free_token(token); | 1968 | free_token(token); |
1957 | *tok = NULL; | 1969 | *tok = NULL; |
@@ -2385,7 +2397,7 @@ process_flags(struct event_format *event, struct print_arg *arg, char **tok) | |||
2385 | 2397 | ||
2386 | field = alloc_arg(); | 2398 | field = alloc_arg(); |
2387 | if (!field) { | 2399 | if (!field) { |
2388 | do_warning("%s: not enough memory!", __func__); | 2400 | do_warning_event(event, "%s: not enough memory!", __func__); |
2389 | goto out_free; | 2401 | goto out_free; |
2390 | } | 2402 | } |
2391 | 2403 | ||
@@ -2438,7 +2450,7 @@ process_symbols(struct event_format *event, struct print_arg *arg, char **tok) | |||
2438 | 2450 | ||
2439 | field = alloc_arg(); | 2451 | field = alloc_arg(); |
2440 | if (!field) { | 2452 | if (!field) { |
2441 | do_warning("%s: not enough memory!", __func__); | 2453 | do_warning_event(event, "%s: not enough memory!", __func__); |
2442 | goto out_free; | 2454 | goto out_free; |
2443 | } | 2455 | } |
2444 | 2456 | ||
@@ -2477,7 +2489,7 @@ process_hex(struct event_format *event, struct print_arg *arg, char **tok) | |||
2477 | 2489 | ||
2478 | field = alloc_arg(); | 2490 | field = alloc_arg(); |
2479 | if (!field) { | 2491 | if (!field) { |
2480 | do_warning("%s: not enough memory!", __func__); | 2492 | do_warning_event(event, "%s: not enough memory!", __func__); |
2481 | goto out_free; | 2493 | goto out_free; |
2482 | } | 2494 | } |
2483 | 2495 | ||
@@ -2492,7 +2504,7 @@ process_hex(struct event_format *event, struct print_arg *arg, char **tok) | |||
2492 | 2504 | ||
2493 | field = alloc_arg(); | 2505 | field = alloc_arg(); |
2494 | if (!field) { | 2506 | if (!field) { |
2495 | do_warning("%s: not enough memory!", __func__); | 2507 | do_warning_event(event, "%s: not enough memory!", __func__); |
2496 | *tok = NULL; | 2508 | *tok = NULL; |
2497 | return EVENT_ERROR; | 2509 | return EVENT_ERROR; |
2498 | } | 2510 | } |
@@ -2555,7 +2567,7 @@ process_dynamic_array(struct event_format *event, struct print_arg *arg, char ** | |||
2555 | free_token(token); | 2567 | free_token(token); |
2556 | arg = alloc_arg(); | 2568 | arg = alloc_arg(); |
2557 | if (!arg) { | 2569 | if (!arg) { |
2558 | do_warning("%s: not enough memory!", __func__); | 2570 | do_warning_event(event, "%s: not enough memory!", __func__); |
2559 | *tok = NULL; | 2571 | *tok = NULL; |
2560 | return EVENT_ERROR; | 2572 | return EVENT_ERROR; |
2561 | } | 2573 | } |
@@ -2614,13 +2626,14 @@ process_paren(struct event_format *event, struct print_arg *arg, char **tok) | |||
2614 | 2626 | ||
2615 | /* prevous must be an atom */ | 2627 | /* prevous must be an atom */ |
2616 | if (arg->type != PRINT_ATOM) { | 2628 | if (arg->type != PRINT_ATOM) { |
2617 | do_warning("previous needed to be PRINT_ATOM"); | 2629 | do_warning_event(event, "previous needed to be PRINT_ATOM"); |
2618 | goto out_free; | 2630 | goto out_free; |
2619 | } | 2631 | } |
2620 | 2632 | ||
2621 | item_arg = alloc_arg(); | 2633 | item_arg = alloc_arg(); |
2622 | if (!item_arg) { | 2634 | if (!item_arg) { |
2623 | do_warning("%s: not enough memory!", __func__); | 2635 | do_warning_event(event, "%s: not enough memory!", |
2636 | __func__); | ||
2624 | goto out_free; | 2637 | goto out_free; |
2625 | } | 2638 | } |
2626 | 2639 | ||
@@ -2721,21 +2734,24 @@ process_func_handler(struct event_format *event, struct pevent_function_handler | |||
2721 | for (i = 0; i < func->nr_args; i++) { | 2734 | for (i = 0; i < func->nr_args; i++) { |
2722 | farg = alloc_arg(); | 2735 | farg = alloc_arg(); |
2723 | if (!farg) { | 2736 | if (!farg) { |
2724 | do_warning("%s: not enough memory!", __func__); | 2737 | do_warning_event(event, "%s: not enough memory!", |
2738 | __func__); | ||
2725 | return EVENT_ERROR; | 2739 | return EVENT_ERROR; |
2726 | } | 2740 | } |
2727 | 2741 | ||
2728 | type = process_arg(event, farg, &token); | 2742 | type = process_arg(event, farg, &token); |
2729 | if (i < (func->nr_args - 1)) { | 2743 | if (i < (func->nr_args - 1)) { |
2730 | if (type != EVENT_DELIM || strcmp(token, ",") != 0) { | 2744 | if (type != EVENT_DELIM || strcmp(token, ",") != 0) { |
2731 | warning("Error: function '%s()' expects %d arguments but event %s only uses %d", | 2745 | do_warning_event(event, |
2746 | "Error: function '%s()' expects %d arguments but event %s only uses %d", | ||
2732 | func->name, func->nr_args, | 2747 | func->name, func->nr_args, |
2733 | event->name, i + 1); | 2748 | event->name, i + 1); |
2734 | goto err; | 2749 | goto err; |
2735 | } | 2750 | } |
2736 | } else { | 2751 | } else { |
2737 | if (type != EVENT_DELIM || strcmp(token, ")") != 0) { | 2752 | if (type != EVENT_DELIM || strcmp(token, ")") != 0) { |
2738 | warning("Error: function '%s()' only expects %d arguments but event %s has more", | 2753 | do_warning_event(event, |
2754 | "Error: function '%s()' only expects %d arguments but event %s has more", | ||
2739 | func->name, func->nr_args, event->name); | 2755 | func->name, func->nr_args, event->name); |
2740 | goto err; | 2756 | goto err; |
2741 | } | 2757 | } |
@@ -2792,7 +2808,7 @@ process_function(struct event_format *event, struct print_arg *arg, | |||
2792 | return process_func_handler(event, func, arg, tok); | 2808 | return process_func_handler(event, func, arg, tok); |
2793 | } | 2809 | } |
2794 | 2810 | ||
2795 | do_warning("function %s not defined", token); | 2811 | do_warning_event(event, "function %s not defined", token); |
2796 | free_token(token); | 2812 | free_token(token); |
2797 | return EVENT_ERROR; | 2813 | return EVENT_ERROR; |
2798 | } | 2814 | } |
@@ -2878,7 +2894,7 @@ process_arg_token(struct event_format *event, struct print_arg *arg, | |||
2878 | 2894 | ||
2879 | case EVENT_ERROR ... EVENT_NEWLINE: | 2895 | case EVENT_ERROR ... EVENT_NEWLINE: |
2880 | default: | 2896 | default: |
2881 | do_warning("unexpected type %d", type); | 2897 | do_warning_event(event, "unexpected type %d", type); |
2882 | return EVENT_ERROR; | 2898 | return EVENT_ERROR; |
2883 | } | 2899 | } |
2884 | *tok = token; | 2900 | *tok = token; |
@@ -2901,7 +2917,8 @@ static int event_read_print_args(struct event_format *event, struct print_arg ** | |||
2901 | 2917 | ||
2902 | arg = alloc_arg(); | 2918 | arg = alloc_arg(); |
2903 | if (!arg) { | 2919 | if (!arg) { |
2904 | do_warning("%s: not enough memory!", __func__); | 2920 | do_warning_event(event, "%s: not enough memory!", |
2921 | __func__); | ||
2905 | return -1; | 2922 | return -1; |
2906 | } | 2923 | } |
2907 | 2924 | ||
@@ -3481,11 +3498,12 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg | |||
3481 | return val; | 3498 | return val; |
3482 | 3499 | ||
3483 | out_warning_op: | 3500 | out_warning_op: |
3484 | do_warning("%s: unknown op '%s'", __func__, arg->op.op); | 3501 | do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op); |
3485 | return 0; | 3502 | return 0; |
3486 | 3503 | ||
3487 | out_warning_field: | 3504 | out_warning_field: |
3488 | do_warning("%s: field %s not found", __func__, arg->field.name); | 3505 | do_warning_event(event, "%s: field %s not found", |
3506 | __func__, arg->field.name); | ||
3489 | return 0; | 3507 | return 0; |
3490 | } | 3508 | } |
3491 | 3509 | ||
@@ -3591,7 +3609,8 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3591 | } | 3609 | } |
3592 | str = malloc(len + 1); | 3610 | str = malloc(len + 1); |
3593 | if (!str) { | 3611 | if (!str) { |
3594 | do_warning("%s: not enough memory!", __func__); | 3612 | do_warning_event(event, "%s: not enough memory!", |
3613 | __func__); | ||
3595 | return; | 3614 | return; |
3596 | } | 3615 | } |
3597 | memcpy(str, data + field->offset, len); | 3616 | memcpy(str, data + field->offset, len); |
@@ -3697,7 +3716,8 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, | |||
3697 | return; | 3716 | return; |
3698 | 3717 | ||
3699 | out_warning_field: | 3718 | out_warning_field: |
3700 | do_warning("%s: field %s not found", __func__, arg->field.name); | 3719 | do_warning_event(event, "%s: field %s not found", |
3720 | __func__, arg->field.name); | ||
3701 | } | 3721 | } |
3702 | 3722 | ||
3703 | static unsigned long long | 3723 | static unsigned long long |
@@ -3742,14 +3762,16 @@ process_defined_func(struct trace_seq *s, void *data, int size, | |||
3742 | trace_seq_terminate(&str); | 3762 | trace_seq_terminate(&str); |
3743 | string = malloc(sizeof(*string)); | 3763 | string = malloc(sizeof(*string)); |
3744 | if (!string) { | 3764 | if (!string) { |
3745 | do_warning("%s(%d): malloc str", __func__, __LINE__); | 3765 | do_warning_event(event, "%s(%d): malloc str", |
3766 | __func__, __LINE__); | ||
3746 | goto out_free; | 3767 | goto out_free; |
3747 | } | 3768 | } |
3748 | string->next = strings; | 3769 | string->next = strings; |
3749 | string->str = strdup(str.buffer); | 3770 | string->str = strdup(str.buffer); |
3750 | if (!string->str) { | 3771 | if (!string->str) { |
3751 | free(string); | 3772 | free(string); |
3752 | do_warning("%s(%d): malloc str", __func__, __LINE__); | 3773 | do_warning_event(event, "%s(%d): malloc str", |
3774 | __func__, __LINE__); | ||
3753 | goto out_free; | 3775 | goto out_free; |
3754 | } | 3776 | } |
3755 | args[i] = (uintptr_t)string->str; | 3777 | args[i] = (uintptr_t)string->str; |
@@ -3761,7 +3783,7 @@ process_defined_func(struct trace_seq *s, void *data, int size, | |||
3761 | * Something went totally wrong, this is not | 3783 | * Something went totally wrong, this is not |
3762 | * an input error, something in this code broke. | 3784 | * an input error, something in this code broke. |
3763 | */ | 3785 | */ |
3764 | do_warning("Unexpected end of arguments\n"); | 3786 | do_warning_event(event, "Unexpected end of arguments\n"); |
3765 | goto out_free; | 3787 | goto out_free; |
3766 | } | 3788 | } |
3767 | farg = farg->next; | 3789 | farg = farg->next; |
@@ -3811,12 +3833,12 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc | |||
3811 | if (!field) { | 3833 | if (!field) { |
3812 | field = pevent_find_field(event, "buf"); | 3834 | field = pevent_find_field(event, "buf"); |
3813 | if (!field) { | 3835 | if (!field) { |
3814 | do_warning("can't find buffer field for binary printk"); | 3836 | do_warning_event(event, "can't find buffer field for binary printk"); |
3815 | return NULL; | 3837 | return NULL; |
3816 | } | 3838 | } |
3817 | ip_field = pevent_find_field(event, "ip"); | 3839 | ip_field = pevent_find_field(event, "ip"); |
3818 | if (!ip_field) { | 3840 | if (!ip_field) { |
3819 | do_warning("can't find ip field for binary printk"); | 3841 | do_warning_event(event, "can't find ip field for binary printk"); |
3820 | return NULL; | 3842 | return NULL; |
3821 | } | 3843 | } |
3822 | pevent->bprint_buf_field = field; | 3844 | pevent->bprint_buf_field = field; |
@@ -3830,7 +3852,8 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc | |||
3830 | */ | 3852 | */ |
3831 | args = alloc_arg(); | 3853 | args = alloc_arg(); |
3832 | if (!args) { | 3854 | if (!args) { |
3833 | do_warning("%s(%d): not enough memory!", __func__, __LINE__); | 3855 | do_warning_event(event, "%s(%d): not enough memory!", |
3856 | __func__, __LINE__); | ||
3834 | return NULL; | 3857 | return NULL; |
3835 | } | 3858 | } |
3836 | arg = args; | 3859 | arg = args; |
@@ -3896,7 +3919,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc | |||
3896 | bptr += vsize; | 3919 | bptr += vsize; |
3897 | arg = alloc_arg(); | 3920 | arg = alloc_arg(); |
3898 | if (!arg) { | 3921 | if (!arg) { |
3899 | do_warning("%s(%d): not enough memory!", | 3922 | do_warning_event(event, "%s(%d): not enough memory!", |
3900 | __func__, __LINE__); | 3923 | __func__, __LINE__); |
3901 | goto out_free; | 3924 | goto out_free; |
3902 | } | 3925 | } |
@@ -3919,7 +3942,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc | |||
3919 | case 's': | 3942 | case 's': |
3920 | arg = alloc_arg(); | 3943 | arg = alloc_arg(); |
3921 | if (!arg) { | 3944 | if (!arg) { |
3922 | do_warning("%s(%d): not enough memory!", | 3945 | do_warning_event(event, "%s(%d): not enough memory!", |
3923 | __func__, __LINE__); | 3946 | __func__, __LINE__); |
3924 | goto out_free; | 3947 | goto out_free; |
3925 | } | 3948 | } |
@@ -3959,7 +3982,7 @@ get_bprint_format(void *data, int size __maybe_unused, | |||
3959 | if (!field) { | 3982 | if (!field) { |
3960 | field = pevent_find_field(event, "fmt"); | 3983 | field = pevent_find_field(event, "fmt"); |
3961 | if (!field) { | 3984 | if (!field) { |
3962 | do_warning("can't find format field for binary printk"); | 3985 | do_warning_event(event, "can't find format field for binary printk"); |
3963 | return NULL; | 3986 | return NULL; |
3964 | } | 3987 | } |
3965 | pevent->bprint_fmt_field = field; | 3988 | pevent->bprint_fmt_field = field; |
@@ -4003,8 +4026,8 @@ static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size, | |||
4003 | arg->field.field = | 4026 | arg->field.field = |
4004 | pevent_find_any_field(event, arg->field.name); | 4027 | pevent_find_any_field(event, arg->field.name); |
4005 | if (!arg->field.field) { | 4028 | if (!arg->field.field) { |
4006 | do_warning("%s: field %s not found", | 4029 | do_warning_event(event, "%s: field %s not found", |
4007 | __func__, arg->field.name); | 4030 | __func__, arg->field.name); |
4008 | return; | 4031 | return; |
4009 | } | 4032 | } |
4010 | } | 4033 | } |
@@ -4176,7 +4199,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
4176 | case '*': | 4199 | case '*': |
4177 | /* The argument is the length. */ | 4200 | /* The argument is the length. */ |
4178 | if (!arg) { | 4201 | if (!arg) { |
4179 | do_warning("no argument match"); | 4202 | do_warning_event(event, "no argument match"); |
4180 | event->flags |= EVENT_FL_FAILED; | 4203 | event->flags |= EVENT_FL_FAILED; |
4181 | goto out_failed; | 4204 | goto out_failed; |
4182 | } | 4205 | } |
@@ -4213,7 +4236,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
4213 | case 'X': | 4236 | case 'X': |
4214 | case 'u': | 4237 | case 'u': |
4215 | if (!arg) { | 4238 | if (!arg) { |
4216 | do_warning("no argument match"); | 4239 | do_warning_event(event, "no argument match"); |
4217 | event->flags |= EVENT_FL_FAILED; | 4240 | event->flags |= EVENT_FL_FAILED; |
4218 | goto out_failed; | 4241 | goto out_failed; |
4219 | } | 4242 | } |
@@ -4223,7 +4246,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
4223 | 4246 | ||
4224 | /* should never happen */ | 4247 | /* should never happen */ |
4225 | if (len > 31) { | 4248 | if (len > 31) { |
4226 | do_warning("bad format!"); | 4249 | do_warning_event(event, "bad format!"); |
4227 | event->flags |= EVENT_FL_FAILED; | 4250 | event->flags |= EVENT_FL_FAILED; |
4228 | len = 31; | 4251 | len = 31; |
4229 | } | 4252 | } |
@@ -4290,13 +4313,13 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
4290 | trace_seq_printf(s, format, (long long)val); | 4313 | trace_seq_printf(s, format, (long long)val); |
4291 | break; | 4314 | break; |
4292 | default: | 4315 | default: |
4293 | do_warning("bad count (%d)", ls); | 4316 | do_warning_event(event, "bad count (%d)", ls); |
4294 | event->flags |= EVENT_FL_FAILED; | 4317 | event->flags |= EVENT_FL_FAILED; |
4295 | } | 4318 | } |
4296 | break; | 4319 | break; |
4297 | case 's': | 4320 | case 's': |
4298 | if (!arg) { | 4321 | if (!arg) { |
4299 | do_warning("no matching argument"); | 4322 | do_warning_event(event, "no matching argument"); |
4300 | event->flags |= EVENT_FL_FAILED; | 4323 | event->flags |= EVENT_FL_FAILED; |
4301 | goto out_failed; | 4324 | goto out_failed; |
4302 | } | 4325 | } |
@@ -4306,7 +4329,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
4306 | 4329 | ||
4307 | /* should never happen */ | 4330 | /* should never happen */ |
4308 | if (len > 31) { | 4331 | if (len > 31) { |
4309 | do_warning("bad format!"); | 4332 | do_warning_event(event, "bad format!"); |
4310 | event->flags |= EVENT_FL_FAILED; | 4333 | event->flags |= EVENT_FL_FAILED; |
4311 | len = 31; | 4334 | len = 31; |
4312 | } | 4335 | } |
diff --git a/tools/perf/Documentation/perf-bench.txt b/tools/perf/Documentation/perf-bench.txt index 7065cd6fbdfc..4464ad770d51 100644 --- a/tools/perf/Documentation/perf-bench.txt +++ b/tools/perf/Documentation/perf-bench.txt | |||
@@ -48,6 +48,12 @@ SUBSYSTEM | |||
48 | 'mem':: | 48 | 'mem':: |
49 | Memory access performance. | 49 | Memory access performance. |
50 | 50 | ||
51 | 'numa':: | ||
52 | NUMA scheduling and MM benchmarks. | ||
53 | |||
54 | 'futex':: | ||
55 | Futex stressing benchmarks. | ||
56 | |||
51 | 'all':: | 57 | 'all':: |
52 | All benchmark subsystems. | 58 | All benchmark subsystems. |
53 | 59 | ||
@@ -187,6 +193,22 @@ Show only the result with page faults before memset. | |||
187 | --no-prefault:: | 193 | --no-prefault:: |
188 | Show only the result without page faults before memset. | 194 | Show only the result without page faults before memset. |
189 | 195 | ||
196 | SUITES FOR 'numa' | ||
197 | ~~~~~~~~~~~~~~~~~ | ||
198 | *mem*:: | ||
199 | Suite for evaluating NUMA workloads. | ||
200 | |||
201 | SUITES FOR 'futex' | ||
202 | ~~~~~~~~~~~~~~~~~~ | ||
203 | *hash*:: | ||
204 | Suite for evaluating hash tables. | ||
205 | |||
206 | *wake*:: | ||
207 | Suite for evaluating wake calls. | ||
208 | |||
209 | *requeue*:: | ||
210 | Suite for evaluating requeue calls. | ||
211 | |||
190 | SEE ALSO | 212 | SEE ALSO |
191 | -------- | 213 | -------- |
192 | linkperf:perf[1] | 214 | linkperf:perf[1] |
diff --git a/tools/perf/Documentation/perf-top.txt b/tools/perf/Documentation/perf-top.txt index cdd8d4946dba..976b00c6cdb1 100644 --- a/tools/perf/Documentation/perf-top.txt +++ b/tools/perf/Documentation/perf-top.txt | |||
@@ -87,7 +87,6 @@ Default is to monitor all CPUS. | |||
87 | --realtime=<priority>:: | 87 | --realtime=<priority>:: |
88 | Collect data with this RT SCHED_FIFO priority. | 88 | Collect data with this RT SCHED_FIFO priority. |
89 | 89 | ||
90 | -s <symbol>:: | ||
91 | --sym-annotate=<symbol>:: | 90 | --sym-annotate=<symbol>:: |
92 | Annotate this symbol. | 91 | Annotate this symbol. |
93 | 92 | ||
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 50d875d970c4..e96923310d57 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
@@ -192,13 +192,13 @@ endif | |||
192 | export PERL_PATH | 192 | export PERL_PATH |
193 | 193 | ||
194 | $(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c | 194 | $(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c |
195 | $(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c | 195 | $(QUIET_FLEX)$(FLEX) -o $@ --header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) util/parse-events.l |
196 | 196 | ||
197 | $(OUTPUT)util/parse-events-bison.c: util/parse-events.y | 197 | $(OUTPUT)util/parse-events-bison.c: util/parse-events.y |
198 | $(QUIET_BISON)$(BISON) -v util/parse-events.y -d $(PARSER_DEBUG_BISON) -o $(OUTPUT)util/parse-events-bison.c -p parse_events_ | 198 | $(QUIET_BISON)$(BISON) -v util/parse-events.y -d $(PARSER_DEBUG_BISON) -o $(OUTPUT)util/parse-events-bison.c -p parse_events_ |
199 | 199 | ||
200 | $(OUTPUT)util/pmu-flex.c: util/pmu.l $(OUTPUT)util/pmu-bison.c | 200 | $(OUTPUT)util/pmu-flex.c: util/pmu.l $(OUTPUT)util/pmu-bison.c |
201 | $(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/pmu-flex.h -t util/pmu.l > $(OUTPUT)util/pmu-flex.c | 201 | $(QUIET_FLEX)$(FLEX) -o $@ --header-file=$(OUTPUT)util/pmu-flex.h util/pmu.l |
202 | 202 | ||
203 | $(OUTPUT)util/pmu-bison.c: util/pmu.y | 203 | $(OUTPUT)util/pmu-bison.c: util/pmu.y |
204 | $(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c -p perf_pmu_ | 204 | $(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c -p perf_pmu_ |
diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c index 97d86d828190..ebfa163b80b5 100644 --- a/tools/perf/bench/numa.c +++ b/tools/perf/bench/numa.c | |||
@@ -1593,6 +1593,10 @@ static void init_params(struct params *p, const char *name, int argc, const char | |||
1593 | p->data_rand_walk = true; | 1593 | p->data_rand_walk = true; |
1594 | p->nr_loops = -1; | 1594 | p->nr_loops = -1; |
1595 | p->init_random = true; | 1595 | p->init_random = true; |
1596 | p->mb_global_str = "1"; | ||
1597 | p->nr_proc = 1; | ||
1598 | p->nr_threads = 1; | ||
1599 | p->nr_secs = 5; | ||
1596 | p->run_all = argc == 1; | 1600 | p->run_all = argc == 1; |
1597 | } | 1601 | } |
1598 | 1602 | ||
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 8b0e1c9234d9..65a151e36067 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -174,13 +174,20 @@ static inline int perf_evsel__nr_cpus(struct perf_evsel *evsel) | |||
174 | 174 | ||
175 | static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel) | 175 | static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel) |
176 | { | 176 | { |
177 | memset(evsel->priv, 0, sizeof(struct perf_stat)); | 177 | int i; |
178 | struct perf_stat *ps = evsel->priv; | ||
179 | |||
180 | for (i = 0; i < 3; i++) | ||
181 | init_stats(&ps->res_stats[i]); | ||
178 | } | 182 | } |
179 | 183 | ||
180 | static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) | 184 | static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) |
181 | { | 185 | { |
182 | evsel->priv = zalloc(sizeof(struct perf_stat)); | 186 | evsel->priv = zalloc(sizeof(struct perf_stat)); |
183 | return evsel->priv == NULL ? -ENOMEM : 0; | 187 | if (evsel == NULL) |
188 | return -ENOMEM; | ||
189 | perf_evsel__reset_stat_priv(evsel); | ||
190 | return 0; | ||
184 | } | 191 | } |
185 | 192 | ||
186 | static void perf_evsel__free_stat_priv(struct perf_evsel *evsel) | 193 | static void perf_evsel__free_stat_priv(struct perf_evsel *evsel) |
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index c23418225c2c..ee21fa95ebcf 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile | |||
@@ -65,10 +65,9 @@ ifndef NO_LIBELF | |||
65 | ifdef LIBDW_DIR | 65 | ifdef LIBDW_DIR |
66 | LIBDW_CFLAGS := -I$(LIBDW_DIR)/include | 66 | LIBDW_CFLAGS := -I$(LIBDW_DIR)/include |
67 | LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib | 67 | LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib |
68 | |||
69 | FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS) | ||
70 | FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) -ldw | ||
71 | endif | 68 | endif |
69 | FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS) | ||
70 | FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) -ldw | ||
72 | endif | 71 | endif |
73 | 72 | ||
74 | # include ARCH specific config | 73 | # include ARCH specific config |
@@ -278,6 +277,8 @@ else | |||
278 | NO_LIBELF := 1 | 277 | NO_LIBELF := 1 |
279 | NO_DWARF := 1 | 278 | NO_DWARF := 1 |
280 | NO_DEMANGLE := 1 | 279 | NO_DEMANGLE := 1 |
280 | NO_LIBUNWIND := 1 | ||
281 | NO_LIBDW_DWARF_UNWIND := 1 | ||
281 | else | 282 | else |
282 | msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static); | 283 | msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static); |
283 | endif | 284 | endif |
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c index 653a8fe2db95..bfb186900ac0 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c | |||
@@ -504,6 +504,7 @@ static int do_test_code_reading(bool try_kcore) | |||
504 | if (ret < 0) { | 504 | if (ret < 0) { |
505 | if (!excl_kernel) { | 505 | if (!excl_kernel) { |
506 | excl_kernel = true; | 506 | excl_kernel = true; |
507 | perf_evlist__set_maps(evlist, NULL, NULL); | ||
507 | perf_evlist__delete(evlist); | 508 | perf_evlist__delete(evlist); |
508 | evlist = NULL; | 509 | evlist = NULL; |
509 | continue; | 510 | continue; |
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index df0238654698..562762117639 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c | |||
@@ -985,7 +985,7 @@ static int debuginfo__find_probes(struct debuginfo *dbg, | |||
985 | 985 | ||
986 | #if _ELFUTILS_PREREQ(0, 142) | 986 | #if _ELFUTILS_PREREQ(0, 142) |
987 | /* Get the call frame information from this dwarf */ | 987 | /* Get the call frame information from this dwarf */ |
988 | pf->cfi = dwarf_getcfi(dbg->dbg); | 988 | pf->cfi = dwarf_getcfi_elf(dwarf_getelf(dbg->dbg)); |
989 | #endif | 989 | #endif |
990 | 990 | ||
991 | off = 0; | 991 | off = 0; |
@@ -1441,13 +1441,15 @@ static int line_range_walk_cb(const char *fname, int lineno, | |||
1441 | void *data) | 1441 | void *data) |
1442 | { | 1442 | { |
1443 | struct line_finder *lf = data; | 1443 | struct line_finder *lf = data; |
1444 | int err; | ||
1444 | 1445 | ||
1445 | if ((strtailcmp(fname, lf->fname) != 0) || | 1446 | if ((strtailcmp(fname, lf->fname) != 0) || |
1446 | (lf->lno_s > lineno || lf->lno_e < lineno)) | 1447 | (lf->lno_s > lineno || lf->lno_e < lineno)) |
1447 | return 0; | 1448 | return 0; |
1448 | 1449 | ||
1449 | if (line_range_add_line(fname, lineno, lf->lr) < 0) | 1450 | err = line_range_add_line(fname, lineno, lf->lr); |
1450 | return -EINVAL; | 1451 | if (err < 0 && err != -EEXIST) |
1452 | return err; | ||
1451 | 1453 | ||
1452 | return 0; | 1454 | return 0; |
1453 | } | 1455 | } |
@@ -1473,14 +1475,15 @@ static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf) | |||
1473 | 1475 | ||
1474 | static int line_range_inline_cb(Dwarf_Die *in_die, void *data) | 1476 | static int line_range_inline_cb(Dwarf_Die *in_die, void *data) |
1475 | { | 1477 | { |
1476 | find_line_range_by_line(in_die, data); | 1478 | int ret = find_line_range_by_line(in_die, data); |
1477 | 1479 | ||
1478 | /* | 1480 | /* |
1479 | * We have to check all instances of inlined function, because | 1481 | * We have to check all instances of inlined function, because |
1480 | * some execution paths can be optimized out depends on the | 1482 | * some execution paths can be optimized out depends on the |
1481 | * function argument of instances | 1483 | * function argument of instances. However, if an error occurs, |
1484 | * it should be handled by the caller. | ||
1482 | */ | 1485 | */ |
1483 | return 0; | 1486 | return ret < 0 ? ret : 0; |
1484 | } | 1487 | } |
1485 | 1488 | ||
1486 | /* Search function definition from function name */ | 1489 | /* Search function definition from function name */ |