diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-08-18 16:50:36 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-08-18 16:50:36 -0400 |
commit | de737f33ab23b213650c624e79ee479f12e3c500 (patch) | |
tree | 646c2938da90906d440ad50de1523550a70d7053 | |
parent | 71e7bc2bab77e64882c031c2af943c3256c1adb0 (diff) | |
parent | c53412ee8c7ec31373a4176ff7f3a6b79296c05c (diff) |
Merge tag 'perf-urgent-for-mingo-20160818' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf/urgent fixes from Arnaldo Carvalho de Melo:
- Do not access outside hw cache name arrays (Arnaldo Carvalho de Melo)
- Use addr_location::addr instead of ip for entries when unwinding using
DWARF CFI, fixing the "srcline" information for userspace application
callchains (Milian Wolff)
- Reinstate strlcpy() header guard with __UCLIBC__, fixing the build
with uclibc, detected when building for the ARC architecture (Vineet Gupta)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | tools/include/linux/string.h | 6 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 6 | ||||
-rw-r--r-- | tools/perf/util/unwind-libdw.c | 2 | ||||
-rw-r--r-- | tools/perf/util/unwind-libunwind-local.c | 2 |
4 files changed, 10 insertions, 6 deletions
diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h index b96879477311..f436d2420a18 100644 --- a/tools/include/linux/string.h +++ b/tools/include/linux/string.h | |||
@@ -8,7 +8,11 @@ void *memdup(const void *src, size_t len); | |||
8 | 8 | ||
9 | int strtobool(const char *s, bool *res); | 9 | int strtobool(const char *s, bool *res); |
10 | 10 | ||
11 | #ifdef __GLIBC__ | 11 | /* |
12 | * glibc based builds needs the extern while uClibc doesn't. | ||
13 | * However uClibc headers also define __GLIBC__ hence the hack below | ||
14 | */ | ||
15 | #if defined(__GLIBC__) && !defined(__UCLIBC__) | ||
12 | extern size_t strlcpy(char *dest, const char *src, size_t size); | 16 | extern size_t strlcpy(char *dest, const char *src, size_t size); |
13 | #endif | 17 | #endif |
14 | 18 | ||
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index d9b80ef881cd..21fd573106ed 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -507,17 +507,17 @@ static int __perf_evsel__hw_cache_name(u64 config, char *bf, size_t size) | |||
507 | u8 op, result, type = (config >> 0) & 0xff; | 507 | u8 op, result, type = (config >> 0) & 0xff; |
508 | const char *err = "unknown-ext-hardware-cache-type"; | 508 | const char *err = "unknown-ext-hardware-cache-type"; |
509 | 509 | ||
510 | if (type > PERF_COUNT_HW_CACHE_MAX) | 510 | if (type >= PERF_COUNT_HW_CACHE_MAX) |
511 | goto out_err; | 511 | goto out_err; |
512 | 512 | ||
513 | op = (config >> 8) & 0xff; | 513 | op = (config >> 8) & 0xff; |
514 | err = "unknown-ext-hardware-cache-op"; | 514 | err = "unknown-ext-hardware-cache-op"; |
515 | if (op > PERF_COUNT_HW_CACHE_OP_MAX) | 515 | if (op >= PERF_COUNT_HW_CACHE_OP_MAX) |
516 | goto out_err; | 516 | goto out_err; |
517 | 517 | ||
518 | result = (config >> 16) & 0xff; | 518 | result = (config >> 16) & 0xff; |
519 | err = "unknown-ext-hardware-cache-result"; | 519 | err = "unknown-ext-hardware-cache-result"; |
520 | if (result > PERF_COUNT_HW_CACHE_RESULT_MAX) | 520 | if (result >= PERF_COUNT_HW_CACHE_RESULT_MAX) |
521 | goto out_err; | 521 | goto out_err; |
522 | 522 | ||
523 | err = "invalid-cache"; | 523 | err = "invalid-cache"; |
diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c index cf5e250bc78e..783a53fb7a4e 100644 --- a/tools/perf/util/unwind-libdw.c +++ b/tools/perf/util/unwind-libdw.c | |||
@@ -66,7 +66,7 @@ static int entry(u64 ip, struct unwind_info *ui) | |||
66 | if (__report_module(&al, ip, ui)) | 66 | if (__report_module(&al, ip, ui)) |
67 | return -1; | 67 | return -1; |
68 | 68 | ||
69 | e->ip = ip; | 69 | e->ip = al.addr; |
70 | e->map = al.map; | 70 | e->map = al.map; |
71 | e->sym = al.sym; | 71 | e->sym = al.sym; |
72 | 72 | ||
diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c index 97c0f8fc5561..20c2e5743903 100644 --- a/tools/perf/util/unwind-libunwind-local.c +++ b/tools/perf/util/unwind-libunwind-local.c | |||
@@ -542,7 +542,7 @@ static int entry(u64 ip, struct thread *thread, | |||
542 | thread__find_addr_location(thread, PERF_RECORD_MISC_USER, | 542 | thread__find_addr_location(thread, PERF_RECORD_MISC_USER, |
543 | MAP__FUNCTION, ip, &al); | 543 | MAP__FUNCTION, ip, &al); |
544 | 544 | ||
545 | e.ip = ip; | 545 | e.ip = al.addr; |
546 | e.map = al.map; | 546 | e.map = al.map; |
547 | e.sym = al.sym; | 547 | e.sym = al.sym; |
548 | 548 | ||