diff options
| author | Ingo Molnar <mingo@kernel.org> | 2013-12-18 05:10:03 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2013-12-18 08:07:26 -0500 |
| commit | fa6e8e5f7cbf85f364ebd5a90525dbbe9de2083b (patch) | |
| tree | a85962bf1567292ac58f8340edc16f6cc35ea918 | |
| parent | 9450d14fb959336803e5209119eb422b667b96aa (diff) | |
| parent | f23b24f1bf90b56cfaeb2a1c9b77c46efe8916a6 (diff) | |
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and refactorings from Arnaldo Carvalho de Melo:
New features:
. In perf timechart:
- Add backtrace support to CPU info
. Print pid along the name
. Add support for CPU topology
. Add new option --highlight'ing threads, be it by name or,
if a numeric value is provided, that run more than given duration.
From Stanislav Fomichev.
Refactorings:
. Rename some struct DSO binary_type related members and methods,
to clarify its purpose and need for differentiation from symtab_type,
i.e. one is about the files .text, CFI, etc, i.e. its binary contents,
and the other is about where the symbol table came from.
. Convert to new topic libraries, starting with an API one (sysfs, debugfs,
etc), renaming liblk in the process, from Borislav Petkov.
. Get rid of some more panic() like error handling in libtraceevent,
from Namhyung Kim.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
26 files changed, 344 insertions, 142 deletions
diff --git a/tools/Makefile b/tools/Makefile index a9b02008443c..927cd46d36dc 100644 --- a/tools/Makefile +++ b/tools/Makefile | |||
| @@ -39,10 +39,10 @@ cpupower: FORCE | |||
| 39 | cgroup firewire guest usb virtio vm net: FORCE | 39 | cgroup firewire guest usb virtio vm net: FORCE |
| 40 | $(call descend,$@) | 40 | $(call descend,$@) |
| 41 | 41 | ||
| 42 | liblk: FORCE | 42 | libapikfs: FORCE |
| 43 | $(call descend,lib/lk) | 43 | $(call descend,lib/api) |
| 44 | 44 | ||
| 45 | perf: liblk FORCE | 45 | perf: libapikfs FORCE |
| 46 | $(call descend,$@) | 46 | $(call descend,$@) |
| 47 | 47 | ||
| 48 | selftests: FORCE | 48 | selftests: FORCE |
| @@ -80,10 +80,10 @@ cpupower_clean: | |||
| 80 | cgroup_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean: | 80 | cgroup_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean: |
| 81 | $(call descend,$(@:_clean=),clean) | 81 | $(call descend,$(@:_clean=),clean) |
| 82 | 82 | ||
| 83 | liblk_clean: | 83 | libapikfs_clean: |
| 84 | $(call descend,lib/lk,clean) | 84 | $(call descend,lib/api,clean) |
| 85 | 85 | ||
| 86 | perf_clean: liblk_clean | 86 | perf_clean: libapikfs_clean |
| 87 | $(call descend,$(@:_clean=),clean) | 87 | $(call descend,$(@:_clean=),clean) |
| 88 | 88 | ||
| 89 | selftests_clean: | 89 | selftests_clean: |
diff --git a/tools/lib/lk/Makefile b/tools/lib/api/Makefile index 3dba0a4aebbf..ed2f51e11b80 100644 --- a/tools/lib/lk/Makefile +++ b/tools/lib/api/Makefile | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | include ../../scripts/Makefile.include | 1 | include ../../scripts/Makefile.include |
| 2 | include ../../perf/config/utilities.mak # QUIET_CLEAN | ||
| 2 | 3 | ||
| 3 | CC = $(CROSS_COMPILE)gcc | 4 | CC = $(CROSS_COMPILE)gcc |
| 4 | AR = $(CROSS_COMPILE)ar | 5 | AR = $(CROSS_COMPILE)ar |
| @@ -7,11 +8,11 @@ AR = $(CROSS_COMPILE)ar | |||
| 7 | LIB_H= | 8 | LIB_H= |
| 8 | LIB_OBJS= | 9 | LIB_OBJS= |
| 9 | 10 | ||
| 10 | LIB_H += debugfs.h | 11 | LIB_H += fs/debugfs.h |
| 11 | 12 | ||
| 12 | LIB_OBJS += $(OUTPUT)debugfs.o | 13 | LIB_OBJS += $(OUTPUT)fs/debugfs.o |
| 13 | 14 | ||
| 14 | LIBFILE = liblk.a | 15 | LIBFILE = libapikfs.a |
| 15 | 16 | ||
| 16 | CFLAGS = -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) -fPIC | 17 | CFLAGS = -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) -fPIC |
| 17 | EXTLIBS = -lelf -lpthread -lrt -lm | 18 | EXTLIBS = -lelf -lpthread -lrt -lm |
| @@ -25,14 +26,17 @@ $(LIBFILE): $(LIB_OBJS) | |||
| 25 | 26 | ||
| 26 | $(LIB_OBJS): $(LIB_H) | 27 | $(LIB_OBJS): $(LIB_H) |
| 27 | 28 | ||
| 28 | $(OUTPUT)%.o: %.c | 29 | libapi_dirs: |
| 30 | $(QUIET_MKDIR)mkdir -p $(OUTPUT)fs/ | ||
| 31 | |||
| 32 | $(OUTPUT)%.o: %.c libapi_dirs | ||
| 29 | $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $< | 33 | $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $< |
| 30 | $(OUTPUT)%.s: %.c | 34 | $(OUTPUT)%.s: %.c libapi_dirs |
| 31 | $(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $< | 35 | $(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $< |
| 32 | $(OUTPUT)%.o: %.S | 36 | $(OUTPUT)%.o: %.S libapi_dirs |
| 33 | $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $< | 37 | $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $< |
| 34 | 38 | ||
| 35 | clean: | 39 | clean: |
| 36 | $(RM) $(LIB_OBJS) $(LIBFILE) | 40 | $(call QUIET_CLEAN, libapi) $(RM) $(LIB_OBJS) $(LIBFILE) |
| 37 | 41 | ||
| 38 | .PHONY: clean | 42 | .PHONY: clean |
diff --git a/tools/lib/lk/debugfs.c b/tools/lib/api/fs/debugfs.c index 7c4347962353..7c4347962353 100644 --- a/tools/lib/lk/debugfs.c +++ b/tools/lib/api/fs/debugfs.c | |||
diff --git a/tools/lib/lk/debugfs.h b/tools/lib/api/fs/debugfs.h index 935c59bdb442..f19d3df9609d 100644 --- a/tools/lib/lk/debugfs.h +++ b/tools/lib/api/fs/debugfs.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __LK_DEBUGFS_H__ | 1 | #ifndef __API_DEBUGFS_H__ |
| 2 | #define __LK_DEBUGFS_H__ | 2 | #define __API_DEBUGFS_H__ |
| 3 | 3 | ||
| 4 | #define _STR(x) #x | 4 | #define _STR(x) #x |
| 5 | #define STR(x) _STR(x) | 5 | #define STR(x) _STR(x) |
| @@ -26,4 +26,4 @@ char *debugfs_mount(const char *mountpoint); | |||
| 26 | 26 | ||
| 27 | extern char debugfs_mountpoint[]; | 27 | extern char debugfs_mountpoint[]; |
| 28 | 28 | ||
| 29 | #endif /* __LK_DEBUGFS_H__ */ | 29 | #endif /* __API_DEBUGFS_H__ */ |
diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c index 9303c55128db..e2842b926759 100644 --- a/tools/lib/traceevent/parse-filter.c +++ b/tools/lib/traceevent/parse-filter.c | |||
| @@ -1361,8 +1361,10 @@ enum pevent_errno pevent_filter_add_filter_str(struct event_filter *filter, | |||
| 1361 | if (ret >= 0 && pevent->test_filters) { | 1361 | if (ret >= 0 && pevent->test_filters) { |
| 1362 | char *test; | 1362 | char *test; |
| 1363 | test = pevent_filter_make_string(filter, event->event->id); | 1363 | test = pevent_filter_make_string(filter, event->event->id); |
| 1364 | printf(" '%s: %s'\n", event->event->name, test); | 1364 | if (test) { |
| 1365 | free(test); | 1365 | printf(" '%s: %s'\n", event->event->name, test); |
| 1366 | free(test); | ||
| 1367 | } | ||
| 1366 | } | 1368 | } |
| 1367 | } | 1369 | } |
| 1368 | 1370 | ||
| @@ -2050,7 +2052,6 @@ static char *op_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2050 | int left_val = -1; | 2052 | int left_val = -1; |
| 2051 | int right_val = -1; | 2053 | int right_val = -1; |
| 2052 | int val; | 2054 | int val; |
| 2053 | int len; | ||
| 2054 | 2055 | ||
| 2055 | switch (arg->op.type) { | 2056 | switch (arg->op.type) { |
| 2056 | case FILTER_OP_AND: | 2057 | case FILTER_OP_AND: |
| @@ -2097,11 +2098,7 @@ static char *op_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2097 | default: | 2098 | default: |
| 2098 | break; | 2099 | break; |
| 2099 | } | 2100 | } |
| 2100 | str = malloc_or_die(6); | 2101 | asprintf(&str, val ? "TRUE" : "FALSE"); |
| 2101 | if (val) | ||
| 2102 | strcpy(str, "TRUE"); | ||
| 2103 | else | ||
| 2104 | strcpy(str, "FALSE"); | ||
| 2105 | break; | 2102 | break; |
| 2106 | } | 2103 | } |
| 2107 | } | 2104 | } |
| @@ -2119,10 +2116,7 @@ static char *op_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2119 | break; | 2116 | break; |
| 2120 | } | 2117 | } |
| 2121 | 2118 | ||
| 2122 | len = strlen(left) + strlen(right) + strlen(op) + 10; | 2119 | asprintf(&str, "(%s) %s (%s)", left, op, right); |
| 2123 | str = malloc_or_die(len); | ||
| 2124 | snprintf(str, len, "(%s) %s (%s)", | ||
| 2125 | left, op, right); | ||
| 2126 | break; | 2120 | break; |
| 2127 | 2121 | ||
| 2128 | case FILTER_OP_NOT: | 2122 | case FILTER_OP_NOT: |
| @@ -2138,16 +2132,10 @@ static char *op_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2138 | right_val = 0; | 2132 | right_val = 0; |
| 2139 | if (right_val >= 0) { | 2133 | if (right_val >= 0) { |
| 2140 | /* just return the opposite */ | 2134 | /* just return the opposite */ |
| 2141 | str = malloc_or_die(6); | 2135 | asprintf(&str, right_val ? "FALSE" : "TRUE"); |
| 2142 | if (right_val) | ||
| 2143 | strcpy(str, "FALSE"); | ||
| 2144 | else | ||
| 2145 | strcpy(str, "TRUE"); | ||
| 2146 | break; | 2136 | break; |
| 2147 | } | 2137 | } |
| 2148 | len = strlen(right) + strlen(op) + 3; | 2138 | asprintf(&str, "%s(%s)", op, right); |
| 2149 | str = malloc_or_die(len); | ||
| 2150 | snprintf(str, len, "%s(%s)", op, right); | ||
| 2151 | break; | 2139 | break; |
| 2152 | 2140 | ||
| 2153 | default: | 2141 | default: |
| @@ -2161,11 +2149,9 @@ static char *op_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2161 | 2149 | ||
| 2162 | static char *val_to_str(struct event_filter *filter, struct filter_arg *arg) | 2150 | static char *val_to_str(struct event_filter *filter, struct filter_arg *arg) |
| 2163 | { | 2151 | { |
| 2164 | char *str; | 2152 | char *str = NULL; |
| 2165 | |||
| 2166 | str = malloc_or_die(30); | ||
| 2167 | 2153 | ||
| 2168 | snprintf(str, 30, "%lld", arg->value.val); | 2154 | asprintf(&str, "%lld", arg->value.val); |
| 2169 | 2155 | ||
| 2170 | return str; | 2156 | return str; |
| 2171 | } | 2157 | } |
| @@ -2181,7 +2167,6 @@ static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2181 | char *rstr; | 2167 | char *rstr; |
| 2182 | char *op; | 2168 | char *op; |
| 2183 | char *str = NULL; | 2169 | char *str = NULL; |
| 2184 | int len; | ||
| 2185 | 2170 | ||
| 2186 | lstr = arg_to_str(filter, arg->exp.left); | 2171 | lstr = arg_to_str(filter, arg->exp.left); |
| 2187 | rstr = arg_to_str(filter, arg->exp.right); | 2172 | rstr = arg_to_str(filter, arg->exp.right); |
| @@ -2220,12 +2205,11 @@ static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2220 | op = "^"; | 2205 | op = "^"; |
| 2221 | break; | 2206 | break; |
| 2222 | default: | 2207 | default: |
| 2223 | die("oops in exp"); | 2208 | op = "[ERROR IN EXPRESSION TYPE]"; |
| 2209 | break; | ||
| 2224 | } | 2210 | } |
| 2225 | 2211 | ||
| 2226 | len = strlen(op) + strlen(lstr) + strlen(rstr) + 4; | 2212 | asprintf(&str, "%s %s %s", lstr, op, rstr); |
| 2227 | str = malloc_or_die(len); | ||
| 2228 | snprintf(str, len, "%s %s %s", lstr, op, rstr); | ||
| 2229 | out: | 2213 | out: |
| 2230 | free(lstr); | 2214 | free(lstr); |
| 2231 | free(rstr); | 2215 | free(rstr); |
| @@ -2239,7 +2223,6 @@ static char *num_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2239 | char *rstr; | 2223 | char *rstr; |
| 2240 | char *str = NULL; | 2224 | char *str = NULL; |
| 2241 | char *op = NULL; | 2225 | char *op = NULL; |
| 2242 | int len; | ||
| 2243 | 2226 | ||
| 2244 | lstr = arg_to_str(filter, arg->num.left); | 2227 | lstr = arg_to_str(filter, arg->num.left); |
| 2245 | rstr = arg_to_str(filter, arg->num.right); | 2228 | rstr = arg_to_str(filter, arg->num.right); |
| @@ -2270,10 +2253,7 @@ static char *num_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2270 | if (!op) | 2253 | if (!op) |
| 2271 | op = "<="; | 2254 | op = "<="; |
| 2272 | 2255 | ||
| 2273 | len = strlen(lstr) + strlen(op) + strlen(rstr) + 4; | 2256 | asprintf(&str, "%s %s %s", lstr, op, rstr); |
| 2274 | str = malloc_or_die(len); | ||
| 2275 | sprintf(str, "%s %s %s", lstr, op, rstr); | ||
| 2276 | |||
| 2277 | break; | 2257 | break; |
| 2278 | 2258 | ||
| 2279 | default: | 2259 | default: |
| @@ -2291,7 +2271,6 @@ static char *str_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2291 | { | 2271 | { |
| 2292 | char *str = NULL; | 2272 | char *str = NULL; |
| 2293 | char *op = NULL; | 2273 | char *op = NULL; |
| 2294 | int len; | ||
| 2295 | 2274 | ||
| 2296 | switch (arg->str.type) { | 2275 | switch (arg->str.type) { |
| 2297 | case FILTER_CMP_MATCH: | 2276 | case FILTER_CMP_MATCH: |
| @@ -2309,12 +2288,8 @@ static char *str_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2309 | if (!op) | 2288 | if (!op) |
| 2310 | op = "!~"; | 2289 | op = "!~"; |
| 2311 | 2290 | ||
| 2312 | len = strlen(arg->str.field->name) + strlen(op) + | 2291 | asprintf(&str, "%s %s \"%s\"", |
| 2313 | strlen(arg->str.val) + 6; | 2292 | arg->str.field->name, op, arg->str.val); |
| 2314 | str = malloc_or_die(len); | ||
| 2315 | snprintf(str, len, "%s %s \"%s\"", | ||
| 2316 | arg->str.field->name, | ||
| 2317 | op, arg->str.val); | ||
| 2318 | break; | 2293 | break; |
| 2319 | 2294 | ||
| 2320 | default: | 2295 | default: |
| @@ -2326,15 +2301,11 @@ static char *str_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2326 | 2301 | ||
| 2327 | static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg) | 2302 | static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg) |
| 2328 | { | 2303 | { |
| 2329 | char *str; | 2304 | char *str = NULL; |
| 2330 | 2305 | ||
| 2331 | switch (arg->type) { | 2306 | switch (arg->type) { |
| 2332 | case FILTER_ARG_BOOLEAN: | 2307 | case FILTER_ARG_BOOLEAN: |
| 2333 | str = malloc_or_die(6); | 2308 | asprintf(&str, arg->boolean.value ? "TRUE" : "FALSE"); |
| 2334 | if (arg->boolean.value) | ||
| 2335 | strcpy(str, "TRUE"); | ||
| 2336 | else | ||
| 2337 | strcpy(str, "FALSE"); | ||
| 2338 | return str; | 2309 | return str; |
| 2339 | 2310 | ||
| 2340 | case FILTER_ARG_OP: | 2311 | case FILTER_ARG_OP: |
| @@ -2369,7 +2340,7 @@ static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
| 2369 | * | 2340 | * |
| 2370 | * Returns a string that displays the filter contents. | 2341 | * Returns a string that displays the filter contents. |
| 2371 | * This string must be freed with free(str). | 2342 | * This string must be freed with free(str). |
| 2372 | * NULL is returned if no filter is found. | 2343 | * NULL is returned if no filter is found or allocation failed. |
| 2373 | */ | 2344 | */ |
| 2374 | char * | 2345 | char * |
| 2375 | pevent_filter_make_string(struct event_filter *filter, int event_id) | 2346 | pevent_filter_make_string(struct event_filter *filter, int event_id) |
diff --git a/tools/perf/Documentation/perf-timechart.txt b/tools/perf/Documentation/perf-timechart.txt index 271dd4ed5b05..bc5990c33dc0 100644 --- a/tools/perf/Documentation/perf-timechart.txt +++ b/tools/perf/Documentation/perf-timechart.txt | |||
| @@ -56,9 +56,25 @@ $ perf timechart | |||
| 56 | 56 | ||
| 57 | Written 10.2 seconds of trace to output.svg. | 57 | Written 10.2 seconds of trace to output.svg. |
| 58 | 58 | ||
| 59 | Record system-wide timechart: | ||
| 60 | |||
| 61 | $ perf timechart record | ||
| 62 | |||
| 63 | then generate timechart and highlight 'gcc' tasks: | ||
| 64 | |||
| 65 | $ perf timechart --highlight gcc | ||
| 66 | |||
| 59 | -n:: | 67 | -n:: |
| 60 | --proc-num:: | 68 | --proc-num:: |
| 61 | Print task info for at least given number of tasks. | 69 | Print task info for at least given number of tasks. |
| 70 | -t:: | ||
| 71 | --topology:: | ||
| 72 | Sort CPUs according to topology. | ||
| 73 | --highlight=<duration_nsecs|task_name>:: | ||
| 74 | Highlight tasks (using different color) that run more than given | ||
| 75 | duration or tasks with given name. If number is given it's interpreted | ||
| 76 | as number of nanoseconds. If non-numeric string is given it's | ||
| 77 | interpreted as task name. | ||
| 62 | 78 | ||
| 63 | RECORD OPTIONS | 79 | RECORD OPTIONS |
| 64 | -------------- | 80 | -------------- |
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index fad61079e795..97a2145e4cc6 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
| @@ -86,7 +86,7 @@ FLEX = flex | |||
| 86 | BISON = bison | 86 | BISON = bison |
| 87 | STRIP = strip | 87 | STRIP = strip |
| 88 | 88 | ||
| 89 | LK_DIR = $(srctree)/tools/lib/lk/ | 89 | LIB_DIR = $(srctree)/tools/lib/api/ |
| 90 | TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/ | 90 | TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/ |
| 91 | 91 | ||
| 92 | # include config/Makefile by default and rule out | 92 | # include config/Makefile by default and rule out |
| @@ -127,20 +127,20 @@ strip-libs = $(filter-out -l%,$(1)) | |||
| 127 | ifneq ($(OUTPUT),) | 127 | ifneq ($(OUTPUT),) |
| 128 | TE_PATH=$(OUTPUT) | 128 | TE_PATH=$(OUTPUT) |
| 129 | ifneq ($(subdir),) | 129 | ifneq ($(subdir),) |
| 130 | LK_PATH=$(OUTPUT)/../lib/lk/ | 130 | LIB_PATH=$(OUTPUT)/../lib/api/ |
| 131 | else | 131 | else |
| 132 | LK_PATH=$(OUTPUT) | 132 | LIB_PATH=$(OUTPUT) |
| 133 | endif | 133 | endif |
| 134 | else | 134 | else |
| 135 | TE_PATH=$(TRACE_EVENT_DIR) | 135 | TE_PATH=$(TRACE_EVENT_DIR) |
| 136 | LK_PATH=$(LK_DIR) | 136 | LIB_PATH=$(LIB_DIR) |
| 137 | endif | 137 | endif |
| 138 | 138 | ||
| 139 | LIBTRACEEVENT = $(TE_PATH)libtraceevent.a | 139 | LIBTRACEEVENT = $(TE_PATH)libtraceevent.a |
| 140 | export LIBTRACEEVENT | 140 | export LIBTRACEEVENT |
| 141 | 141 | ||
| 142 | LIBLK = $(LK_PATH)liblk.a | 142 | LIBAPIKFS = $(LIB_PATH)libapikfs.a |
| 143 | export LIBLK | 143 | export LIBAPIKFS |
| 144 | 144 | ||
| 145 | # python extension build directories | 145 | # python extension build directories |
| 146 | PYTHON_EXTBUILD := $(OUTPUT)python_ext_build/ | 146 | PYTHON_EXTBUILD := $(OUTPUT)python_ext_build/ |
| @@ -151,7 +151,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP | |||
| 151 | python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so | 151 | python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so |
| 152 | 152 | ||
| 153 | PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources) | 153 | PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources) |
| 154 | PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBLK) | 154 | PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPIKFS) |
| 155 | 155 | ||
| 156 | $(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) | 156 | $(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) |
| 157 | $(QUIET_GEN)CFLAGS='$(CFLAGS)' $(PYTHON_WORD) util/setup.py \ | 157 | $(QUIET_GEN)CFLAGS='$(CFLAGS)' $(PYTHON_WORD) util/setup.py \ |
| @@ -441,7 +441,7 @@ BUILTIN_OBJS += $(OUTPUT)builtin-inject.o | |||
| 441 | BUILTIN_OBJS += $(OUTPUT)tests/builtin-test.o | 441 | BUILTIN_OBJS += $(OUTPUT)tests/builtin-test.o |
| 442 | BUILTIN_OBJS += $(OUTPUT)builtin-mem.o | 442 | BUILTIN_OBJS += $(OUTPUT)builtin-mem.o |
| 443 | 443 | ||
| 444 | PERFLIBS = $(LIB_FILE) $(LIBLK) $(LIBTRACEEVENT) | 444 | PERFLIBS = $(LIB_FILE) $(LIBAPIKFS) $(LIBTRACEEVENT) |
| 445 | 445 | ||
| 446 | # We choose to avoid "if .. else if .. else .. endif endif" | 446 | # We choose to avoid "if .. else if .. else .. endif endif" |
| 447 | # because maintaining the nesting to match is a pain. If | 447 | # because maintaining the nesting to match is a pain. If |
| @@ -730,19 +730,19 @@ $(LIBTRACEEVENT)-clean: | |||
| 730 | install-traceevent-plugins: $(LIBTRACEEVENT) | 730 | install-traceevent-plugins: $(LIBTRACEEVENT) |
| 731 | $(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) install_plugins | 731 | $(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) install_plugins |
| 732 | 732 | ||
| 733 | LIBLK_SOURCES = $(wildcard $(LK_PATH)*.[ch]) | 733 | LIBAPIKFS_SOURCES = $(wildcard $(LIB_PATH)fs/*.[ch]) |
| 734 | 734 | ||
| 735 | # if subdir is set, we've been called from above so target has been built | 735 | # if subdir is set, we've been called from above so target has been built |
| 736 | # already | 736 | # already |
| 737 | $(LIBLK): $(LIBLK_SOURCES) | 737 | $(LIBAPIKFS): $(LIBAPIKFS_SOURCES) |
| 738 | ifeq ($(subdir),) | 738 | ifeq ($(subdir),) |
| 739 | $(QUIET_SUBDIR0)$(LK_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) liblk.a | 739 | $(QUIET_SUBDIR0)$(LIB_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) libapikfs.a |
| 740 | endif | 740 | endif |
| 741 | 741 | ||
| 742 | $(LIBLK)-clean: | 742 | $(LIBAPIKFS)-clean: |
| 743 | ifeq ($(subdir),) | 743 | ifeq ($(subdir),) |
| 744 | $(call QUIET_CLEAN, liblk) | 744 | $(call QUIET_CLEAN, libapikfs) |
| 745 | @$(MAKE) -C $(LK_DIR) O=$(OUTPUT) clean >/dev/null | 745 | @$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null |
| 746 | endif | 746 | endif |
| 747 | 747 | ||
| 748 | help: | 748 | help: |
| @@ -881,12 +881,11 @@ config-clean: | |||
| 881 | $(call QUIET_CLEAN, config) | 881 | $(call QUIET_CLEAN, config) |
| 882 | @$(MAKE) -C config/feature-checks clean >/dev/null | 882 | @$(MAKE) -C config/feature-checks clean >/dev/null |
| 883 | 883 | ||
| 884 | clean: $(LIBTRACEEVENT)-clean $(LIBLK)-clean config-clean | 884 | clean: $(LIBTRACEEVENT)-clean $(LIBAPIKFS)-clean config-clean |
| 885 | $(call QUIET_CLEAN, core-objs) $(RM) $(LIB_OBJS) $(BUILTIN_OBJS) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf.o $(LANG_BINDINGS) $(GTK_OBJS) | 885 | $(call QUIET_CLEAN, core-objs) $(RM) $(LIB_OBJS) $(BUILTIN_OBJS) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf.o $(LANG_BINDINGS) $(GTK_OBJS) |
| 886 | $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf | 886 | $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf |
| 887 | $(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* | 887 | $(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* |
| 888 | $(call QUIET_CLEAN, Documentation) | 888 | $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean |
| 889 | @$(MAKE) -C Documentation O=$(OUTPUT) clean >/dev/null | ||
| 890 | $(python-clean) | 889 | $(python-clean) |
| 891 | 890 | ||
| 892 | # | 891 | # |
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index c6fa3cbd45a9..154b397a5d27 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "util/parse-options.h" | 13 | #include "util/parse-options.h" |
| 14 | #include "util/trace-event.h" | 14 | #include "util/trace-event.h" |
| 15 | #include "util/debug.h" | 15 | #include "util/debug.h" |
| 16 | #include <lk/debugfs.h> | 16 | #include <api/fs/debugfs.h> |
| 17 | #include "util/tool.h" | 17 | #include "util/tool.h" |
| 18 | #include "util/stat.h" | 18 | #include "util/stat.h" |
| 19 | #include "util/top.h" | 19 | #include "util/top.h" |
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 6ea9e85bdc00..c98ccb570509 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | #include "util/strfilter.h" | 37 | #include "util/strfilter.h" |
| 38 | #include "util/symbol.h" | 38 | #include "util/symbol.h" |
| 39 | #include "util/debug.h" | 39 | #include "util/debug.h" |
| 40 | #include <lk/debugfs.h> | 40 | #include <api/fs/debugfs.h> |
| 41 | #include "util/parse-options.h" | 41 | #include "util/parse-options.h" |
| 42 | #include "util/probe-finder.h" | 42 | #include "util/probe-finder.h" |
| 43 | #include "util/probe-event.h" | 43 | #include "util/probe-event.h" |
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 0bda620a717d..20d4212fa337 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
| @@ -58,7 +58,8 @@ struct timechart { | |||
| 58 | first_time, last_time; | 58 | first_time, last_time; |
| 59 | bool power_only, | 59 | bool power_only, |
| 60 | tasks_only, | 60 | tasks_only, |
| 61 | with_backtrace; | 61 | with_backtrace, |
| 62 | topology; | ||
| 62 | }; | 63 | }; |
| 63 | 64 | ||
| 64 | struct per_pidcomm; | 65 | struct per_pidcomm; |
| @@ -531,12 +532,10 @@ static int process_sample_event(struct perf_tool *tool, | |||
| 531 | tchart->last_time = sample->time; | 532 | tchart->last_time = sample->time; |
| 532 | } | 533 | } |
| 533 | 534 | ||
| 534 | if (sample->cpu > tchart->numcpus) | ||
| 535 | tchart->numcpus = sample->cpu; | ||
| 536 | |||
| 537 | if (evsel->handler != NULL) { | 535 | if (evsel->handler != NULL) { |
| 538 | tracepoint_handler f = evsel->handler; | 536 | tracepoint_handler f = evsel->handler; |
| 539 | return f(tchart, evsel, sample, cat_backtrace(event, sample, machine)); | 537 | return f(tchart, evsel, sample, |
| 538 | cat_backtrace(event, sample, machine)); | ||
| 540 | } | 539 | } |
| 541 | 540 | ||
| 542 | return 0; | 541 | return 0; |
| @@ -837,8 +836,14 @@ static void draw_cpu_usage(struct timechart *tchart) | |||
| 837 | while (c) { | 836 | while (c) { |
| 838 | sample = c->samples; | 837 | sample = c->samples; |
| 839 | while (sample) { | 838 | while (sample) { |
| 840 | if (sample->type == TYPE_RUNNING) | 839 | if (sample->type == TYPE_RUNNING) { |
| 841 | svg_process(sample->cpu, sample->start_time, sample->end_time, "sample", c->comm); | 840 | svg_process(sample->cpu, |
| 841 | sample->start_time, | ||
| 842 | sample->end_time, | ||
| 843 | p->pid, | ||
| 844 | c->comm, | ||
| 845 | sample->backtrace); | ||
| 846 | } | ||
| 842 | 847 | ||
| 843 | sample = sample->next; | 848 | sample = sample->next; |
| 844 | } | 849 | } |
| @@ -1031,8 +1036,6 @@ static void write_svg_file(struct timechart *tchart, const char *filename) | |||
| 1031 | int count; | 1036 | int count; |
| 1032 | int thresh = TIME_THRESH; | 1037 | int thresh = TIME_THRESH; |
| 1033 | 1038 | ||
| 1034 | tchart->numcpus++; | ||
| 1035 | |||
| 1036 | if (tchart->power_only) | 1039 | if (tchart->power_only) |
| 1037 | tchart->proc_num = 0; | 1040 | tchart->proc_num = 0; |
| 1038 | 1041 | ||
| @@ -1062,6 +1065,37 @@ static void write_svg_file(struct timechart *tchart, const char *filename) | |||
| 1062 | svg_close(); | 1065 | svg_close(); |
| 1063 | } | 1066 | } |
| 1064 | 1067 | ||
| 1068 | static int process_header(struct perf_file_section *section __maybe_unused, | ||
| 1069 | struct perf_header *ph, | ||
| 1070 | int feat, | ||
| 1071 | int fd __maybe_unused, | ||
| 1072 | void *data) | ||
| 1073 | { | ||
| 1074 | struct timechart *tchart = data; | ||
| 1075 | |||
| 1076 | switch (feat) { | ||
| 1077 | case HEADER_NRCPUS: | ||
| 1078 | tchart->numcpus = ph->env.nr_cpus_avail; | ||
| 1079 | break; | ||
| 1080 | |||
| 1081 | case HEADER_CPU_TOPOLOGY: | ||
| 1082 | if (!tchart->topology) | ||
| 1083 | break; | ||
| 1084 | |||
| 1085 | if (svg_build_topology_map(ph->env.sibling_cores, | ||
| 1086 | ph->env.nr_sibling_cores, | ||
| 1087 | ph->env.sibling_threads, | ||
| 1088 | ph->env.nr_sibling_threads)) | ||
| 1089 | fprintf(stderr, "problem building topology\n"); | ||
| 1090 | break; | ||
| 1091 | |||
| 1092 | default: | ||
| 1093 | break; | ||
| 1094 | } | ||
| 1095 | |||
| 1096 | return 0; | ||
| 1097 | } | ||
| 1098 | |||
| 1065 | static int __cmd_timechart(struct timechart *tchart, const char *output_name) | 1099 | static int __cmd_timechart(struct timechart *tchart, const char *output_name) |
| 1066 | { | 1100 | { |
| 1067 | const struct perf_evsel_str_handler power_tracepoints[] = { | 1101 | const struct perf_evsel_str_handler power_tracepoints[] = { |
| @@ -1087,6 +1121,11 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name) | |||
| 1087 | if (session == NULL) | 1121 | if (session == NULL) |
| 1088 | return -ENOMEM; | 1122 | return -ENOMEM; |
| 1089 | 1123 | ||
| 1124 | (void)perf_header__process_sections(&session->header, | ||
| 1125 | perf_data_file__fd(session->file), | ||
| 1126 | tchart, | ||
| 1127 | process_header); | ||
| 1128 | |||
| 1090 | if (!perf_session__has_traces(session, "timechart record")) | 1129 | if (!perf_session__has_traces(session, "timechart record")) |
| 1091 | goto out_delete; | 1130 | goto out_delete; |
| 1092 | 1131 | ||
| @@ -1212,6 +1251,23 @@ parse_process(const struct option *opt __maybe_unused, const char *arg, | |||
| 1212 | return 0; | 1251 | return 0; |
| 1213 | } | 1252 | } |
| 1214 | 1253 | ||
| 1254 | static int | ||
| 1255 | parse_highlight(const struct option *opt __maybe_unused, const char *arg, | ||
| 1256 | int __maybe_unused unset) | ||
| 1257 | { | ||
| 1258 | unsigned long duration = strtoul(arg, NULL, 0); | ||
| 1259 | |||
| 1260 | if (svg_highlight || svg_highlight_name) | ||
| 1261 | return -1; | ||
| 1262 | |||
| 1263 | if (duration) | ||
| 1264 | svg_highlight = duration; | ||
| 1265 | else | ||
| 1266 | svg_highlight_name = strdup(arg); | ||
| 1267 | |||
| 1268 | return 0; | ||
| 1269 | } | ||
| 1270 | |||
| 1215 | int cmd_timechart(int argc, const char **argv, | 1271 | int cmd_timechart(int argc, const char **argv, |
| 1216 | const char *prefix __maybe_unused) | 1272 | const char *prefix __maybe_unused) |
| 1217 | { | 1273 | { |
| @@ -1230,6 +1286,9 @@ int cmd_timechart(int argc, const char **argv, | |||
| 1230 | OPT_STRING('i', "input", &input_name, "file", "input file name"), | 1286 | OPT_STRING('i', "input", &input_name, "file", "input file name"), |
| 1231 | OPT_STRING('o', "output", &output_name, "file", "output file name"), | 1287 | OPT_STRING('o', "output", &output_name, "file", "output file name"), |
| 1232 | OPT_INTEGER('w', "width", &svg_page_width, "page width"), | 1288 | OPT_INTEGER('w', "width", &svg_page_width, "page width"), |
| 1289 | OPT_CALLBACK(0, "highlight", NULL, "duration or task name", | ||
| 1290 | "highlight tasks. Pass duration in ns or process name.", | ||
| 1291 | parse_highlight), | ||
| 1233 | OPT_BOOLEAN('P', "power-only", &tchart.power_only, "output power data only"), | 1292 | OPT_BOOLEAN('P', "power-only", &tchart.power_only, "output power data only"), |
| 1234 | OPT_BOOLEAN('T', "tasks-only", &tchart.tasks_only, | 1293 | OPT_BOOLEAN('T', "tasks-only", &tchart.tasks_only, |
| 1235 | "output processes data only"), | 1294 | "output processes data only"), |
| @@ -1240,6 +1299,8 @@ int cmd_timechart(int argc, const char **argv, | |||
| 1240 | "Look for files with symbols relative to this directory"), | 1299 | "Look for files with symbols relative to this directory"), |
| 1241 | OPT_INTEGER('n', "proc-num", &tchart.proc_num, | 1300 | OPT_INTEGER('n', "proc-num", &tchart.proc_num, |
| 1242 | "min. number of tasks to print"), | 1301 | "min. number of tasks to print"), |
| 1302 | OPT_BOOLEAN('t', "topology", &tchart.topology, | ||
| 1303 | "sort CPUs according to topology"), | ||
| 1243 | OPT_END() | 1304 | OPT_END() |
| 1244 | }; | 1305 | }; |
| 1245 | const char * const timechart_usage[] = { | 1306 | const char * const timechart_usage[] = { |
diff --git a/tools/perf/perf.c b/tools/perf/perf.c index 8b38b4e80ec2..431798a4110d 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "util/quote.h" | 13 | #include "util/quote.h" |
| 14 | #include "util/run-command.h" | 14 | #include "util/run-command.h" |
| 15 | #include "util/parse-events.h" | 15 | #include "util/parse-events.h" |
| 16 | #include <lk/debugfs.h> | 16 | #include <api/fs/debugfs.h> |
| 17 | #include <pthread.h> | 17 | #include <pthread.h> |
| 18 | 18 | ||
| 19 | const char perf_usage_string[] = | 19 | const char perf_usage_string[] = |
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index 3cbd10496087..e4ce8aed29d3 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | #include "evsel.h" | 3 | #include "evsel.h" |
| 4 | #include "evlist.h" | 4 | #include "evlist.h" |
| 5 | #include "fs.h" | 5 | #include "fs.h" |
| 6 | #include <lk/debugfs.h> | 6 | #include <api/fs/debugfs.h> |
| 7 | #include "tests.h" | 7 | #include "tests.h" |
| 8 | #include <linux/hw_breakpoint.h> | 8 | #include <linux/hw_breakpoint.h> |
| 9 | 9 | ||
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 436922f1f9d9..4ddeecb9ff85 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c | |||
| @@ -28,8 +28,9 @@ char dso__symtab_origin(const struct dso *dso) | |||
| 28 | return origin[dso->symtab_type]; | 28 | return origin[dso->symtab_type]; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | int dso__binary_type_file(const struct dso *dso, enum dso_binary_type type, | 31 | int dso__read_binary_type_filename(const struct dso *dso, |
| 32 | char *root_dir, char *filename, size_t size) | 32 | enum dso_binary_type type, |
| 33 | char *root_dir, char *filename, size_t size) | ||
| 33 | { | 34 | { |
| 34 | char build_id_hex[BUILD_ID_SIZE * 2 + 1]; | 35 | char build_id_hex[BUILD_ID_SIZE * 2 + 1]; |
| 35 | int ret = 0; | 36 | int ret = 0; |
| @@ -137,19 +138,18 @@ int dso__binary_type_file(const struct dso *dso, enum dso_binary_type type, | |||
| 137 | 138 | ||
| 138 | static int open_dso(struct dso *dso, struct machine *machine) | 139 | static int open_dso(struct dso *dso, struct machine *machine) |
| 139 | { | 140 | { |
| 140 | char *root_dir = (char *) ""; | ||
| 141 | char *name; | ||
| 142 | int fd; | 141 | int fd; |
| 142 | char *root_dir = (char *)""; | ||
| 143 | char *name = malloc(PATH_MAX); | ||
| 143 | 144 | ||
| 144 | name = malloc(PATH_MAX); | ||
| 145 | if (!name) | 145 | if (!name) |
| 146 | return -ENOMEM; | 146 | return -ENOMEM; |
| 147 | 147 | ||
| 148 | if (machine) | 148 | if (machine) |
| 149 | root_dir = machine->root_dir; | 149 | root_dir = machine->root_dir; |
| 150 | 150 | ||
| 151 | if (dso__binary_type_file(dso, dso->data_type, | 151 | if (dso__read_binary_type_filename(dso, dso->binary_type, |
| 152 | root_dir, name, PATH_MAX)) { | 152 | root_dir, name, PATH_MAX)) { |
| 153 | free(name); | 153 | free(name); |
| 154 | return -EINVAL; | 154 | return -EINVAL; |
| 155 | } | 155 | } |
| @@ -161,26 +161,26 @@ static int open_dso(struct dso *dso, struct machine *machine) | |||
| 161 | 161 | ||
| 162 | int dso__data_fd(struct dso *dso, struct machine *machine) | 162 | int dso__data_fd(struct dso *dso, struct machine *machine) |
| 163 | { | 163 | { |
| 164 | static enum dso_binary_type binary_type_data[] = { | 164 | enum dso_binary_type binary_type_data[] = { |
| 165 | DSO_BINARY_TYPE__BUILD_ID_CACHE, | 165 | DSO_BINARY_TYPE__BUILD_ID_CACHE, |
| 166 | DSO_BINARY_TYPE__SYSTEM_PATH_DSO, | 166 | DSO_BINARY_TYPE__SYSTEM_PATH_DSO, |
| 167 | DSO_BINARY_TYPE__NOT_FOUND, | 167 | DSO_BINARY_TYPE__NOT_FOUND, |
| 168 | }; | 168 | }; |
| 169 | int i = 0; | 169 | int i = 0; |
| 170 | 170 | ||
| 171 | if (dso->data_type != DSO_BINARY_TYPE__NOT_FOUND) | 171 | if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) |
| 172 | return open_dso(dso, machine); | 172 | return open_dso(dso, machine); |
| 173 | 173 | ||
| 174 | do { | 174 | do { |
| 175 | int fd; | 175 | int fd; |
| 176 | 176 | ||
| 177 | dso->data_type = binary_type_data[i++]; | 177 | dso->binary_type = binary_type_data[i++]; |
| 178 | 178 | ||
| 179 | fd = open_dso(dso, machine); | 179 | fd = open_dso(dso, machine); |
| 180 | if (fd >= 0) | 180 | if (fd >= 0) |
| 181 | return fd; | 181 | return fd; |
| 182 | 182 | ||
| 183 | } while (dso->data_type != DSO_BINARY_TYPE__NOT_FOUND); | 183 | } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); |
| 184 | 184 | ||
| 185 | return -EINVAL; | 185 | return -EINVAL; |
| 186 | } | 186 | } |
| @@ -475,7 +475,7 @@ struct dso *dso__new(const char *name) | |||
| 475 | dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; | 475 | dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; |
| 476 | dso->cache = RB_ROOT; | 476 | dso->cache = RB_ROOT; |
| 477 | dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; | 477 | dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; |
| 478 | dso->data_type = DSO_BINARY_TYPE__NOT_FOUND; | 478 | dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND; |
| 479 | dso->loaded = 0; | 479 | dso->loaded = 0; |
| 480 | dso->rel = 0; | 480 | dso->rel = 0; |
| 481 | dso->sorted_by_name = 0; | 481 | dso->sorted_by_name = 0; |
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index e1cc50698137..cd7d6f078cdd 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h | |||
| @@ -83,7 +83,7 @@ struct dso { | |||
| 83 | enum dso_kernel_type kernel; | 83 | enum dso_kernel_type kernel; |
| 84 | enum dso_swap_type needs_swap; | 84 | enum dso_swap_type needs_swap; |
| 85 | enum dso_binary_type symtab_type; | 85 | enum dso_binary_type symtab_type; |
| 86 | enum dso_binary_type data_type; | 86 | enum dso_binary_type binary_type; |
| 87 | u8 adjust_symbols:1; | 87 | u8 adjust_symbols:1; |
| 88 | u8 has_build_id:1; | 88 | u8 has_build_id:1; |
| 89 | u8 has_srcline:1; | 89 | u8 has_srcline:1; |
| @@ -128,8 +128,8 @@ void dso__read_running_kernel_build_id(struct dso *dso, | |||
| 128 | int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir); | 128 | int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir); |
| 129 | 129 | ||
| 130 | char dso__symtab_origin(const struct dso *dso); | 130 | char dso__symtab_origin(const struct dso *dso); |
| 131 | int dso__binary_type_file(const struct dso *dso, enum dso_binary_type type, | 131 | int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type, |
| 132 | char *root_dir, char *filename, size_t size); | 132 | char *root_dir, char *filename, size_t size); |
| 133 | 133 | ||
| 134 | int dso__data_fd(struct dso *dso, struct machine *machine); | 134 | int dso__data_fd(struct dso *dso, struct machine *machine); |
| 135 | ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, | 135 | ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, |
| @@ -159,14 +159,14 @@ size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp); | |||
| 159 | 159 | ||
| 160 | static inline bool dso__is_vmlinux(struct dso *dso) | 160 | static inline bool dso__is_vmlinux(struct dso *dso) |
| 161 | { | 161 | { |
| 162 | return dso->data_type == DSO_BINARY_TYPE__VMLINUX || | 162 | return dso->binary_type == DSO_BINARY_TYPE__VMLINUX || |
| 163 | dso->data_type == DSO_BINARY_TYPE__GUEST_VMLINUX; | 163 | dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | static inline bool dso__is_kcore(struct dso *dso) | 166 | static inline bool dso__is_kcore(struct dso *dso) |
| 167 | { | 167 | { |
| 168 | return dso->data_type == DSO_BINARY_TYPE__KCORE || | 168 | return dso->binary_type == DSO_BINARY_TYPE__KCORE || |
| 169 | dso->data_type == DSO_BINARY_TYPE__GUEST_KCORE; | 169 | dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | void dso__free_a2l(struct dso *dso); | 172 | void dso__free_a2l(struct dso *dso); |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 0b31cee34874..da3182914984 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * Released under the GPL v2. (and only v2, not any later version) | 7 | * Released under the GPL v2. (and only v2, not any later version) |
| 8 | */ | 8 | */ |
| 9 | #include "util.h" | 9 | #include "util.h" |
| 10 | #include <lk/debugfs.h> | 10 | #include <api/fs/debugfs.h> |
| 11 | #include <poll.h> | 11 | #include <poll.h> |
| 12 | #include "cpumap.h" | 12 | #include "cpumap.h" |
| 13 | #include "thread_map.h" | 13 | #include "thread_map.h" |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 7b510fd1f08d..01ff4cfde1f5 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | #include <byteswap.h> | 10 | #include <byteswap.h> |
| 11 | #include <linux/bitops.h> | 11 | #include <linux/bitops.h> |
| 12 | #include <lk/debugfs.h> | 12 | #include <api/fs/debugfs.h> |
| 13 | #include <traceevent/event-parse.h> | 13 | #include <traceevent/event-parse.h> |
| 14 | #include <linux/hw_breakpoint.h> | 14 | #include <linux/hw_breakpoint.h> |
| 15 | #include <linux/perf_event.h> | 15 | #include <linux/perf_event.h> |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 969cb8f0d88d..094c28ba2fae 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | #include "symbol.h" | 10 | #include "symbol.h" |
| 11 | #include "cache.h" | 11 | #include "cache.h" |
| 12 | #include "header.h" | 12 | #include "header.h" |
| 13 | #include <lk/debugfs.h> | 13 | #include <api/fs/debugfs.h> |
| 14 | #include "parse-events-bison.h" | 14 | #include "parse-events-bison.h" |
| 15 | #define YY_EXTRA_TYPE int | 15 | #define YY_EXTRA_TYPE int |
| 16 | #include "parse-events-flex.h" | 16 | #include "parse-events-flex.h" |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index d7cff57945c2..544ac1898a9f 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include "color.h" | 40 | #include "color.h" |
| 41 | #include "symbol.h" | 41 | #include "symbol.h" |
| 42 | #include "thread.h" | 42 | #include "thread.h" |
| 43 | #include <lk/debugfs.h> | 43 | #include <api/fs/debugfs.h> |
| 44 | #include "trace-event.h" /* For __maybe_unused */ | 44 | #include "trace-event.h" /* For __maybe_unused */ |
| 45 | #include "probe-event.h" | 45 | #include "probe-event.h" |
| 46 | #include "probe-finder.h" | 46 | #include "probe-finder.h" |
diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py index 58ea5ca6c255..d0aee4b9dfd4 100644 --- a/tools/perf/util/setup.py +++ b/tools/perf/util/setup.py | |||
| @@ -25,7 +25,7 @@ cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter' | |||
| 25 | build_lib = getenv('PYTHON_EXTBUILD_LIB') | 25 | build_lib = getenv('PYTHON_EXTBUILD_LIB') |
| 26 | build_tmp = getenv('PYTHON_EXTBUILD_TMP') | 26 | build_tmp = getenv('PYTHON_EXTBUILD_TMP') |
| 27 | libtraceevent = getenv('LIBTRACEEVENT') | 27 | libtraceevent = getenv('LIBTRACEEVENT') |
| 28 | liblk = getenv('LIBLK') | 28 | libapikfs = getenv('LIBAPIKFS') |
| 29 | 29 | ||
| 30 | ext_sources = [f.strip() for f in file('util/python-ext-sources') | 30 | ext_sources = [f.strip() for f in file('util/python-ext-sources') |
| 31 | if len(f.strip()) > 0 and f[0] != '#'] | 31 | if len(f.strip()) > 0 and f[0] != '#'] |
| @@ -34,7 +34,7 @@ perf = Extension('perf', | |||
| 34 | sources = ext_sources, | 34 | sources = ext_sources, |
| 35 | include_dirs = ['util/include'], | 35 | include_dirs = ['util/include'], |
| 36 | extra_compile_args = cflags, | 36 | extra_compile_args = cflags, |
| 37 | extra_objects = [libtraceevent, liblk], | 37 | extra_objects = [libtraceevent, libapikfs], |
| 38 | ) | 38 | ) |
| 39 | 39 | ||
| 40 | setup(name='perf', | 40 | setup(name='perf', |
diff --git a/tools/perf/util/svghelper.c b/tools/perf/util/svghelper.c index 8b79d3ad1246..56a84f2cc46d 100644 --- a/tools/perf/util/svghelper.c +++ b/tools/perf/util/svghelper.c | |||
| @@ -17,8 +17,11 @@ | |||
| 17 | #include <stdlib.h> | 17 | #include <stdlib.h> |
| 18 | #include <unistd.h> | 18 | #include <unistd.h> |
| 19 | #include <string.h> | 19 | #include <string.h> |
| 20 | #include <linux/bitops.h> | ||
| 20 | 21 | ||
| 22 | #include "perf.h" | ||
| 21 | #include "svghelper.h" | 23 | #include "svghelper.h" |
| 24 | #include "cpumap.h" | ||
| 22 | 25 | ||
| 23 | static u64 first_time, last_time; | 26 | static u64 first_time, last_time; |
| 24 | static u64 turbo_frequency, max_freq; | 27 | static u64 turbo_frequency, max_freq; |
| @@ -28,6 +31,8 @@ static u64 turbo_frequency, max_freq; | |||
| 28 | #define SLOT_HEIGHT 25.0 | 31 | #define SLOT_HEIGHT 25.0 |
| 29 | 32 | ||
| 30 | int svg_page_width = 1000; | 33 | int svg_page_width = 1000; |
| 34 | u64 svg_highlight; | ||
| 35 | const char *svg_highlight_name; | ||
| 31 | 36 | ||
| 32 | #define MIN_TEXT_SIZE 0.01 | 37 | #define MIN_TEXT_SIZE 0.01 |
| 33 | 38 | ||
| @@ -39,9 +44,14 @@ static double cpu2slot(int cpu) | |||
| 39 | return 2 * cpu + 1; | 44 | return 2 * cpu + 1; |
| 40 | } | 45 | } |
| 41 | 46 | ||
| 47 | static int *topology_map; | ||
| 48 | |||
| 42 | static double cpu2y(int cpu) | 49 | static double cpu2y(int cpu) |
| 43 | { | 50 | { |
| 44 | return cpu2slot(cpu) * SLOT_MULT; | 51 | if (topology_map) |
| 52 | return cpu2slot(topology_map[cpu]) * SLOT_MULT; | ||
| 53 | else | ||
| 54 | return cpu2slot(cpu) * SLOT_MULT; | ||
| 45 | } | 55 | } |
| 46 | 56 | ||
| 47 | static double time2pixels(u64 __time) | 57 | static double time2pixels(u64 __time) |
| @@ -104,6 +114,7 @@ void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end) | |||
| 104 | fprintf(svgfile, " rect.process { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:1; stroke:rgb( 0, 0, 0); } \n"); | 114 | fprintf(svgfile, " rect.process { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:1; stroke:rgb( 0, 0, 0); } \n"); |
| 105 | fprintf(svgfile, " rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 115 | fprintf(svgfile, " rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 106 | fprintf(svgfile, " rect.sample { fill:rgb( 0, 0,255); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 116 | fprintf(svgfile, " rect.sample { fill:rgb( 0, 0,255); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 117 | fprintf(svgfile, " rect.sample_hi{ fill:rgb(255,128, 0); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | ||
| 107 | fprintf(svgfile, " rect.blocked { fill:rgb(255, 0, 0); fill-opacity:0.5; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 118 | fprintf(svgfile, " rect.blocked { fill:rgb(255, 0, 0); fill-opacity:0.5; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 108 | fprintf(svgfile, " rect.waiting { fill:rgb(224,214, 0); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 119 | fprintf(svgfile, " rect.waiting { fill:rgb(224,214, 0); fill-opacity:0.8; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| 109 | fprintf(svgfile, " rect.WAITING { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); | 120 | fprintf(svgfile, " rect.WAITING { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0; stroke:rgb( 0, 0, 0); } \n"); |
| @@ -147,17 +158,24 @@ void svg_blocked(int Yslot, int cpu, u64 start, u64 end, const char *backtrace) | |||
| 147 | void svg_running(int Yslot, int cpu, u64 start, u64 end, const char *backtrace) | 158 | void svg_running(int Yslot, int cpu, u64 start, u64 end, const char *backtrace) |
| 148 | { | 159 | { |
| 149 | double text_size; | 160 | double text_size; |
| 161 | const char *type; | ||
| 162 | |||
| 150 | if (!svgfile) | 163 | if (!svgfile) |
| 151 | return; | 164 | return; |
| 152 | 165 | ||
| 166 | if (svg_highlight && end - start > svg_highlight) | ||
| 167 | type = "sample_hi"; | ||
| 168 | else | ||
| 169 | type = "sample"; | ||
| 153 | fprintf(svgfile, "<g>\n"); | 170 | fprintf(svgfile, "<g>\n"); |
| 154 | 171 | ||
| 155 | fprintf(svgfile, "<title>#%d running %s</title>\n", | 172 | fprintf(svgfile, "<title>#%d running %s</title>\n", |
| 156 | cpu, time_to_string(end - start)); | 173 | cpu, time_to_string(end - start)); |
| 157 | if (backtrace) | 174 | if (backtrace) |
| 158 | fprintf(svgfile, "<desc>Switched because:\n%s</desc>\n", backtrace); | 175 | fprintf(svgfile, "<desc>Switched because:\n%s</desc>\n", backtrace); |
| 159 | fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"sample\"/>\n", | 176 | fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"%s\"/>\n", |
| 160 | time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT); | 177 | time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT, |
| 178 | type); | ||
| 161 | 179 | ||
| 162 | text_size = (time2pixels(end)-time2pixels(start)); | 180 | text_size = (time2pixels(end)-time2pixels(start)); |
| 163 | if (cpu > 9) | 181 | if (cpu > 9) |
| @@ -275,7 +293,7 @@ void svg_cpu_box(int cpu, u64 __max_freq, u64 __turbo_freq) | |||
| 275 | time2pixels(last_time)-time2pixels(first_time), | 293 | time2pixels(last_time)-time2pixels(first_time), |
| 276 | cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT); | 294 | cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT); |
| 277 | 295 | ||
| 278 | sprintf(cpu_string, "CPU %i", (int)cpu+1); | 296 | sprintf(cpu_string, "CPU %i", (int)cpu); |
| 279 | fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>\n", | 297 | fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>\n", |
| 280 | 10+time2pixels(first_time), cpu2y(cpu) + SLOT_HEIGHT/2, cpu_string); | 298 | 10+time2pixels(first_time), cpu2y(cpu) + SLOT_HEIGHT/2, cpu_string); |
| 281 | 299 | ||
| @@ -285,16 +303,25 @@ void svg_cpu_box(int cpu, u64 __max_freq, u64 __turbo_freq) | |||
| 285 | fprintf(svgfile, "</g>\n"); | 303 | fprintf(svgfile, "</g>\n"); |
| 286 | } | 304 | } |
| 287 | 305 | ||
| 288 | void svg_process(int cpu, u64 start, u64 end, const char *type, const char *name) | 306 | void svg_process(int cpu, u64 start, u64 end, int pid, const char *name, const char *backtrace) |
| 289 | { | 307 | { |
| 290 | double width; | 308 | double width; |
| 309 | const char *type; | ||
| 291 | 310 | ||
| 292 | if (!svgfile) | 311 | if (!svgfile) |
| 293 | return; | 312 | return; |
| 294 | 313 | ||
| 314 | if (svg_highlight && end - start >= svg_highlight) | ||
| 315 | type = "sample_hi"; | ||
| 316 | else if (svg_highlight_name && strstr(name, svg_highlight_name)) | ||
| 317 | type = "sample_hi"; | ||
| 318 | else | ||
| 319 | type = "sample"; | ||
| 295 | 320 | ||
| 296 | fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">\n", time2pixels(start), cpu2y(cpu)); | 321 | fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">\n", time2pixels(start), cpu2y(cpu)); |
| 297 | fprintf(svgfile, "<title>%s %s</title>\n", name, time_to_string(end - start)); | 322 | fprintf(svgfile, "<title>%d %s running %s</title>\n", pid, name, time_to_string(end - start)); |
| 323 | if (backtrace) | ||
| 324 | fprintf(svgfile, "<desc>Switched because:\n%s</desc>\n", backtrace); | ||
| 298 | fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n", | 325 | fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n", |
| 299 | time2pixels(end)-time2pixels(start), SLOT_MULT+SLOT_HEIGHT, type); | 326 | time2pixels(end)-time2pixels(start), SLOT_MULT+SLOT_HEIGHT, type); |
| 300 | width = time2pixels(end)-time2pixels(start); | 327 | width = time2pixels(end)-time2pixels(start); |
| @@ -566,3 +593,123 @@ void svg_close(void) | |||
| 566 | svgfile = NULL; | 593 | svgfile = NULL; |
| 567 | } | 594 | } |
| 568 | } | 595 | } |
| 596 | |||
| 597 | #define cpumask_bits(maskp) ((maskp)->bits) | ||
| 598 | typedef struct { DECLARE_BITMAP(bits, MAX_NR_CPUS); } cpumask_t; | ||
| 599 | |||
| 600 | struct topology { | ||
| 601 | cpumask_t *sib_core; | ||
| 602 | int sib_core_nr; | ||
| 603 | cpumask_t *sib_thr; | ||
| 604 | int sib_thr_nr; | ||
| 605 | }; | ||
| 606 | |||
| 607 | static void scan_thread_topology(int *map, struct topology *t, int cpu, int *pos) | ||
| 608 | { | ||
| 609 | int i; | ||
| 610 | int thr; | ||
| 611 | |||
| 612 | for (i = 0; i < t->sib_thr_nr; i++) { | ||
| 613 | if (!test_bit(cpu, cpumask_bits(&t->sib_thr[i]))) | ||
| 614 | continue; | ||
| 615 | |||
| 616 | for_each_set_bit(thr, | ||
| 617 | cpumask_bits(&t->sib_thr[i]), | ||
| 618 | MAX_NR_CPUS) | ||
| 619 | if (map[thr] == -1) | ||
| 620 | map[thr] = (*pos)++; | ||
| 621 | } | ||
| 622 | } | ||
| 623 | |||
| 624 | static void scan_core_topology(int *map, struct topology *t) | ||
| 625 | { | ||
| 626 | int pos = 0; | ||
| 627 | int i; | ||
| 628 | int cpu; | ||
| 629 | |||
| 630 | for (i = 0; i < t->sib_core_nr; i++) | ||
| 631 | for_each_set_bit(cpu, | ||
| 632 | cpumask_bits(&t->sib_core[i]), | ||
| 633 | MAX_NR_CPUS) | ||
| 634 | scan_thread_topology(map, t, cpu, &pos); | ||
| 635 | } | ||
| 636 | |||
| 637 | static int str_to_bitmap(char *s, cpumask_t *b) | ||
| 638 | { | ||
| 639 | int i; | ||
| 640 | int ret = 0; | ||
| 641 | struct cpu_map *m; | ||
| 642 | int c; | ||
| 643 | |||
| 644 | m = cpu_map__new(s); | ||
| 645 | if (!m) | ||
| 646 | return -1; | ||
| 647 | |||
| 648 | for (i = 0; i < m->nr; i++) { | ||
| 649 | c = m->map[i]; | ||
| 650 | if (c >= MAX_NR_CPUS) { | ||
| 651 | ret = -1; | ||
| 652 | break; | ||
| 653 | } | ||
| 654 | |||
| 655 | set_bit(c, cpumask_bits(b)); | ||
| 656 | } | ||
| 657 | |||
| 658 | cpu_map__delete(m); | ||
| 659 | |||
| 660 | return ret; | ||
| 661 | } | ||
| 662 | |||
| 663 | int svg_build_topology_map(char *sib_core, int sib_core_nr, | ||
| 664 | char *sib_thr, int sib_thr_nr) | ||
| 665 | { | ||
| 666 | int i; | ||
| 667 | struct topology t; | ||
| 668 | |||
| 669 | t.sib_core_nr = sib_core_nr; | ||
| 670 | t.sib_thr_nr = sib_thr_nr; | ||
| 671 | t.sib_core = calloc(sib_core_nr, sizeof(cpumask_t)); | ||
| 672 | t.sib_thr = calloc(sib_thr_nr, sizeof(cpumask_t)); | ||
| 673 | |||
| 674 | if (!t.sib_core || !t.sib_thr) { | ||
| 675 | fprintf(stderr, "topology: no memory\n"); | ||
| 676 | goto exit; | ||
| 677 | } | ||
| 678 | |||
| 679 | for (i = 0; i < sib_core_nr; i++) { | ||
| 680 | if (str_to_bitmap(sib_core, &t.sib_core[i])) { | ||
| 681 | fprintf(stderr, "topology: can't parse siblings map\n"); | ||
| 682 | goto exit; | ||
| 683 | } | ||
| 684 | |||
| 685 | sib_core += strlen(sib_core) + 1; | ||
| 686 | } | ||
| 687 | |||
| 688 | for (i = 0; i < sib_thr_nr; i++) { | ||
| 689 | if (str_to_bitmap(sib_thr, &t.sib_thr[i])) { | ||
| 690 | fprintf(stderr, "topology: can't parse siblings map\n"); | ||
| 691 | goto exit; | ||
| 692 | } | ||
| 693 | |||
| 694 | sib_thr += strlen(sib_thr) + 1; | ||
| 695 | } | ||
| 696 | |||
| 697 | topology_map = malloc(sizeof(int) * MAX_NR_CPUS); | ||
| 698 | if (!topology_map) { | ||
| 699 | fprintf(stderr, "topology: no memory\n"); | ||
| 700 | goto exit; | ||
| 701 | } | ||
| 702 | |||
| 703 | for (i = 0; i < MAX_NR_CPUS; i++) | ||
| 704 | topology_map[i] = -1; | ||
| 705 | |||
| 706 | scan_core_topology(topology_map, &t); | ||
| 707 | |||
| 708 | return 0; | ||
| 709 | |||
| 710 | exit: | ||
| 711 | free(t.sib_core); | ||
| 712 | free(t.sib_thr); | ||
| 713 | |||
| 714 | return -1; | ||
| 715 | } | ||
diff --git a/tools/perf/util/svghelper.h b/tools/perf/util/svghelper.h index fad79ceeac1a..f7b4d6e699ea 100644 --- a/tools/perf/util/svghelper.h +++ b/tools/perf/util/svghelper.h | |||
| @@ -11,7 +11,7 @@ extern void svg_waiting(int Yslot, int cpu, u64 start, u64 end, const char *back | |||
| 11 | extern void svg_cpu_box(int cpu, u64 max_frequency, u64 turbo_frequency); | 11 | extern void svg_cpu_box(int cpu, u64 max_frequency, u64 turbo_frequency); |
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | extern void svg_process(int cpu, u64 start, u64 end, const char *type, const char *name); | 14 | extern void svg_process(int cpu, u64 start, u64 end, int pid, const char *name, const char *backtrace); |
| 15 | extern void svg_cstate(int cpu, u64 start, u64 end, int type); | 15 | extern void svg_cstate(int cpu, u64 start, u64 end, int type); |
| 16 | extern void svg_pstate(int cpu, u64 start, u64 end, u64 freq); | 16 | extern void svg_pstate(int cpu, u64 start, u64 end, u64 freq); |
| 17 | 17 | ||
| @@ -23,7 +23,11 @@ extern void svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, cha | |||
| 23 | extern void svg_interrupt(u64 start, int row, const char *backtrace); | 23 | extern void svg_interrupt(u64 start, int row, const char *backtrace); |
| 24 | extern void svg_text(int Yslot, u64 start, const char *text); | 24 | extern void svg_text(int Yslot, u64 start, const char *text); |
| 25 | extern void svg_close(void); | 25 | extern void svg_close(void); |
| 26 | extern int svg_build_topology_map(char *sib_core, int sib_core_nr, | ||
| 27 | char *sib_thr, int sib_thr_nr); | ||
| 26 | 28 | ||
| 27 | extern int svg_page_width; | 29 | extern int svg_page_width; |
| 30 | extern u64 svg_highlight; | ||
| 31 | extern const char *svg_highlight_name; | ||
| 28 | 32 | ||
| 29 | #endif /* __PERF_SVGHELPER_H */ | 33 | #endif /* __PERF_SVGHELPER_H */ |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 61eb1cddf01a..923d00040bbf 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -1089,9 +1089,9 @@ static int dso__load_kcore(struct dso *dso, struct map *map, | |||
| 1089 | * dso__data_read_addr(). | 1089 | * dso__data_read_addr(). |
| 1090 | */ | 1090 | */ |
| 1091 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) | 1091 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) |
| 1092 | dso->data_type = DSO_BINARY_TYPE__GUEST_KCORE; | 1092 | dso->binary_type = DSO_BINARY_TYPE__GUEST_KCORE; |
| 1093 | else | 1093 | else |
| 1094 | dso->data_type = DSO_BINARY_TYPE__KCORE; | 1094 | dso->binary_type = DSO_BINARY_TYPE__KCORE; |
| 1095 | dso__set_long_name(dso, strdup(kcore_filename), true); | 1095 | dso__set_long_name(dso, strdup(kcore_filename), true); |
| 1096 | 1096 | ||
| 1097 | close(fd); | 1097 | close(fd); |
| @@ -1258,8 +1258,8 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter) | |||
| 1258 | 1258 | ||
| 1259 | enum dso_binary_type symtab_type = binary_type_symtab[i]; | 1259 | enum dso_binary_type symtab_type = binary_type_symtab[i]; |
| 1260 | 1260 | ||
| 1261 | if (dso__binary_type_file(dso, symtab_type, | 1261 | if (dso__read_binary_type_filename(dso, symtab_type, |
| 1262 | root_dir, name, PATH_MAX)) | 1262 | root_dir, name, PATH_MAX)) |
| 1263 | continue; | 1263 | continue; |
| 1264 | 1264 | ||
| 1265 | /* Name is now the name of the next image to try */ | 1265 | /* Name is now the name of the next image to try */ |
| @@ -1368,9 +1368,9 @@ int dso__load_vmlinux(struct dso *dso, struct map *map, | |||
| 1368 | 1368 | ||
| 1369 | if (err > 0) { | 1369 | if (err > 0) { |
| 1370 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) | 1370 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) |
| 1371 | dso->data_type = DSO_BINARY_TYPE__GUEST_VMLINUX; | 1371 | dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX; |
| 1372 | else | 1372 | else |
| 1373 | dso->data_type = DSO_BINARY_TYPE__VMLINUX; | 1373 | dso->binary_type = DSO_BINARY_TYPE__VMLINUX; |
| 1374 | dso__set_long_name(dso, vmlinux, vmlinux_allocated); | 1374 | dso__set_long_name(dso, vmlinux, vmlinux_allocated); |
| 1375 | dso__set_loaded(dso, map->type); | 1375 | dso__set_loaded(dso, map->type); |
| 1376 | pr_debug("Using %s for symbols\n", symfs_vmlinux); | 1376 | pr_debug("Using %s for symbols\n", symfs_vmlinux); |
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c index f3c9e551bd35..c354b95a2348 100644 --- a/tools/perf/util/trace-event-info.c +++ b/tools/perf/util/trace-event-info.c | |||
| @@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | #include "../perf.h" | 39 | #include "../perf.h" |
| 40 | #include "trace-event.h" | 40 | #include "trace-event.h" |
| 41 | #include <lk/debugfs.h> | 41 | #include <api/fs/debugfs.h> |
| 42 | #include "evsel.h" | 42 | #include "evsel.h" |
| 43 | 43 | ||
| 44 | #define VERSION "0.5" | 44 | #define VERSION "0.5" |
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index a1eea3e809a3..9a2c268ad718 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h | |||
| @@ -71,7 +71,7 @@ | |||
| 71 | #include <linux/magic.h> | 71 | #include <linux/magic.h> |
| 72 | #include "types.h" | 72 | #include "types.h" |
| 73 | #include <sys/ttydefaults.h> | 73 | #include <sys/ttydefaults.h> |
| 74 | #include <lk/debugfs.h> | 74 | #include <api/fs/debugfs.h> |
| 75 | #include <termios.h> | 75 | #include <termios.h> |
| 76 | #include <linux/bitops.h> | 76 | #include <linux/bitops.h> |
| 77 | 77 | ||
diff --git a/tools/vm/Makefile b/tools/vm/Makefile index 24e9ddd93fa4..3d907dacf2ac 100644 --- a/tools/vm/Makefile +++ b/tools/vm/Makefile | |||
| @@ -2,21 +2,21 @@ | |||
| 2 | # | 2 | # |
| 3 | TARGETS=page-types slabinfo | 3 | TARGETS=page-types slabinfo |
| 4 | 4 | ||
| 5 | LK_DIR = ../lib/lk | 5 | LIB_DIR = ../lib/api |
| 6 | LIBLK = $(LK_DIR)/liblk.a | 6 | LIBS = $(LIB_DIR)/libapikfs.a |
| 7 | 7 | ||
| 8 | CC = $(CROSS_COMPILE)gcc | 8 | CC = $(CROSS_COMPILE)gcc |
| 9 | CFLAGS = -Wall -Wextra -I../lib/ | 9 | CFLAGS = -Wall -Wextra -I../lib/ |
| 10 | LDFLAGS = $(LIBLK) | 10 | LDFLAGS = $(LIBS) |
| 11 | 11 | ||
| 12 | $(TARGETS): liblk | 12 | $(TARGETS): $(LIBS) |
| 13 | 13 | ||
| 14 | liblk: | 14 | $(LIBS): |
| 15 | make -C $(LK_DIR) | 15 | make -C $(LIB_DIR) |
| 16 | 16 | ||
| 17 | %: %.c | 17 | %: %.c |
| 18 | $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) | 18 | $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) |
| 19 | 19 | ||
| 20 | clean: | 20 | clean: |
| 21 | $(RM) page-types slabinfo | 21 | $(RM) page-types slabinfo |
| 22 | make -C ../lib/lk clean | 22 | make -C $(LIB_DIR) clean |
diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c index d5e9d6d185c8..f9be24d9efac 100644 --- a/tools/vm/page-types.c +++ b/tools/vm/page-types.c | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | #include <sys/statfs.h> | 36 | #include <sys/statfs.h> |
| 37 | #include "../../include/uapi/linux/magic.h" | 37 | #include "../../include/uapi/linux/magic.h" |
| 38 | #include "../../include/uapi/linux/kernel-page-flags.h" | 38 | #include "../../include/uapi/linux/kernel-page-flags.h" |
| 39 | #include <lk/debugfs.h> | 39 | #include <api/fs/debugfs.h> |
| 40 | 40 | ||
| 41 | #ifndef MAX_PATH | 41 | #ifndef MAX_PATH |
| 42 | # define MAX_PATH 256 | 42 | # define MAX_PATH 256 |
