diff options
author | Jiri Kosina <jkosina@suse.cz> | 2014-06-04 07:09:01 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2014-06-04 07:09:01 -0400 |
commit | af5666e0f76023d9c296016024297903a4c83108 (patch) | |
tree | 9397e7a41dd3eb0c0e14a6407a8e8f12abed4fc5 /tools | |
parent | 1b15d2e5b8077670b1e6a33250a0d9577efff4a5 (diff) | |
parent | 368c96640d10a145da5f258f2d2833668d4f3629 (diff) |
Merge branches 'for-3.15/upstream-fixes' and 'for-3.16/upstream' into for-linus
Conflicts:
drivers/hid/hid-sensor-hub.c
Diffstat (limited to 'tools')
-rw-r--r-- | tools/lib/lockdep/Makefile | 15 | ||||
-rw-r--r-- | tools/lib/lockdep/uinclude/linux/lockdep.h | 3 | ||||
-rw-r--r-- | tools/lib/traceevent/event-parse.c | 109 | ||||
-rw-r--r-- | tools/net/bpf_dbg.c | 119 | ||||
-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/config/Makefile.arch | 3 | ||||
-rw-r--r-- | tools/perf/perf.h | 8 | ||||
-rw-r--r-- | tools/perf/tests/code-reading.c | 1 | ||||
-rw-r--r-- | tools/perf/util/probe-finder.c | 15 | ||||
-rw-r--r-- | tools/power/x86/turbostat/turbostat.8 | 127 | ||||
-rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 240 | ||||
-rw-r--r-- | tools/testing/ktest/examples/kvm.conf | 4 | ||||
-rw-r--r-- | tools/vm/page-types.c | 170 |
18 files changed, 506 insertions, 357 deletions
diff --git a/tools/lib/lockdep/Makefile b/tools/lib/lockdep/Makefile index 07b0b7542511..cb09d3ff8f58 100644 --- a/tools/lib/lockdep/Makefile +++ b/tools/lib/lockdep/Makefile | |||
@@ -1,13 +1,8 @@ | |||
1 | # liblockdep version | ||
2 | LL_VERSION = 0 | ||
3 | LL_PATCHLEVEL = 0 | ||
4 | LL_EXTRAVERSION = 1 | ||
5 | |||
6 | # file format version | 1 | # file format version |
7 | FILE_VERSION = 1 | 2 | FILE_VERSION = 1 |
8 | 3 | ||
9 | MAKEFLAGS += --no-print-directory | 4 | MAKEFLAGS += --no-print-directory |
10 | 5 | LIBLOCKDEP_VERSION=$(shell make -sC ../../.. kernelversion) | |
11 | 6 | ||
12 | # Makefiles suck: This macro sets a default value of $(2) for the | 7 | # Makefiles suck: This macro sets a default value of $(2) for the |
13 | # variable named by $(1), unless the variable has been set by | 8 | # variable named by $(1), unless the variable has been set by |
@@ -98,7 +93,7 @@ export prefix libdir bindir src obj | |||
98 | libdir_SQ = $(subst ','\'',$(libdir)) | 93 | libdir_SQ = $(subst ','\'',$(libdir)) |
99 | bindir_SQ = $(subst ','\'',$(bindir)) | 94 | bindir_SQ = $(subst ','\'',$(bindir)) |
100 | 95 | ||
101 | LIB_FILE = liblockdep.a liblockdep.so | 96 | LIB_FILE = liblockdep.a liblockdep.so.$(LIBLOCKDEP_VERSION) |
102 | BIN_FILE = lockdep | 97 | BIN_FILE = lockdep |
103 | 98 | ||
104 | CONFIG_INCLUDES = | 99 | CONFIG_INCLUDES = |
@@ -110,8 +105,6 @@ N = | |||
110 | 105 | ||
111 | export Q VERBOSE | 106 | export Q VERBOSE |
112 | 107 | ||
113 | LIBLOCKDEP_VERSION = $(LL_VERSION).$(LL_PATCHLEVEL).$(LL_EXTRAVERSION) | ||
114 | |||
115 | INCLUDES = -I. -I/usr/local/include -I./uinclude -I./include $(CONFIG_INCLUDES) | 108 | INCLUDES = -I. -I/usr/local/include -I./uinclude -I./include $(CONFIG_INCLUDES) |
116 | 109 | ||
117 | # Set compile option CFLAGS if not set elsewhere | 110 | # Set compile option CFLAGS if not set elsewhere |
@@ -146,7 +139,7 @@ do_app_build = \ | |||
146 | 139 | ||
147 | do_compile_shared_library = \ | 140 | do_compile_shared_library = \ |
148 | ($(print_shared_lib_compile) \ | 141 | ($(print_shared_lib_compile) \ |
149 | $(CC) --shared $^ -o $@ -lpthread -ldl) | 142 | $(CC) --shared $^ -o $@ -lpthread -ldl -Wl,-soname='"$@"';$(shell ln -s $@ liblockdep.so)) |
150 | 143 | ||
151 | do_build_static_lib = \ | 144 | do_build_static_lib = \ |
152 | ($(print_static_lib_build) \ | 145 | ($(print_static_lib_build) \ |
@@ -177,7 +170,7 @@ all: all_cmd | |||
177 | 170 | ||
178 | all_cmd: $(CMD_TARGETS) | 171 | all_cmd: $(CMD_TARGETS) |
179 | 172 | ||
180 | liblockdep.so: $(PEVENT_LIB_OBJS) | 173 | liblockdep.so.$(LIBLOCKDEP_VERSION): $(PEVENT_LIB_OBJS) |
181 | $(Q)$(do_compile_shared_library) | 174 | $(Q)$(do_compile_shared_library) |
182 | 175 | ||
183 | liblockdep.a: $(PEVENT_LIB_OBJS) | 176 | liblockdep.a: $(PEVENT_LIB_OBJS) |
diff --git a/tools/lib/lockdep/uinclude/linux/lockdep.h b/tools/lib/lockdep/uinclude/linux/lockdep.h index d0f5d6e50214..c1552c28507e 100644 --- a/tools/lib/lockdep/uinclude/linux/lockdep.h +++ b/tools/lib/lockdep/uinclude/linux/lockdep.h | |||
@@ -10,6 +10,9 @@ | |||
10 | 10 | ||
11 | #define MAX_LOCK_DEPTH 2000UL | 11 | #define MAX_LOCK_DEPTH 2000UL |
12 | 12 | ||
13 | #define asmlinkage | ||
14 | #define __visible | ||
15 | |||
13 | #include "../../../include/linux/lockdep.h" | 16 | #include "../../../include/linux/lockdep.h" |
14 | 17 | ||
15 | struct task_struct { | 18 | struct task_struct { |
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/net/bpf_dbg.c b/tools/net/bpf_dbg.c index 65dc757f7f7b..bb31813e43dd 100644 --- a/tools/net/bpf_dbg.c +++ b/tools/net/bpf_dbg.c | |||
@@ -87,9 +87,6 @@ | |||
87 | __attribute__ ((format (printf, (pos_fmtstr), (pos_fmtargs)))) | 87 | __attribute__ ((format (printf, (pos_fmtstr), (pos_fmtargs)))) |
88 | #endif | 88 | #endif |
89 | 89 | ||
90 | #define CMD(_name, _func) { .name = _name, .func = _func, } | ||
91 | #define OP(_op, _name) [_op] = _name | ||
92 | |||
93 | enum { | 90 | enum { |
94 | CMD_OK, | 91 | CMD_OK, |
95 | CMD_ERR, | 92 | CMD_ERR, |
@@ -145,32 +142,32 @@ static size_t pcap_map_size = 0; | |||
145 | static char *pcap_ptr_va_start, *pcap_ptr_va_curr; | 142 | static char *pcap_ptr_va_start, *pcap_ptr_va_curr; |
146 | 143 | ||
147 | static const char * const op_table[] = { | 144 | static const char * const op_table[] = { |
148 | OP(BPF_ST, "st"), | 145 | [BPF_ST] = "st", |
149 | OP(BPF_STX, "stx"), | 146 | [BPF_STX] = "stx", |
150 | OP(BPF_LD_B, "ldb"), | 147 | [BPF_LD_B] = "ldb", |
151 | OP(BPF_LD_H, "ldh"), | 148 | [BPF_LD_H] = "ldh", |
152 | OP(BPF_LD_W, "ld"), | 149 | [BPF_LD_W] = "ld", |
153 | OP(BPF_LDX, "ldx"), | 150 | [BPF_LDX] = "ldx", |
154 | OP(BPF_LDX_B, "ldxb"), | 151 | [BPF_LDX_B] = "ldxb", |
155 | OP(BPF_JMP_JA, "ja"), | 152 | [BPF_JMP_JA] = "ja", |
156 | OP(BPF_JMP_JEQ, "jeq"), | 153 | [BPF_JMP_JEQ] = "jeq", |
157 | OP(BPF_JMP_JGT, "jgt"), | 154 | [BPF_JMP_JGT] = "jgt", |
158 | OP(BPF_JMP_JGE, "jge"), | 155 | [BPF_JMP_JGE] = "jge", |
159 | OP(BPF_JMP_JSET, "jset"), | 156 | [BPF_JMP_JSET] = "jset", |
160 | OP(BPF_ALU_ADD, "add"), | 157 | [BPF_ALU_ADD] = "add", |
161 | OP(BPF_ALU_SUB, "sub"), | 158 | [BPF_ALU_SUB] = "sub", |
162 | OP(BPF_ALU_MUL, "mul"), | 159 | [BPF_ALU_MUL] = "mul", |
163 | OP(BPF_ALU_DIV, "div"), | 160 | [BPF_ALU_DIV] = "div", |
164 | OP(BPF_ALU_MOD, "mod"), | 161 | [BPF_ALU_MOD] = "mod", |
165 | OP(BPF_ALU_NEG, "neg"), | 162 | [BPF_ALU_NEG] = "neg", |
166 | OP(BPF_ALU_AND, "and"), | 163 | [BPF_ALU_AND] = "and", |
167 | OP(BPF_ALU_OR, "or"), | 164 | [BPF_ALU_OR] = "or", |
168 | OP(BPF_ALU_XOR, "xor"), | 165 | [BPF_ALU_XOR] = "xor", |
169 | OP(BPF_ALU_LSH, "lsh"), | 166 | [BPF_ALU_LSH] = "lsh", |
170 | OP(BPF_ALU_RSH, "rsh"), | 167 | [BPF_ALU_RSH] = "rsh", |
171 | OP(BPF_MISC_TAX, "tax"), | 168 | [BPF_MISC_TAX] = "tax", |
172 | OP(BPF_MISC_TXA, "txa"), | 169 | [BPF_MISC_TXA] = "txa", |
173 | OP(BPF_RET, "ret"), | 170 | [BPF_RET] = "ret", |
174 | }; | 171 | }; |
175 | 172 | ||
176 | static __check_format_printf(1, 2) int rl_printf(const char *fmt, ...) | 173 | static __check_format_printf(1, 2) int rl_printf(const char *fmt, ...) |
@@ -1127,7 +1124,6 @@ static int cmd_step(char *num) | |||
1127 | static int cmd_select(char *num) | 1124 | static int cmd_select(char *num) |
1128 | { | 1125 | { |
1129 | unsigned int which, i; | 1126 | unsigned int which, i; |
1130 | struct pcap_pkthdr *hdr; | ||
1131 | bool have_next = true; | 1127 | bool have_next = true; |
1132 | 1128 | ||
1133 | if (!pcap_loaded() || strlen(num) == 0) | 1129 | if (!pcap_loaded() || strlen(num) == 0) |
@@ -1144,7 +1140,7 @@ static int cmd_select(char *num) | |||
1144 | 1140 | ||
1145 | for (i = 0; i < which && (have_next = pcap_next_pkt()); i++) | 1141 | for (i = 0; i < which && (have_next = pcap_next_pkt()); i++) |
1146 | /* noop */; | 1142 | /* noop */; |
1147 | if (!have_next || (hdr = pcap_curr_pkt()) == NULL) { | 1143 | if (!have_next || pcap_curr_pkt() == NULL) { |
1148 | rl_printf("no packet #%u available!\n", which); | 1144 | rl_printf("no packet #%u available!\n", which); |
1149 | pcap_reset_pkt(); | 1145 | pcap_reset_pkt(); |
1150 | return CMD_ERR; | 1146 | return CMD_ERR; |
@@ -1177,9 +1173,8 @@ static int cmd_breakpoint(char *subcmd) | |||
1177 | static int cmd_run(char *num) | 1173 | static int cmd_run(char *num) |
1178 | { | 1174 | { |
1179 | static uint32_t pass = 0, fail = 0; | 1175 | static uint32_t pass = 0, fail = 0; |
1180 | struct pcap_pkthdr *hdr; | ||
1181 | bool has_limit = true; | 1176 | bool has_limit = true; |
1182 | int ret, pkts = 0, i = 0; | 1177 | int pkts = 0, i = 0; |
1183 | 1178 | ||
1184 | if (!bpf_prog_loaded() || !pcap_loaded()) | 1179 | if (!bpf_prog_loaded() || !pcap_loaded()) |
1185 | return CMD_ERR; | 1180 | return CMD_ERR; |
@@ -1189,10 +1184,10 @@ static int cmd_run(char *num) | |||
1189 | has_limit = false; | 1184 | has_limit = false; |
1190 | 1185 | ||
1191 | do { | 1186 | do { |
1192 | hdr = pcap_curr_pkt(); | 1187 | struct pcap_pkthdr *hdr = pcap_curr_pkt(); |
1193 | ret = bpf_run_all(bpf_image, bpf_prog_len, | 1188 | int ret = bpf_run_all(bpf_image, bpf_prog_len, |
1194 | (uint8_t *) hdr + sizeof(*hdr), | 1189 | (uint8_t *) hdr + sizeof(*hdr), |
1195 | hdr->caplen, hdr->len); | 1190 | hdr->caplen, hdr->len); |
1196 | if (ret > 0) | 1191 | if (ret > 0) |
1197 | pass++; | 1192 | pass++; |
1198 | else if (ret == 0) | 1193 | else if (ret == 0) |
@@ -1245,14 +1240,14 @@ static int cmd_quit(char *dontcare) | |||
1245 | } | 1240 | } |
1246 | 1241 | ||
1247 | static const struct shell_cmd cmds[] = { | 1242 | static const struct shell_cmd cmds[] = { |
1248 | CMD("load", cmd_load), | 1243 | { .name = "load", .func = cmd_load }, |
1249 | CMD("select", cmd_select), | 1244 | { .name = "select", .func = cmd_select }, |
1250 | CMD("step", cmd_step), | 1245 | { .name = "step", .func = cmd_step }, |
1251 | CMD("run", cmd_run), | 1246 | { .name = "run", .func = cmd_run }, |
1252 | CMD("breakpoint", cmd_breakpoint), | 1247 | { .name = "breakpoint", .func = cmd_breakpoint }, |
1253 | CMD("disassemble", cmd_disassemble), | 1248 | { .name = "disassemble", .func = cmd_disassemble }, |
1254 | CMD("dump", cmd_dump), | 1249 | { .name = "dump", .func = cmd_dump }, |
1255 | CMD("quit", cmd_quit), | 1250 | { .name = "quit", .func = cmd_quit }, |
1256 | }; | 1251 | }; |
1257 | 1252 | ||
1258 | static int execf(char *arg) | 1253 | static int execf(char *arg) |
@@ -1280,7 +1275,6 @@ out: | |||
1280 | static char *shell_comp_gen(const char *buf, int state) | 1275 | static char *shell_comp_gen(const char *buf, int state) |
1281 | { | 1276 | { |
1282 | static int list_index, len; | 1277 | static int list_index, len; |
1283 | const char *name; | ||
1284 | 1278 | ||
1285 | if (!state) { | 1279 | if (!state) { |
1286 | list_index = 0; | 1280 | list_index = 0; |
@@ -1288,9 +1282,9 @@ static char *shell_comp_gen(const char *buf, int state) | |||
1288 | } | 1282 | } |
1289 | 1283 | ||
1290 | for (; list_index < array_size(cmds); ) { | 1284 | for (; list_index < array_size(cmds); ) { |
1291 | name = cmds[list_index].name; | 1285 | const char *name = cmds[list_index].name; |
1292 | list_index++; | ||
1293 | 1286 | ||
1287 | list_index++; | ||
1294 | if (strncmp(name, buf, len) == 0) | 1288 | if (strncmp(name, buf, len) == 0) |
1295 | return strdup(name); | 1289 | return strdup(name); |
1296 | } | 1290 | } |
@@ -1322,16 +1316,9 @@ static void init_shell(FILE *fin, FILE *fout) | |||
1322 | { | 1316 | { |
1323 | char file[128]; | 1317 | char file[128]; |
1324 | 1318 | ||
1325 | memset(file, 0, sizeof(file)); | 1319 | snprintf(file, sizeof(file), "%s/.bpf_dbg_history", getenv("HOME")); |
1326 | snprintf(file, sizeof(file) - 1, | ||
1327 | "%s/.bpf_dbg_history", getenv("HOME")); | ||
1328 | |||
1329 | read_history(file); | 1320 | read_history(file); |
1330 | 1321 | ||
1331 | memset(file, 0, sizeof(file)); | ||
1332 | snprintf(file, sizeof(file) - 1, | ||
1333 | "%s/.bpf_dbg_init", getenv("HOME")); | ||
1334 | |||
1335 | rl_instream = fin; | 1322 | rl_instream = fin; |
1336 | rl_outstream = fout; | 1323 | rl_outstream = fout; |
1337 | 1324 | ||
@@ -1348,37 +1335,41 @@ static void init_shell(FILE *fin, FILE *fout) | |||
1348 | rl_bind_key_in_map('\t', rl_complete, emacs_meta_keymap); | 1335 | rl_bind_key_in_map('\t', rl_complete, emacs_meta_keymap); |
1349 | rl_bind_key_in_map('\033', rl_complete, emacs_meta_keymap); | 1336 | rl_bind_key_in_map('\033', rl_complete, emacs_meta_keymap); |
1350 | 1337 | ||
1338 | snprintf(file, sizeof(file), "%s/.bpf_dbg_init", getenv("HOME")); | ||
1351 | rl_read_init_file(file); | 1339 | rl_read_init_file(file); |
1340 | |||
1352 | rl_prep_terminal(0); | 1341 | rl_prep_terminal(0); |
1353 | rl_set_signals(); | 1342 | rl_set_signals(); |
1354 | 1343 | ||
1355 | signal(SIGINT, intr_shell); | 1344 | signal(SIGINT, intr_shell); |
1356 | } | 1345 | } |
1357 | 1346 | ||
1358 | static void exit_shell(void) | 1347 | static void exit_shell(FILE *fin, FILE *fout) |
1359 | { | 1348 | { |
1360 | char file[128]; | 1349 | char file[128]; |
1361 | 1350 | ||
1362 | memset(file, 0, sizeof(file)); | 1351 | snprintf(file, sizeof(file), "%s/.bpf_dbg_history", getenv("HOME")); |
1363 | snprintf(file, sizeof(file) - 1, | ||
1364 | "%s/.bpf_dbg_history", getenv("HOME")); | ||
1365 | |||
1366 | write_history(file); | 1352 | write_history(file); |
1353 | |||
1367 | clear_history(); | 1354 | clear_history(); |
1368 | rl_deprep_terminal(); | 1355 | rl_deprep_terminal(); |
1369 | 1356 | ||
1370 | try_close_pcap(); | 1357 | try_close_pcap(); |
1358 | |||
1359 | if (fin != stdin) | ||
1360 | fclose(fin); | ||
1361 | if (fout != stdout) | ||
1362 | fclose(fout); | ||
1371 | } | 1363 | } |
1372 | 1364 | ||
1373 | static int run_shell_loop(FILE *fin, FILE *fout) | 1365 | static int run_shell_loop(FILE *fin, FILE *fout) |
1374 | { | 1366 | { |
1375 | char *buf; | 1367 | char *buf; |
1376 | int ret; | ||
1377 | 1368 | ||
1378 | init_shell(fin, fout); | 1369 | init_shell(fin, fout); |
1379 | 1370 | ||
1380 | while ((buf = readline("> ")) != NULL) { | 1371 | while ((buf = readline("> ")) != NULL) { |
1381 | ret = execf(buf); | 1372 | int ret = execf(buf); |
1382 | if (ret == CMD_EX) | 1373 | if (ret == CMD_EX) |
1383 | break; | 1374 | break; |
1384 | if (ret == CMD_OK && strlen(buf) > 0) | 1375 | if (ret == CMD_OK && strlen(buf) > 0) |
@@ -1387,7 +1378,7 @@ static int run_shell_loop(FILE *fin, FILE *fout) | |||
1387 | free(buf); | 1378 | free(buf); |
1388 | } | 1379 | } |
1389 | 1380 | ||
1390 | exit_shell(); | 1381 | exit_shell(fin, fout); |
1391 | return 0; | 1382 | return 0; |
1392 | } | 1383 | } |
1393 | 1384 | ||
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/config/Makefile.arch b/tools/perf/config/Makefile.arch index fef8ae922800..4b06719ee984 100644 --- a/tools/perf/config/Makefile.arch +++ b/tools/perf/config/Makefile.arch | |||
@@ -5,7 +5,8 @@ ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | |||
5 | -e s/arm.*/arm/ -e s/sa110/arm/ \ | 5 | -e s/arm.*/arm/ -e s/sa110/arm/ \ |
6 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ | 6 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ |
7 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ | 7 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ |
8 | -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ ) | 8 | -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ \ |
9 | -e s/tile.*/tile/ ) | ||
9 | 10 | ||
10 | # Additional ARCH settings for x86 | 11 | # Additional ARCH settings for x86 |
11 | ifeq ($(ARCH),i386) | 12 | ifeq ($(ARCH),i386) |
diff --git a/tools/perf/perf.h b/tools/perf/perf.h index e18a8b5e6953..5c11ecad02a9 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h | |||
@@ -145,6 +145,14 @@ | |||
145 | #define CPUINFO_PROC "core ID" | 145 | #define CPUINFO_PROC "core ID" |
146 | #endif | 146 | #endif |
147 | 147 | ||
148 | #ifdef __tile__ | ||
149 | #define mb() asm volatile ("mf" ::: "memory") | ||
150 | #define wmb() asm volatile ("mf" ::: "memory") | ||
151 | #define rmb() asm volatile ("mf" ::: "memory") | ||
152 | #define cpu_relax() asm volatile ("mfspr zero, PASS" ::: "memory") | ||
153 | #define CPUINFO_PROC "model name" | ||
154 | #endif | ||
155 | |||
148 | #define barrier() asm volatile ("" ::: "memory") | 156 | #define barrier() asm volatile ("" ::: "memory") |
149 | 157 | ||
150 | #ifndef cpu_relax | 158 | #ifndef cpu_relax |
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 */ |
diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8 index b4ddb748356c..56bfb523c5bb 100644 --- a/tools/power/x86/turbostat/turbostat.8 +++ b/tools/power/x86/turbostat/turbostat.8 | |||
@@ -47,21 +47,22 @@ displays the statistics gathered since it was forked. | |||
47 | .PP | 47 | .PP |
48 | .SH FIELD DESCRIPTIONS | 48 | .SH FIELD DESCRIPTIONS |
49 | .nf | 49 | .nf |
50 | \fBpk\fP processor package number. | 50 | \fBPackage\fP processor package number. |
51 | \fBcor\fP processor core number. | 51 | \fBCore\fP processor core number. |
52 | \fBCPU\fP Linux CPU (logical processor) number. | 52 | \fBCPU\fP Linux CPU (logical processor) number. |
53 | Note that multiple CPUs per core indicate support for Intel(R) Hyper-Threading Technology. | 53 | Note that multiple CPUs per core indicate support for Intel(R) Hyper-Threading Technology. |
54 | \fB%c0\fP percent of the interval that the CPU retired instructions. | 54 | \fBAVG_MHz\fP number of cycles executed divided by time elapsed. |
55 | \fBGHz\fP average clock rate while the CPU was in c0 state. | 55 | \fB%Buzy\fP percent of the interval that the CPU retired instructions, aka. % of time in "C0" state. |
56 | \fBTSC\fP average GHz that the TSC ran during the entire interval. | 56 | \fBBzy_MHz\fP average clock rate while the CPU was busy (in "c0" state). |
57 | \fB%c1, %c3, %c6, %c7\fP show the percentage residency in hardware core idle states. | 57 | \fBTSC_MHz\fP average MHz that the TSC ran during the entire interval. |
58 | \fBCTMP\fP Degrees Celsius reported by the per-core Digital Thermal Sensor. | 58 | \fBCPU%c1, CPU%c3, CPU%c6, CPU%c7\fP show the percentage residency in hardware core idle states. |
59 | \fBPTMP\fP Degrees Celsius reported by the per-package Package Thermal Monitor. | 59 | \fBCoreTmp\fP Degrees Celsius reported by the per-core Digital Thermal Sensor. |
60 | \fB%pc2, %pc3, %pc6, %pc7\fP percentage residency in hardware package idle states. | 60 | \fBPkgTtmp\fP Degrees Celsius reported by the per-package Package Thermal Monitor. |
61 | \fBPkg_W\fP Watts consumed by the whole package. | 61 | \fBPkg%pc2, Pkg%pc3, Pkg%pc6, Pkg%pc7\fP percentage residency in hardware package idle states. |
62 | \fBCor_W\fP Watts consumed by the core part of the package. | 62 | \fBPkgWatt\fP Watts consumed by the whole package. |
63 | \fBGFX_W\fP Watts consumed by the Graphics part of the package -- available only on client processors. | 63 | \fBCorWatt\fP Watts consumed by the core part of the package. |
64 | \fBRAM_W\fP Watts consumed by the DRAM DIMMS -- available only on server processors. | 64 | \fBGFXWatt\fP Watts consumed by the Graphics part of the package -- available only on client processors. |
65 | \fBRAMWatt\fP Watts consumed by the DRAM DIMMS -- available only on server processors. | ||
65 | \fBPKG_%\fP percent of the interval that RAPL throttling was active on the Package. | 66 | \fBPKG_%\fP percent of the interval that RAPL throttling was active on the Package. |
66 | \fBRAM_%\fP percent of the interval that RAPL throttling was active on DRAM. | 67 | \fBRAM_%\fP percent of the interval that RAPL throttling was active on DRAM. |
67 | .fi | 68 | .fi |
@@ -78,29 +79,17 @@ For Watts columns, the summary is a system total. | |||
78 | Subsequent rows show per-CPU statistics. | 79 | Subsequent rows show per-CPU statistics. |
79 | 80 | ||
80 | .nf | 81 | .nf |
81 | [root@sandy]# ./turbostat | 82 | [root@ivy]# ./turbostat |
82 | cor CPU %c0 GHz TSC %c1 %c3 %c6 %c7 CTMP PTMP %pc2 %pc3 %pc6 %pc7 Pkg_W Cor_W GFX_W | 83 | Core CPU Avg_MHz %Busy Bzy_MHz TSC_MHz SMI CPU%c1 CPU%c3 CPU%c6 CPU%c7 CoreTmp PkgTmp Pkg%pc2 Pkg%pc3 Pkg%pc6 Pkg%pc7 PkgWatt CorWatt GFXWatt |
83 | 0.06 0.80 2.29 0.11 0.00 0.00 99.83 47 40 0.26 0.01 0.44 98.78 3.49 0.12 0.14 | 84 | - - 6 0.36 1596 3492 0 0.59 0.01 99.04 0.00 23 24 23.82 0.01 72.47 0.00 6.40 1.01 0.00 |
84 | 0 0 0.07 0.80 2.29 0.07 0.00 0.00 99.86 40 40 0.26 0.01 0.44 98.78 3.49 0.12 0.14 | 85 | 0 0 9 0.58 1596 3492 0 0.28 0.01 99.13 0.00 23 24 23.82 0.01 72.47 0.00 6.40 1.01 0.00 |
85 | 0 4 0.03 0.80 2.29 0.12 | 86 | 0 4 1 0.07 1596 3492 0 0.79 |
86 | 1 1 0.04 0.80 2.29 0.25 0.01 0.00 99.71 40 | 87 | 1 1 10 0.65 1596 3492 0 0.59 0.00 98.76 0.00 23 |
87 | 1 5 0.16 0.80 2.29 0.13 | 88 | 1 5 5 0.28 1596 3492 0 0.95 |
88 | 2 2 0.05 0.80 2.29 0.06 0.01 0.00 99.88 40 | 89 | 2 2 10 0.66 1596 3492 0 0.41 0.01 98.92 0.00 23 |
89 | 2 6 0.03 0.80 2.29 0.08 | 90 | 2 6 2 0.10 1597 3492 0 0.97 |
90 | 3 3 0.05 0.80 2.29 0.08 0.00 0.00 99.87 47 | 91 | 3 3 3 0.20 1596 3492 0 0.44 0.00 99.37 0.00 23 |
91 | 3 7 0.04 0.84 2.29 0.09 | 92 | 3 7 5 0.31 1596 3492 0 0.33 |
92 | .fi | ||
93 | .SH SUMMARY EXAMPLE | ||
94 | The "-s" option prints the column headers just once, | ||
95 | and then the one line system summary for each sample interval. | ||
96 | |||
97 | .nf | ||
98 | [root@wsm]# turbostat -S | ||
99 | %c0 GHz TSC %c1 %c3 %c6 CTMP %pc3 %pc6 | ||
100 | 1.40 2.81 3.38 10.78 43.47 44.35 42 13.67 2.09 | ||
101 | 1.34 2.90 3.38 11.48 58.96 28.23 41 19.89 0.15 | ||
102 | 1.55 2.72 3.38 26.73 37.66 34.07 42 2.53 2.80 | ||
103 | 1.37 2.83 3.38 16.95 60.05 21.63 42 5.76 0.20 | ||
104 | .fi | 93 | .fi |
105 | .SH VERBOSE EXAMPLE | 94 | .SH VERBOSE EXAMPLE |
106 | The "-v" option adds verbosity to the output: | 95 | The "-v" option adds verbosity to the output: |
@@ -154,55 +143,35 @@ eg. Here a cycle soaker is run on 1 CPU (see %c0) for a few seconds | |||
154 | until ^C while the other CPUs are mostly idle: | 143 | until ^C while the other CPUs are mostly idle: |
155 | 144 | ||
156 | .nf | 145 | .nf |
157 | [root@x980 lenb]# ./turbostat cat /dev/zero > /dev/null | 146 | root@ivy: turbostat cat /dev/zero > /dev/null |
158 | ^C | 147 | ^C |
159 | cor CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 | 148 | Core CPU Avg_MHz %Busy Bzy_MHz TSC_MHz SMI CPU%c1 CPU%c3 CPU%c6 CPU%c7 CoreTmp PkgTmp Pkg%pc2 Pkg%pc3 Pkg%pc6 Pkg%pc7 PkgWatt CorWatt GFXWatt |
160 | 8.86 3.61 3.38 15.06 31.19 44.89 0.00 0.00 | 149 | - - 496 12.75 3886 3492 0 13.16 0.04 74.04 0.00 36 36 0.00 0.00 0.00 0.00 23.15 17.65 0.00 |
161 | 0 0 1.46 3.22 3.38 16.84 29.48 52.22 0.00 0.00 | 150 | 0 0 22 0.57 3830 3492 0 0.83 0.02 98.59 0.00 27 36 0.00 0.00 0.00 0.00 23.15 17.65 0.00 |
162 | 0 6 0.21 3.06 3.38 18.09 | 151 | 0 4 9 0.24 3829 3492 0 1.15 |
163 | 1 2 0.53 3.33 3.38 2.80 46.40 50.27 | 152 | 1 1 4 0.09 3783 3492 0 99.91 0.00 0.00 0.00 36 |
164 | 1 8 0.89 3.47 3.38 2.44 | 153 | 1 5 3880 99.82 3888 3492 0 0.18 |
165 | 2 4 1.36 3.43 3.38 9.04 23.71 65.89 | 154 | 2 2 17 0.44 3813 3492 0 0.77 0.04 98.75 0.00 28 |
166 | 2 10 0.18 2.86 3.38 10.22 | 155 | 2 6 12 0.32 3823 3492 0 0.89 |
167 | 8 1 0.04 2.87 3.38 99.96 0.01 0.00 | 156 | 3 3 16 0.43 3844 3492 0 0.63 0.11 98.84 0.00 30 |
168 | 8 7 99.72 3.63 3.38 0.27 | 157 | 3 7 4 0.11 3827 3492 0 0.94 |
169 | 9 3 0.31 3.21 3.38 7.64 56.55 35.50 | 158 | 30.372243 sec |
170 | 9 9 0.08 2.95 3.38 7.88 | 159 | |
171 | 10 5 1.42 3.43 3.38 2.14 30.99 65.44 | ||
172 | 10 11 0.16 2.88 3.38 3.40 | ||
173 | .fi | 160 | .fi |
174 | Above the cycle soaker drives cpu7 up its 3.6 GHz turbo limit | 161 | Above the cycle soaker drives cpu5 up its 3.8 GHz turbo limit |
175 | while the other processors are generally in various states of idle. | 162 | while the other processors are generally in various states of idle. |
176 | 163 | ||
177 | Note that cpu1 and cpu7 are HT siblings within core8. | 164 | Note that cpu1 and cpu5 are HT siblings within core1. |
178 | As cpu7 is very busy, it prevents its sibling, cpu1, | 165 | As cpu5 is very busy, it prevents its sibling, cpu1, |
179 | from entering a c-state deeper than c1. | 166 | from entering a c-state deeper than c1. |
180 | 167 | ||
181 | Note that turbostat reports average GHz of 3.63, while | 168 | Note that the Avg_MHz column reflects the total number of cycles executed |
182 | the arithmetic average of the GHz column above is lower. | 169 | divided by the measurement interval. If the %Busy column is 100%, |
183 | This is a weighted average, where the weight is %c0. ie. it is the total number of | 170 | then the processor was running at that speed the entire interval. |
184 | un-halted cycles elapsed per time divided by the number of CPUs. | 171 | The Avg_MHz multiplied by the %Busy results in the Bzy_MHz -- |
185 | .SH SMI COUNTING EXAMPLE | 172 | which is the average frequency while the processor was executing -- |
186 | On Intel Nehalem and newer processors, MSR 0x34 is a System Management Mode Interrupt (SMI) counter. | 173 | not including any non-busy idle time. |
187 | This counter is shown by default under the "SMI" column. | 174 | |
188 | .nf | ||
189 | [root@x980 ~]# turbostat | ||
190 | cor CPU %c0 GHz TSC SMI %c1 %c3 %c6 CTMP %pc3 %pc6 | ||
191 | 0.11 1.91 3.38 0 1.84 0.26 97.79 29 0.82 83.87 | ||
192 | 0 0 0.40 1.63 3.38 0 10.27 0.12 89.20 20 0.82 83.88 | ||
193 | 0 6 0.06 1.63 3.38 0 10.61 | ||
194 | 1 2 0.37 2.63 3.38 0 0.02 0.10 99.51 22 | ||
195 | 1 8 0.01 1.62 3.38 0 0.39 | ||
196 | 2 4 0.07 1.62 3.38 0 0.04 0.07 99.82 23 | ||
197 | 2 10 0.02 1.62 3.38 0 0.09 | ||
198 | 8 1 0.23 1.64 3.38 0 0.10 1.07 98.60 24 | ||
199 | 8 7 0.02 1.64 3.38 0 0.31 | ||
200 | 9 3 0.03 1.62 3.38 0 0.03 0.05 99.89 29 | ||
201 | 9 9 0.02 1.62 3.38 0 0.05 | ||
202 | 10 5 0.07 1.62 3.38 0 0.08 0.12 99.73 27 | ||
203 | 10 11 0.03 1.62 3.38 0 0.13 | ||
204 | ^C | ||
205 | .fi | ||
206 | .SH NOTES | 175 | .SH NOTES |
207 | 176 | ||
208 | .B "turbostat " | 177 | .B "turbostat " |
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 77eb130168da..7c9d8e71eb9e 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
@@ -56,7 +56,7 @@ unsigned int do_slm_cstates; | |||
56 | unsigned int use_c1_residency_msr; | 56 | unsigned int use_c1_residency_msr; |
57 | unsigned int has_aperf; | 57 | unsigned int has_aperf; |
58 | unsigned int has_epb; | 58 | unsigned int has_epb; |
59 | unsigned int units = 1000000000; /* Ghz etc */ | 59 | unsigned int units = 1000000; /* MHz etc */ |
60 | unsigned int genuine_intel; | 60 | unsigned int genuine_intel; |
61 | unsigned int has_invariant_tsc; | 61 | unsigned int has_invariant_tsc; |
62 | unsigned int do_nehalem_platform_info; | 62 | unsigned int do_nehalem_platform_info; |
@@ -264,88 +264,93 @@ int get_msr(int cpu, off_t offset, unsigned long long *msr) | |||
264 | return 0; | 264 | return 0; |
265 | } | 265 | } |
266 | 266 | ||
267 | /* | ||
268 | * Example Format w/ field column widths: | ||
269 | * | ||
270 | * Package Core CPU Avg_MHz Bzy_MHz TSC_MHz SMI %Busy CPU_%c1 CPU_%c3 CPU_%c6 CPU_%c7 CoreTmp PkgTmp Pkg%pc2 Pkg%pc3 Pkg%pc6 Pkg%pc7 PkgWatt CorWatt GFXWatt | ||
271 | * 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 1234567 | ||
272 | */ | ||
273 | |||
267 | void print_header(void) | 274 | void print_header(void) |
268 | { | 275 | { |
269 | if (show_pkg) | 276 | if (show_pkg) |
270 | outp += sprintf(outp, "pk"); | 277 | outp += sprintf(outp, "Package "); |
271 | if (show_pkg) | ||
272 | outp += sprintf(outp, " "); | ||
273 | if (show_core) | 278 | if (show_core) |
274 | outp += sprintf(outp, "cor"); | 279 | outp += sprintf(outp, " Core "); |
275 | if (show_cpu) | 280 | if (show_cpu) |
276 | outp += sprintf(outp, " CPU"); | 281 | outp += sprintf(outp, " CPU "); |
277 | if (show_pkg || show_core || show_cpu) | 282 | if (has_aperf) |
278 | outp += sprintf(outp, " "); | 283 | outp += sprintf(outp, "Avg_MHz "); |
279 | if (do_nhm_cstates) | 284 | if (do_nhm_cstates) |
280 | outp += sprintf(outp, " %%c0"); | 285 | outp += sprintf(outp, " %%Busy "); |
281 | if (has_aperf) | 286 | if (has_aperf) |
282 | outp += sprintf(outp, " GHz"); | 287 | outp += sprintf(outp, "Bzy_MHz "); |
283 | outp += sprintf(outp, " TSC"); | 288 | outp += sprintf(outp, "TSC_MHz "); |
284 | if (do_smi) | 289 | if (do_smi) |
285 | outp += sprintf(outp, " SMI"); | 290 | outp += sprintf(outp, " SMI "); |
286 | if (extra_delta_offset32) | 291 | if (extra_delta_offset32) |
287 | outp += sprintf(outp, " count 0x%03X", extra_delta_offset32); | 292 | outp += sprintf(outp, " count 0x%03X ", extra_delta_offset32); |
288 | if (extra_delta_offset64) | 293 | if (extra_delta_offset64) |
289 | outp += sprintf(outp, " COUNT 0x%03X", extra_delta_offset64); | 294 | outp += sprintf(outp, " COUNT 0x%03X ", extra_delta_offset64); |
290 | if (extra_msr_offset32) | 295 | if (extra_msr_offset32) |
291 | outp += sprintf(outp, " MSR 0x%03X", extra_msr_offset32); | 296 | outp += sprintf(outp, " MSR 0x%03X ", extra_msr_offset32); |
292 | if (extra_msr_offset64) | 297 | if (extra_msr_offset64) |
293 | outp += sprintf(outp, " MSR 0x%03X", extra_msr_offset64); | 298 | outp += sprintf(outp, " MSR 0x%03X ", extra_msr_offset64); |
294 | if (do_nhm_cstates) | 299 | if (do_nhm_cstates) |
295 | outp += sprintf(outp, " %%c1"); | 300 | outp += sprintf(outp, " CPU%%c1 "); |
296 | if (do_nhm_cstates && !do_slm_cstates) | 301 | if (do_nhm_cstates && !do_slm_cstates) |
297 | outp += sprintf(outp, " %%c3"); | 302 | outp += sprintf(outp, " CPU%%c3 "); |
298 | if (do_nhm_cstates) | 303 | if (do_nhm_cstates) |
299 | outp += sprintf(outp, " %%c6"); | 304 | outp += sprintf(outp, " CPU%%c6 "); |
300 | if (do_snb_cstates) | 305 | if (do_snb_cstates) |
301 | outp += sprintf(outp, " %%c7"); | 306 | outp += sprintf(outp, " CPU%%c7 "); |
302 | 307 | ||
303 | if (do_dts) | 308 | if (do_dts) |
304 | outp += sprintf(outp, " CTMP"); | 309 | outp += sprintf(outp, "CoreTmp "); |
305 | if (do_ptm) | 310 | if (do_ptm) |
306 | outp += sprintf(outp, " PTMP"); | 311 | outp += sprintf(outp, " PkgTmp "); |
307 | 312 | ||
308 | if (do_snb_cstates) | 313 | if (do_snb_cstates) |
309 | outp += sprintf(outp, " %%pc2"); | 314 | outp += sprintf(outp, "Pkg%%pc2 "); |
310 | if (do_nhm_cstates && !do_slm_cstates) | 315 | if (do_nhm_cstates && !do_slm_cstates) |
311 | outp += sprintf(outp, " %%pc3"); | 316 | outp += sprintf(outp, "Pkg%%pc3 "); |
312 | if (do_nhm_cstates && !do_slm_cstates) | 317 | if (do_nhm_cstates && !do_slm_cstates) |
313 | outp += sprintf(outp, " %%pc6"); | 318 | outp += sprintf(outp, "Pkg%%pc6 "); |
314 | if (do_snb_cstates) | 319 | if (do_snb_cstates) |
315 | outp += sprintf(outp, " %%pc7"); | 320 | outp += sprintf(outp, "Pkg%%pc7 "); |
316 | if (do_c8_c9_c10) { | 321 | if (do_c8_c9_c10) { |
317 | outp += sprintf(outp, " %%pc8"); | 322 | outp += sprintf(outp, "Pkg%%pc8 "); |
318 | outp += sprintf(outp, " %%pc9"); | 323 | outp += sprintf(outp, "Pkg%%pc9 "); |
319 | outp += sprintf(outp, " %%pc10"); | 324 | outp += sprintf(outp, "Pk%%pc10 "); |
320 | } | 325 | } |
321 | 326 | ||
322 | if (do_rapl && !rapl_joules) { | 327 | if (do_rapl && !rapl_joules) { |
323 | if (do_rapl & RAPL_PKG) | 328 | if (do_rapl & RAPL_PKG) |
324 | outp += sprintf(outp, " Pkg_W"); | 329 | outp += sprintf(outp, "PkgWatt "); |
325 | if (do_rapl & RAPL_CORES) | 330 | if (do_rapl & RAPL_CORES) |
326 | outp += sprintf(outp, " Cor_W"); | 331 | outp += sprintf(outp, "CorWatt "); |
327 | if (do_rapl & RAPL_GFX) | 332 | if (do_rapl & RAPL_GFX) |
328 | outp += sprintf(outp, " GFX_W"); | 333 | outp += sprintf(outp, "GFXWatt "); |
329 | if (do_rapl & RAPL_DRAM) | 334 | if (do_rapl & RAPL_DRAM) |
330 | outp += sprintf(outp, " RAM_W"); | 335 | outp += sprintf(outp, "RAMWatt "); |
331 | if (do_rapl & RAPL_PKG_PERF_STATUS) | 336 | if (do_rapl & RAPL_PKG_PERF_STATUS) |
332 | outp += sprintf(outp, " PKG_%%"); | 337 | outp += sprintf(outp, " PKG_%% "); |
333 | if (do_rapl & RAPL_DRAM_PERF_STATUS) | 338 | if (do_rapl & RAPL_DRAM_PERF_STATUS) |
334 | outp += sprintf(outp, " RAM_%%"); | 339 | outp += sprintf(outp, " RAM_%% "); |
335 | } else { | 340 | } else { |
336 | if (do_rapl & RAPL_PKG) | 341 | if (do_rapl & RAPL_PKG) |
337 | outp += sprintf(outp, " Pkg_J"); | 342 | outp += sprintf(outp, " Pkg_J "); |
338 | if (do_rapl & RAPL_CORES) | 343 | if (do_rapl & RAPL_CORES) |
339 | outp += sprintf(outp, " Cor_J"); | 344 | outp += sprintf(outp, " Cor_J "); |
340 | if (do_rapl & RAPL_GFX) | 345 | if (do_rapl & RAPL_GFX) |
341 | outp += sprintf(outp, " GFX_J"); | 346 | outp += sprintf(outp, " GFX_J "); |
342 | if (do_rapl & RAPL_DRAM) | 347 | if (do_rapl & RAPL_DRAM) |
343 | outp += sprintf(outp, " RAM_W"); | 348 | outp += sprintf(outp, " RAM_W "); |
344 | if (do_rapl & RAPL_PKG_PERF_STATUS) | 349 | if (do_rapl & RAPL_PKG_PERF_STATUS) |
345 | outp += sprintf(outp, " PKG_%%"); | 350 | outp += sprintf(outp, " PKG_%% "); |
346 | if (do_rapl & RAPL_DRAM_PERF_STATUS) | 351 | if (do_rapl & RAPL_DRAM_PERF_STATUS) |
347 | outp += sprintf(outp, " RAM_%%"); | 352 | outp += sprintf(outp, " RAM_%% "); |
348 | outp += sprintf(outp, " time"); | 353 | outp += sprintf(outp, " time "); |
349 | 354 | ||
350 | } | 355 | } |
351 | outp += sprintf(outp, "\n"); | 356 | outp += sprintf(outp, "\n"); |
@@ -410,25 +415,12 @@ int dump_counters(struct thread_data *t, struct core_data *c, | |||
410 | 415 | ||
411 | /* | 416 | /* |
412 | * column formatting convention & formats | 417 | * column formatting convention & formats |
413 | * package: "pk" 2 columns %2d | ||
414 | * core: "cor" 3 columns %3d | ||
415 | * CPU: "CPU" 3 columns %3d | ||
416 | * Pkg_W: %6.2 | ||
417 | * Cor_W: %6.2 | ||
418 | * GFX_W: %5.2 | ||
419 | * RAM_W: %5.2 | ||
420 | * GHz: "GHz" 3 columns %3.2 | ||
421 | * TSC: "TSC" 3 columns %3.2 | ||
422 | * SMI: "SMI" 4 columns %4d | ||
423 | * percentage " %pc3" %6.2 | ||
424 | * Perf Status percentage: %5.2 | ||
425 | * "CTMP" 4 columns %4d | ||
426 | */ | 418 | */ |
427 | int format_counters(struct thread_data *t, struct core_data *c, | 419 | int format_counters(struct thread_data *t, struct core_data *c, |
428 | struct pkg_data *p) | 420 | struct pkg_data *p) |
429 | { | 421 | { |
430 | double interval_float; | 422 | double interval_float; |
431 | char *fmt5, *fmt6; | 423 | char *fmt8; |
432 | 424 | ||
433 | /* if showing only 1st thread in core and this isn't one, bail out */ | 425 | /* if showing only 1st thread in core and this isn't one, bail out */ |
434 | if (show_core_only && !(t->flags & CPU_IS_FIRST_THREAD_IN_CORE)) | 426 | if (show_core_only && !(t->flags & CPU_IS_FIRST_THREAD_IN_CORE)) |
@@ -443,65 +435,52 @@ int format_counters(struct thread_data *t, struct core_data *c, | |||
443 | /* topo columns, print blanks on 1st (average) line */ | 435 | /* topo columns, print blanks on 1st (average) line */ |
444 | if (t == &average.threads) { | 436 | if (t == &average.threads) { |
445 | if (show_pkg) | 437 | if (show_pkg) |
446 | outp += sprintf(outp, " "); | 438 | outp += sprintf(outp, " -"); |
447 | if (show_pkg && show_core) | ||
448 | outp += sprintf(outp, " "); | ||
449 | if (show_core) | 439 | if (show_core) |
450 | outp += sprintf(outp, " "); | 440 | outp += sprintf(outp, " -"); |
451 | if (show_cpu) | 441 | if (show_cpu) |
452 | outp += sprintf(outp, " " " "); | 442 | outp += sprintf(outp, " -"); |
453 | } else { | 443 | } else { |
454 | if (show_pkg) { | 444 | if (show_pkg) { |
455 | if (p) | 445 | if (p) |
456 | outp += sprintf(outp, "%2d", p->package_id); | 446 | outp += sprintf(outp, "%8d", p->package_id); |
457 | else | 447 | else |
458 | outp += sprintf(outp, " "); | 448 | outp += sprintf(outp, " -"); |
459 | } | 449 | } |
460 | if (show_pkg && show_core) | ||
461 | outp += sprintf(outp, " "); | ||
462 | if (show_core) { | 450 | if (show_core) { |
463 | if (c) | 451 | if (c) |
464 | outp += sprintf(outp, "%3d", c->core_id); | 452 | outp += sprintf(outp, "%8d", c->core_id); |
465 | else | 453 | else |
466 | outp += sprintf(outp, " "); | 454 | outp += sprintf(outp, " -"); |
467 | } | 455 | } |
468 | if (show_cpu) | 456 | if (show_cpu) |
469 | outp += sprintf(outp, " %3d", t->cpu_id); | 457 | outp += sprintf(outp, "%8d", t->cpu_id); |
470 | } | 458 | } |
459 | |||
460 | /* AvgMHz */ | ||
461 | if (has_aperf) | ||
462 | outp += sprintf(outp, "%8.0f", | ||
463 | 1.0 / units * t->aperf / interval_float); | ||
464 | |||
471 | /* %c0 */ | 465 | /* %c0 */ |
472 | if (do_nhm_cstates) { | 466 | if (do_nhm_cstates) { |
473 | if (show_pkg || show_core || show_cpu) | ||
474 | outp += sprintf(outp, " "); | ||
475 | if (!skip_c0) | 467 | if (!skip_c0) |
476 | outp += sprintf(outp, "%6.2f", 100.0 * t->mperf/t->tsc); | 468 | outp += sprintf(outp, "%8.2f", 100.0 * t->mperf/t->tsc); |
477 | else | 469 | else |
478 | outp += sprintf(outp, " ****"); | 470 | outp += sprintf(outp, "********"); |
479 | } | 471 | } |
480 | 472 | ||
481 | /* GHz */ | 473 | /* BzyMHz */ |
482 | if (has_aperf) { | 474 | if (has_aperf) |
483 | if (!aperf_mperf_unstable) { | 475 | outp += sprintf(outp, "%8.0f", |
484 | outp += sprintf(outp, " %3.2f", | 476 | 1.0 * t->tsc / units * t->aperf / t->mperf / interval_float); |
485 | 1.0 * t->tsc / units * t->aperf / | ||
486 | t->mperf / interval_float); | ||
487 | } else { | ||
488 | if (t->aperf > t->tsc || t->mperf > t->tsc) { | ||
489 | outp += sprintf(outp, " ***"); | ||
490 | } else { | ||
491 | outp += sprintf(outp, "%3.1f*", | ||
492 | 1.0 * t->tsc / | ||
493 | units * t->aperf / | ||
494 | t->mperf / interval_float); | ||
495 | } | ||
496 | } | ||
497 | } | ||
498 | 477 | ||
499 | /* TSC */ | 478 | /* TSC */ |
500 | outp += sprintf(outp, "%5.2f", 1.0 * t->tsc/units/interval_float); | 479 | outp += sprintf(outp, "%8.0f", 1.0 * t->tsc/units/interval_float); |
501 | 480 | ||
502 | /* SMI */ | 481 | /* SMI */ |
503 | if (do_smi) | 482 | if (do_smi) |
504 | outp += sprintf(outp, "%4d", t->smi_count); | 483 | outp += sprintf(outp, "%8d", t->smi_count); |
505 | 484 | ||
506 | /* delta */ | 485 | /* delta */ |
507 | if (extra_delta_offset32) | 486 | if (extra_delta_offset32) |
@@ -520,9 +499,9 @@ int format_counters(struct thread_data *t, struct core_data *c, | |||
520 | 499 | ||
521 | if (do_nhm_cstates) { | 500 | if (do_nhm_cstates) { |
522 | if (!skip_c1) | 501 | if (!skip_c1) |
523 | outp += sprintf(outp, " %6.2f", 100.0 * t->c1/t->tsc); | 502 | outp += sprintf(outp, "%8.2f", 100.0 * t->c1/t->tsc); |
524 | else | 503 | else |
525 | outp += sprintf(outp, " ****"); | 504 | outp += sprintf(outp, "********"); |
526 | } | 505 | } |
527 | 506 | ||
528 | /* print per-core data only for 1st thread in core */ | 507 | /* print per-core data only for 1st thread in core */ |
@@ -530,79 +509,76 @@ int format_counters(struct thread_data *t, struct core_data *c, | |||
530 | goto done; | 509 | goto done; |
531 | 510 | ||
532 | if (do_nhm_cstates && !do_slm_cstates) | 511 | if (do_nhm_cstates && !do_slm_cstates) |
533 | outp += sprintf(outp, " %6.2f", 100.0 * c->c3/t->tsc); | 512 | outp += sprintf(outp, "%8.2f", 100.0 * c->c3/t->tsc); |
534 | if (do_nhm_cstates) | 513 | if (do_nhm_cstates) |
535 | outp += sprintf(outp, " %6.2f", 100.0 * c->c6/t->tsc); | 514 | outp += sprintf(outp, "%8.2f", 100.0 * c->c6/t->tsc); |
536 | if (do_snb_cstates) | 515 | if (do_snb_cstates) |
537 | outp += sprintf(outp, " %6.2f", 100.0 * c->c7/t->tsc); | 516 | outp += sprintf(outp, "%8.2f", 100.0 * c->c7/t->tsc); |
538 | 517 | ||
539 | if (do_dts) | 518 | if (do_dts) |
540 | outp += sprintf(outp, " %4d", c->core_temp_c); | 519 | outp += sprintf(outp, "%8d", c->core_temp_c); |
541 | 520 | ||
542 | /* print per-package data only for 1st core in package */ | 521 | /* print per-package data only for 1st core in package */ |
543 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) | 522 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) |
544 | goto done; | 523 | goto done; |
545 | 524 | ||
546 | if (do_ptm) | 525 | if (do_ptm) |
547 | outp += sprintf(outp, " %4d", p->pkg_temp_c); | 526 | outp += sprintf(outp, "%8d", p->pkg_temp_c); |
548 | 527 | ||
549 | if (do_snb_cstates) | 528 | if (do_snb_cstates) |
550 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc2/t->tsc); | 529 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc2/t->tsc); |
551 | if (do_nhm_cstates && !do_slm_cstates) | 530 | if (do_nhm_cstates && !do_slm_cstates) |
552 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc3/t->tsc); | 531 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc3/t->tsc); |
553 | if (do_nhm_cstates && !do_slm_cstates) | 532 | if (do_nhm_cstates && !do_slm_cstates) |
554 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc6/t->tsc); | 533 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc6/t->tsc); |
555 | if (do_snb_cstates) | 534 | if (do_snb_cstates) |
556 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc7/t->tsc); | 535 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc7/t->tsc); |
557 | if (do_c8_c9_c10) { | 536 | if (do_c8_c9_c10) { |
558 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc8/t->tsc); | 537 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc8/t->tsc); |
559 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc9/t->tsc); | 538 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc9/t->tsc); |
560 | outp += sprintf(outp, " %6.2f", 100.0 * p->pc10/t->tsc); | 539 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc10/t->tsc); |
561 | } | 540 | } |
562 | 541 | ||
563 | /* | 542 | /* |
564 | * If measurement interval exceeds minimum RAPL Joule Counter range, | 543 | * If measurement interval exceeds minimum RAPL Joule Counter range, |
565 | * indicate that results are suspect by printing "**" in fraction place. | 544 | * indicate that results are suspect by printing "**" in fraction place. |
566 | */ | 545 | */ |
567 | if (interval_float < rapl_joule_counter_range) { | 546 | if (interval_float < rapl_joule_counter_range) |
568 | fmt5 = " %5.2f"; | 547 | fmt8 = "%8.2f"; |
569 | fmt6 = " %6.2f"; | 548 | else |
570 | } else { | 549 | fmt8 = " %6.0f**"; |
571 | fmt5 = " %3.0f**"; | ||
572 | fmt6 = " %4.0f**"; | ||
573 | } | ||
574 | 550 | ||
575 | if (do_rapl && !rapl_joules) { | 551 | if (do_rapl && !rapl_joules) { |
576 | if (do_rapl & RAPL_PKG) | 552 | if (do_rapl & RAPL_PKG) |
577 | outp += sprintf(outp, fmt6, p->energy_pkg * rapl_energy_units / interval_float); | 553 | outp += sprintf(outp, fmt8, p->energy_pkg * rapl_energy_units / interval_float); |
578 | if (do_rapl & RAPL_CORES) | 554 | if (do_rapl & RAPL_CORES) |
579 | outp += sprintf(outp, fmt6, p->energy_cores * rapl_energy_units / interval_float); | 555 | outp += sprintf(outp, fmt8, p->energy_cores * rapl_energy_units / interval_float); |
580 | if (do_rapl & RAPL_GFX) | 556 | if (do_rapl & RAPL_GFX) |
581 | outp += sprintf(outp, fmt5, p->energy_gfx * rapl_energy_units / interval_float); | 557 | outp += sprintf(outp, fmt8, p->energy_gfx * rapl_energy_units / interval_float); |
582 | if (do_rapl & RAPL_DRAM) | 558 | if (do_rapl & RAPL_DRAM) |
583 | outp += sprintf(outp, fmt5, p->energy_dram * rapl_energy_units / interval_float); | 559 | outp += sprintf(outp, fmt8, p->energy_dram * rapl_energy_units / interval_float); |
584 | if (do_rapl & RAPL_PKG_PERF_STATUS) | 560 | if (do_rapl & RAPL_PKG_PERF_STATUS) |
585 | outp += sprintf(outp, fmt5, 100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float); | 561 | outp += sprintf(outp, fmt8, 100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float); |
586 | if (do_rapl & RAPL_DRAM_PERF_STATUS) | 562 | if (do_rapl & RAPL_DRAM_PERF_STATUS) |
587 | outp += sprintf(outp, fmt5, 100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); | 563 | outp += sprintf(outp, fmt8, 100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); |
588 | } else { | 564 | } else { |
589 | if (do_rapl & RAPL_PKG) | 565 | if (do_rapl & RAPL_PKG) |
590 | outp += sprintf(outp, fmt6, | 566 | outp += sprintf(outp, fmt8, |
591 | p->energy_pkg * rapl_energy_units); | 567 | p->energy_pkg * rapl_energy_units); |
592 | if (do_rapl & RAPL_CORES) | 568 | if (do_rapl & RAPL_CORES) |
593 | outp += sprintf(outp, fmt6, | 569 | outp += sprintf(outp, fmt8, |
594 | p->energy_cores * rapl_energy_units); | 570 | p->energy_cores * rapl_energy_units); |
595 | if (do_rapl & RAPL_GFX) | 571 | if (do_rapl & RAPL_GFX) |
596 | outp += sprintf(outp, fmt5, | 572 | outp += sprintf(outp, fmt8, |
597 | p->energy_gfx * rapl_energy_units); | 573 | p->energy_gfx * rapl_energy_units); |
598 | if (do_rapl & RAPL_DRAM) | 574 | if (do_rapl & RAPL_DRAM) |
599 | outp += sprintf(outp, fmt5, | 575 | outp += sprintf(outp, fmt8, |
600 | p->energy_dram * rapl_energy_units); | 576 | p->energy_dram * rapl_energy_units); |
601 | if (do_rapl & RAPL_PKG_PERF_STATUS) | 577 | if (do_rapl & RAPL_PKG_PERF_STATUS) |
602 | outp += sprintf(outp, fmt5, 100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float); | 578 | outp += sprintf(outp, fmt8, 100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float); |
603 | if (do_rapl & RAPL_DRAM_PERF_STATUS) | 579 | if (do_rapl & RAPL_DRAM_PERF_STATUS) |
604 | outp += sprintf(outp, fmt5, 100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); | 580 | outp += sprintf(outp, fmt8, 100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); |
605 | outp += sprintf(outp, fmt5, interval_float); | 581 | outp += sprintf(outp, fmt8, interval_float); |
606 | 582 | ||
607 | } | 583 | } |
608 | done: | 584 | done: |
@@ -1516,6 +1492,9 @@ int has_nehalem_turbo_ratio_limit(unsigned int family, unsigned int model) | |||
1516 | case 0x46: /* HSW */ | 1492 | case 0x46: /* HSW */ |
1517 | case 0x37: /* BYT */ | 1493 | case 0x37: /* BYT */ |
1518 | case 0x4D: /* AVN */ | 1494 | case 0x4D: /* AVN */ |
1495 | case 0x3D: /* BDW */ | ||
1496 | case 0x4F: /* BDX */ | ||
1497 | case 0x56: /* BDX-DE */ | ||
1519 | return 1; | 1498 | return 1; |
1520 | case 0x2E: /* Nehalem-EX Xeon - Beckton */ | 1499 | case 0x2E: /* Nehalem-EX Xeon - Beckton */ |
1521 | case 0x2F: /* Westmere-EX Xeon - Eagleton */ | 1500 | case 0x2F: /* Westmere-EX Xeon - Eagleton */ |
@@ -1629,9 +1608,12 @@ void rapl_probe(unsigned int family, unsigned int model) | |||
1629 | case 0x3C: /* HSW */ | 1608 | case 0x3C: /* HSW */ |
1630 | case 0x45: /* HSW */ | 1609 | case 0x45: /* HSW */ |
1631 | case 0x46: /* HSW */ | 1610 | case 0x46: /* HSW */ |
1611 | case 0x3D: /* BDW */ | ||
1632 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO; | 1612 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO; |
1633 | break; | 1613 | break; |
1634 | case 0x3F: /* HSX */ | 1614 | case 0x3F: /* HSX */ |
1615 | case 0x4F: /* BDX */ | ||
1616 | case 0x56: /* BDX-DE */ | ||
1635 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; | 1617 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; |
1636 | break; | 1618 | break; |
1637 | case 0x2D: | 1619 | case 0x2D: |
@@ -1875,6 +1857,9 @@ int is_snb(unsigned int family, unsigned int model) | |||
1875 | case 0x3F: /* HSW */ | 1857 | case 0x3F: /* HSW */ |
1876 | case 0x45: /* HSW */ | 1858 | case 0x45: /* HSW */ |
1877 | case 0x46: /* HSW */ | 1859 | case 0x46: /* HSW */ |
1860 | case 0x3D: /* BDW */ | ||
1861 | case 0x4F: /* BDX */ | ||
1862 | case 0x56: /* BDX-DE */ | ||
1878 | return 1; | 1863 | return 1; |
1879 | } | 1864 | } |
1880 | return 0; | 1865 | return 0; |
@@ -1886,7 +1871,8 @@ int has_c8_c9_c10(unsigned int family, unsigned int model) | |||
1886 | return 0; | 1871 | return 0; |
1887 | 1872 | ||
1888 | switch (model) { | 1873 | switch (model) { |
1889 | case 0x45: | 1874 | case 0x45: /* HSW */ |
1875 | case 0x3D: /* BDW */ | ||
1890 | return 1; | 1876 | return 1; |
1891 | } | 1877 | } |
1892 | return 0; | 1878 | return 0; |
@@ -2455,7 +2441,7 @@ int main(int argc, char **argv) | |||
2455 | cmdline(argc, argv); | 2441 | cmdline(argc, argv); |
2456 | 2442 | ||
2457 | if (verbose) | 2443 | if (verbose) |
2458 | fprintf(stderr, "turbostat v3.6 Dec 2, 2013" | 2444 | fprintf(stderr, "turbostat v3.7 Feb 6, 2014" |
2459 | " - Len Brown <lenb@kernel.org>\n"); | 2445 | " - Len Brown <lenb@kernel.org>\n"); |
2460 | 2446 | ||
2461 | turbostat_init(); | 2447 | turbostat_init(); |
diff --git a/tools/testing/ktest/examples/kvm.conf b/tools/testing/ktest/examples/kvm.conf index 831c7c5395f1..fbc134f9ac6e 100644 --- a/tools/testing/ktest/examples/kvm.conf +++ b/tools/testing/ktest/examples/kvm.conf | |||
@@ -10,6 +10,10 @@ MACHINE = Guest | |||
10 | # Use virsh to read the serial console of the guest | 10 | # Use virsh to read the serial console of the guest |
11 | CONSOLE = virsh console ${MACHINE} | 11 | CONSOLE = virsh console ${MACHINE} |
12 | 12 | ||
13 | # Use SIGKILL to terminate virsh console. We can't kill virsh console | ||
14 | # by the default signal, SIGINT. | ||
15 | CLOSE_CONSOLE_SIGNAL = KILL | ||
16 | |||
13 | #*************************************# | 17 | #*************************************# |
14 | # This part is the same as test.conf # | 18 | # This part is the same as test.conf # |
15 | #*************************************# | 19 | #*************************************# |
diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c index f9be24d9efac..05654f5e48d5 100644 --- a/tools/vm/page-types.c +++ b/tools/vm/page-types.c | |||
@@ -19,7 +19,8 @@ | |||
19 | * Authors: Wu Fengguang <fengguang.wu@intel.com> | 19 | * Authors: Wu Fengguang <fengguang.wu@intel.com> |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #define _LARGEFILE64_SOURCE | 22 | #define _FILE_OFFSET_BITS 64 |
23 | #define _GNU_SOURCE | ||
23 | #include <stdio.h> | 24 | #include <stdio.h> |
24 | #include <stdlib.h> | 25 | #include <stdlib.h> |
25 | #include <unistd.h> | 26 | #include <unistd.h> |
@@ -29,11 +30,14 @@ | |||
29 | #include <getopt.h> | 30 | #include <getopt.h> |
30 | #include <limits.h> | 31 | #include <limits.h> |
31 | #include <assert.h> | 32 | #include <assert.h> |
33 | #include <ftw.h> | ||
34 | #include <time.h> | ||
32 | #include <sys/types.h> | 35 | #include <sys/types.h> |
33 | #include <sys/errno.h> | 36 | #include <sys/errno.h> |
34 | #include <sys/fcntl.h> | 37 | #include <sys/fcntl.h> |
35 | #include <sys/mount.h> | 38 | #include <sys/mount.h> |
36 | #include <sys/statfs.h> | 39 | #include <sys/statfs.h> |
40 | #include <sys/mman.h> | ||
37 | #include "../../include/uapi/linux/magic.h" | 41 | #include "../../include/uapi/linux/magic.h" |
38 | #include "../../include/uapi/linux/kernel-page-flags.h" | 42 | #include "../../include/uapi/linux/kernel-page-flags.h" |
39 | #include <api/fs/debugfs.h> | 43 | #include <api/fs/debugfs.h> |
@@ -158,6 +162,7 @@ static int opt_raw; /* for kernel developers */ | |||
158 | static int opt_list; /* list pages (in ranges) */ | 162 | static int opt_list; /* list pages (in ranges) */ |
159 | static int opt_no_summary; /* don't show summary */ | 163 | static int opt_no_summary; /* don't show summary */ |
160 | static pid_t opt_pid; /* process to walk */ | 164 | static pid_t opt_pid; /* process to walk */ |
165 | const char * opt_file; | ||
161 | 166 | ||
162 | #define MAX_ADDR_RANGES 1024 | 167 | #define MAX_ADDR_RANGES 1024 |
163 | static int nr_addr_ranges; | 168 | static int nr_addr_ranges; |
@@ -253,12 +258,7 @@ static unsigned long do_u64_read(int fd, char *name, | |||
253 | if (index > ULONG_MAX / 8) | 258 | if (index > ULONG_MAX / 8) |
254 | fatal("index overflow: %lu\n", index); | 259 | fatal("index overflow: %lu\n", index); |
255 | 260 | ||
256 | if (lseek(fd, index * 8, SEEK_SET) < 0) { | 261 | bytes = pread(fd, buf, count * 8, (off_t)index * 8); |
257 | perror(name); | ||
258 | exit(EXIT_FAILURE); | ||
259 | } | ||
260 | |||
261 | bytes = read(fd, buf, count * 8); | ||
262 | if (bytes < 0) { | 262 | if (bytes < 0) { |
263 | perror(name); | 263 | perror(name); |
264 | exit(EXIT_FAILURE); | 264 | exit(EXIT_FAILURE); |
@@ -343,8 +343,8 @@ static char *page_flag_longname(uint64_t flags) | |||
343 | * page list and summary | 343 | * page list and summary |
344 | */ | 344 | */ |
345 | 345 | ||
346 | static void show_page_range(unsigned long voffset, | 346 | static void show_page_range(unsigned long voffset, unsigned long offset, |
347 | unsigned long offset, uint64_t flags) | 347 | unsigned long size, uint64_t flags) |
348 | { | 348 | { |
349 | static uint64_t flags0; | 349 | static uint64_t flags0; |
350 | static unsigned long voff; | 350 | static unsigned long voff; |
@@ -352,14 +352,16 @@ static void show_page_range(unsigned long voffset, | |||
352 | static unsigned long count; | 352 | static unsigned long count; |
353 | 353 | ||
354 | if (flags == flags0 && offset == index + count && | 354 | if (flags == flags0 && offset == index + count && |
355 | (!opt_pid || voffset == voff + count)) { | 355 | size && voffset == voff + count) { |
356 | count++; | 356 | count += size; |
357 | return; | 357 | return; |
358 | } | 358 | } |
359 | 359 | ||
360 | if (count) { | 360 | if (count) { |
361 | if (opt_pid) | 361 | if (opt_pid) |
362 | printf("%lx\t", voff); | 362 | printf("%lx\t", voff); |
363 | if (opt_file) | ||
364 | printf("%lu\t", voff); | ||
363 | printf("%lx\t%lx\t%s\n", | 365 | printf("%lx\t%lx\t%s\n", |
364 | index, count, page_flag_name(flags0)); | 366 | index, count, page_flag_name(flags0)); |
365 | } | 367 | } |
@@ -367,7 +369,12 @@ static void show_page_range(unsigned long voffset, | |||
367 | flags0 = flags; | 369 | flags0 = flags; |
368 | index = offset; | 370 | index = offset; |
369 | voff = voffset; | 371 | voff = voffset; |
370 | count = 1; | 372 | count = size; |
373 | } | ||
374 | |||
375 | static void flush_page_range(void) | ||
376 | { | ||
377 | show_page_range(0, 0, 0, 0); | ||
371 | } | 378 | } |
372 | 379 | ||
373 | static void show_page(unsigned long voffset, | 380 | static void show_page(unsigned long voffset, |
@@ -375,6 +382,8 @@ static void show_page(unsigned long voffset, | |||
375 | { | 382 | { |
376 | if (opt_pid) | 383 | if (opt_pid) |
377 | printf("%lx\t", voffset); | 384 | printf("%lx\t", voffset); |
385 | if (opt_file) | ||
386 | printf("%lu\t", voffset); | ||
378 | printf("%lx\t%s\n", offset, page_flag_name(flags)); | 387 | printf("%lx\t%s\n", offset, page_flag_name(flags)); |
379 | } | 388 | } |
380 | 389 | ||
@@ -565,7 +574,7 @@ static void add_page(unsigned long voffset, | |||
565 | unpoison_page(offset); | 574 | unpoison_page(offset); |
566 | 575 | ||
567 | if (opt_list == 1) | 576 | if (opt_list == 1) |
568 | show_page_range(voffset, offset, flags); | 577 | show_page_range(voffset, offset, 1, flags); |
569 | else if (opt_list == 2) | 578 | else if (opt_list == 2) |
570 | show_page(voffset, offset, flags); | 579 | show_page(voffset, offset, flags); |
571 | 580 | ||
@@ -667,7 +676,7 @@ static void walk_addr_ranges(void) | |||
667 | 676 | ||
668 | for (i = 0; i < nr_addr_ranges; i++) | 677 | for (i = 0; i < nr_addr_ranges; i++) |
669 | if (!opt_pid) | 678 | if (!opt_pid) |
670 | walk_pfn(0, opt_offset[i], opt_size[i], 0); | 679 | walk_pfn(opt_offset[i], opt_offset[i], opt_size[i], 0); |
671 | else | 680 | else |
672 | walk_task(opt_offset[i], opt_size[i]); | 681 | walk_task(opt_offset[i], opt_size[i]); |
673 | 682 | ||
@@ -699,9 +708,7 @@ static void usage(void) | |||
699 | " -a|--addr addr-spec Walk a range of pages\n" | 708 | " -a|--addr addr-spec Walk a range of pages\n" |
700 | " -b|--bits bits-spec Walk pages with specified bits\n" | 709 | " -b|--bits bits-spec Walk pages with specified bits\n" |
701 | " -p|--pid pid Walk process address space\n" | 710 | " -p|--pid pid Walk process address space\n" |
702 | #if 0 /* planned features */ | ||
703 | " -f|--file filename Walk file address space\n" | 711 | " -f|--file filename Walk file address space\n" |
704 | #endif | ||
705 | " -l|--list Show page details in ranges\n" | 712 | " -l|--list Show page details in ranges\n" |
706 | " -L|--list-each Show page details one by one\n" | 713 | " -L|--list-each Show page details one by one\n" |
707 | " -N|--no-summary Don't show summary info\n" | 714 | " -N|--no-summary Don't show summary info\n" |
@@ -799,8 +806,130 @@ static void parse_pid(const char *str) | |||
799 | fclose(file); | 806 | fclose(file); |
800 | } | 807 | } |
801 | 808 | ||
809 | static void show_file(const char *name, const struct stat *st) | ||
810 | { | ||
811 | unsigned long long size = st->st_size; | ||
812 | char atime[64], mtime[64]; | ||
813 | long now = time(NULL); | ||
814 | |||
815 | printf("%s\tInode: %u\tSize: %llu (%llu pages)\n", | ||
816 | name, (unsigned)st->st_ino, | ||
817 | size, (size + page_size - 1) / page_size); | ||
818 | |||
819 | strftime(atime, sizeof(atime), "%c", localtime(&st->st_atime)); | ||
820 | strftime(mtime, sizeof(mtime), "%c", localtime(&st->st_mtime)); | ||
821 | |||
822 | printf("Modify: %s (%ld seconds ago)\nAccess: %s (%ld seconds ago)\n", | ||
823 | mtime, now - st->st_mtime, | ||
824 | atime, now - st->st_atime); | ||
825 | } | ||
826 | |||
827 | static void walk_file(const char *name, const struct stat *st) | ||
828 | { | ||
829 | uint8_t vec[PAGEMAP_BATCH]; | ||
830 | uint64_t buf[PAGEMAP_BATCH], flags; | ||
831 | unsigned long nr_pages, pfn, i; | ||
832 | int fd; | ||
833 | off_t off; | ||
834 | ssize_t len; | ||
835 | void *ptr; | ||
836 | int first = 1; | ||
837 | |||
838 | fd = checked_open(name, O_RDONLY|O_NOATIME|O_NOFOLLOW); | ||
839 | |||
840 | for (off = 0; off < st->st_size; off += len) { | ||
841 | nr_pages = (st->st_size - off + page_size - 1) / page_size; | ||
842 | if (nr_pages > PAGEMAP_BATCH) | ||
843 | nr_pages = PAGEMAP_BATCH; | ||
844 | len = nr_pages * page_size; | ||
845 | |||
846 | ptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, off); | ||
847 | if (ptr == MAP_FAILED) | ||
848 | fatal("mmap failed: %s", name); | ||
849 | |||
850 | /* determine cached pages */ | ||
851 | if (mincore(ptr, len, vec)) | ||
852 | fatal("mincore failed: %s", name); | ||
853 | |||
854 | /* turn off readahead */ | ||
855 | if (madvise(ptr, len, MADV_RANDOM)) | ||
856 | fatal("madvice failed: %s", name); | ||
857 | |||
858 | /* populate ptes */ | ||
859 | for (i = 0; i < nr_pages ; i++) { | ||
860 | if (vec[i] & 1) | ||
861 | (void)*(volatile int *)(ptr + i * page_size); | ||
862 | } | ||
863 | |||
864 | /* turn off harvesting reference bits */ | ||
865 | if (madvise(ptr, len, MADV_SEQUENTIAL)) | ||
866 | fatal("madvice failed: %s", name); | ||
867 | |||
868 | if (pagemap_read(buf, (unsigned long)ptr / page_size, | ||
869 | nr_pages) != nr_pages) | ||
870 | fatal("cannot read pagemap"); | ||
871 | |||
872 | munmap(ptr, len); | ||
873 | |||
874 | for (i = 0; i < nr_pages; i++) { | ||
875 | pfn = pagemap_pfn(buf[i]); | ||
876 | if (!pfn) | ||
877 | continue; | ||
878 | if (!kpageflags_read(&flags, pfn, 1)) | ||
879 | continue; | ||
880 | if (first && opt_list) { | ||
881 | first = 0; | ||
882 | flush_page_range(); | ||
883 | show_file(name, st); | ||
884 | } | ||
885 | add_page(off / page_size + i, pfn, flags, buf[i]); | ||
886 | } | ||
887 | } | ||
888 | |||
889 | close(fd); | ||
890 | } | ||
891 | |||
892 | int walk_tree(const char *name, const struct stat *st, int type, struct FTW *f) | ||
893 | { | ||
894 | (void)f; | ||
895 | switch (type) { | ||
896 | case FTW_F: | ||
897 | if (S_ISREG(st->st_mode)) | ||
898 | walk_file(name, st); | ||
899 | break; | ||
900 | case FTW_DNR: | ||
901 | fprintf(stderr, "cannot read dir: %s\n", name); | ||
902 | break; | ||
903 | } | ||
904 | return 0; | ||
905 | } | ||
906 | |||
907 | static void walk_page_cache(void) | ||
908 | { | ||
909 | struct stat st; | ||
910 | |||
911 | kpageflags_fd = checked_open(PROC_KPAGEFLAGS, O_RDONLY); | ||
912 | pagemap_fd = checked_open("/proc/self/pagemap", O_RDONLY); | ||
913 | |||
914 | if (stat(opt_file, &st)) | ||
915 | fatal("stat failed: %s\n", opt_file); | ||
916 | |||
917 | if (S_ISREG(st.st_mode)) { | ||
918 | walk_file(opt_file, &st); | ||
919 | } else if (S_ISDIR(st.st_mode)) { | ||
920 | /* do not follow symlinks and mountpoints */ | ||
921 | if (nftw(opt_file, walk_tree, 64, FTW_MOUNT | FTW_PHYS) < 0) | ||
922 | fatal("nftw failed: %s\n", opt_file); | ||
923 | } else | ||
924 | fatal("unhandled file type: %s\n", opt_file); | ||
925 | |||
926 | close(kpageflags_fd); | ||
927 | close(pagemap_fd); | ||
928 | } | ||
929 | |||
802 | static void parse_file(const char *name) | 930 | static void parse_file(const char *name) |
803 | { | 931 | { |
932 | opt_file = name; | ||
804 | } | 933 | } |
805 | 934 | ||
806 | static void parse_addr_range(const char *optarg) | 935 | static void parse_addr_range(const char *optarg) |
@@ -991,15 +1120,20 @@ int main(int argc, char *argv[]) | |||
991 | 1120 | ||
992 | if (opt_list && opt_pid) | 1121 | if (opt_list && opt_pid) |
993 | printf("voffset\t"); | 1122 | printf("voffset\t"); |
1123 | if (opt_list && opt_file) | ||
1124 | printf("foffset\t"); | ||
994 | if (opt_list == 1) | 1125 | if (opt_list == 1) |
995 | printf("offset\tlen\tflags\n"); | 1126 | printf("offset\tlen\tflags\n"); |
996 | if (opt_list == 2) | 1127 | if (opt_list == 2) |
997 | printf("offset\tflags\n"); | 1128 | printf("offset\tflags\n"); |
998 | 1129 | ||
999 | walk_addr_ranges(); | 1130 | if (opt_file) |
1131 | walk_page_cache(); | ||
1132 | else | ||
1133 | walk_addr_ranges(); | ||
1000 | 1134 | ||
1001 | if (opt_list == 1) | 1135 | if (opt_list == 1) |
1002 | show_page_range(0, 0, 0); /* drain the buffer */ | 1136 | flush_page_range(); |
1003 | 1137 | ||
1004 | if (opt_no_summary) | 1138 | if (opt_no_summary) |
1005 | return 0; | 1139 | return 0; |