Commit 59b2858f57bbd42f36aa177d21ab011a87da3de2

Authored by Linus Torvalds

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar:
 "Mostly tooling fixes, but also two PMU driver fixes"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf tools powerpc: Use dwfl_report_elf() instead of offline.
  perf tools: Fix segfault for symbol annotation on TUI
  perf test: Fix dwarf unwind using libunwind.
  perf tools: Avoid build splat for syscall numbers with uclibc
  perf tools: Elide strlcpy warning with uclibc
  perf tools: Fix statfs.f_type data type mismatch build error with uclibc
  tools: Remove bitops/hweight usage of bits in tools/perf
  perf machine: Fix __machine__findnew_thread() error path
  perf tools: Fix building error in x86_64 when dwarf unwind is on
  perf probe: Propagate error code when write(2) failed
  perf/x86/intel: Fix bug for "cycles:p" and "cycles:pp" on SLM
  perf/rapl: Fix sysfs_show() initialization for RAPL PMU

Showing 26 changed files Side-by-side Diff

arch/x86/kernel/cpu/perf_event_intel_ds.c
... ... @@ -568,8 +568,8 @@
568 568 };
569 569  
570 570 struct event_constraint intel_slm_pebs_event_constraints[] = {
571   - /* UOPS_RETIRED.ALL, inv=1, cmask=16 (cycles:p). */
572   - INTEL_FLAGS_EVENT_CONSTRAINT(0x108001c2, 0xf),
  571 + /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */
  572 + INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x1),
573 573 /* Allow all events as PEBS with no flags */
574 574 INTEL_ALL_EVENT_CONSTRAINT(0, 0x1),
575 575 EVENT_CONSTRAINT_END
arch/x86/kernel/cpu/perf_event_intel_rapl.c
... ... @@ -103,6 +103,13 @@
103 103  
104 104 #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */
105 105  
  106 +#define RAPL_EVENT_ATTR_STR(_name, v, str) \
  107 +static struct perf_pmu_events_attr event_attr_##v = { \
  108 + .attr = __ATTR(_name, 0444, rapl_sysfs_show, NULL), \
  109 + .id = 0, \
  110 + .event_str = str, \
  111 +};
  112 +
106 113 struct rapl_pmu {
107 114 spinlock_t lock;
108 115 int hw_unit; /* 1/2^hw_unit Joule */
109 116  
110 117  
111 118  
... ... @@ -379,23 +386,36 @@
379 386 .attrs = rapl_pmu_attrs,
380 387 };
381 388  
382   -EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01");
383   -EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02");
384   -EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03");
385   -EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04");
  389 +static ssize_t rapl_sysfs_show(struct device *dev,
  390 + struct device_attribute *attr,
  391 + char *page)
  392 +{
  393 + struct perf_pmu_events_attr *pmu_attr = \
  394 + container_of(attr, struct perf_pmu_events_attr, attr);
386 395  
387   -EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules");
388   -EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules");
389   -EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules");
390   -EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules");
  396 + if (pmu_attr->event_str)
  397 + return sprintf(page, "%s", pmu_attr->event_str);
391 398  
  399 + return 0;
  400 +}
  401 +
  402 +RAPL_EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01");
  403 +RAPL_EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02");
  404 +RAPL_EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03");
  405 +RAPL_EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04");
  406 +
  407 +RAPL_EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules");
  408 +RAPL_EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules");
  409 +RAPL_EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules");
  410 +RAPL_EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules");
  411 +
392 412 /*
393 413 * we compute in 0.23 nJ increments regardless of MSR
394 414 */
395   -EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10");
396   -EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10");
397   -EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10");
398   -EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10");
  415 +RAPL_EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10");
  416 +RAPL_EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10");
  417 +RAPL_EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10");
  418 +RAPL_EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10");
399 419  
400 420 static struct attribute *rapl_events_srv_attr[] = {
401 421 EVENT_PTR(rapl_cores),
tools/include/asm-generic/bitops.h
... ... @@ -22,6 +22,8 @@
22 22 #error only <linux/bitops.h> can be included directly
23 23 #endif
24 24  
  25 +#include <asm-generic/bitops/hweight.h>
  26 +
25 27 #include <asm-generic/bitops/atomic.h>
26 28  
27 29 #endif /* __TOOLS_ASM_GENERIC_BITOPS_H */
tools/include/asm-generic/bitops/arch_hweight.h
  1 +#include "../../../../include/asm-generic/bitops/arch_hweight.h"
tools/include/asm-generic/bitops/const_hweight.h
  1 +#include "../../../../include/asm-generic/bitops/const_hweight.h"
tools/include/asm-generic/bitops/hweight.h
  1 +#ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS_HWEIGHT_H_
  2 +#define _TOOLS_LINUX_ASM_GENERIC_BITOPS_HWEIGHT_H_
  3 +
  4 +#include <asm-generic/bitops/arch_hweight.h>
  5 +#include <asm-generic/bitops/const_hweight.h>
  6 +
  7 +#endif /* _TOOLS_LINUX_ASM_GENERIC_BITOPS_HWEIGHT_H_ */
tools/include/linux/bitops.h
1 1 #ifndef _TOOLS_LINUX_BITOPS_H_
2 2 #define _TOOLS_LINUX_BITOPS_H_
3 3  
  4 +#include <asm/types.h>
4 5 #include <linux/kernel.h>
5 6 #include <linux/compiler.h>
6   -#include <asm/hweight.h>
7 7  
8 8 #ifndef __WORDSIZE
9 9 #define __WORDSIZE (__SIZEOF_LONG__ * 8)
... ... @@ -18,6 +18,11 @@
18 18 #define BITS_TO_U64(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64))
19 19 #define BITS_TO_U32(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32))
20 20 #define BITS_TO_BYTES(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE)
  21 +
  22 +extern unsigned int __sw_hweight8(unsigned int w);
  23 +extern unsigned int __sw_hweight16(unsigned int w);
  24 +extern unsigned int __sw_hweight32(unsigned int w);
  25 +extern unsigned long __sw_hweight64(__u64 w);
21 26  
22 27 /*
23 28 * Include this here because some architectures need generic_ffs/fls in
tools/lib/api/fs/debugfs.c
... ... @@ -67,7 +67,7 @@
67 67  
68 68 if (statfs(debugfs, &st_fs) < 0)
69 69 return -ENOENT;
70   - else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
  70 + else if ((long)st_fs.f_type != (long)DEBUGFS_MAGIC)
71 71 return -ENOENT;
72 72  
73 73 return 0;
tools/lib/api/fs/fs.c
... ... @@ -79,7 +79,7 @@
79 79  
80 80 if (statfs(fs, &st_fs) < 0)
81 81 return -ENOENT;
82   - else if (st_fs.f_type != magic)
  82 + else if ((long)st_fs.f_type != magic)
83 83 return -ENOENT;
84 84  
85 85 return 0;
... ... @@ -6,12 +6,15 @@
6 6 tools/lib/symbol/kallsyms.h
7 7 tools/lib/util/find_next_bit.c
8 8 tools/include/asm/bug.h
  9 +tools/include/asm-generic/bitops/arch_hweight.h
9 10 tools/include/asm-generic/bitops/atomic.h
  11 +tools/include/asm-generic/bitops/const_hweight.h
10 12 tools/include/asm-generic/bitops/__ffs.h
11 13 tools/include/asm-generic/bitops/__fls.h
12 14 tools/include/asm-generic/bitops/find.h
13 15 tools/include/asm-generic/bitops/fls64.h
14 16 tools/include/asm-generic/bitops/fls.h
  17 +tools/include/asm-generic/bitops/hweight.h
15 18 tools/include/asm-generic/bitops.h
16 19 tools/include/linux/bitops.h
17 20 tools/include/linux/compiler.h
... ... @@ -19,6 +22,8 @@
19 22 tools/include/linux/hash.h
20 23 tools/include/linux/log2.h
21 24 tools/include/linux/types.h
  25 +include/asm-generic/bitops/arch_hweight.h
  26 +include/asm-generic/bitops/const_hweight.h
22 27 include/asm-generic/bitops/fls64.h
23 28 include/asm-generic/bitops/__fls.h
24 29 include/asm-generic/bitops/fls.h
... ... @@ -29,6 +34,7 @@
29 34 include/linux/hash.h
30 35 include/linux/stringify.h
31 36 lib/find_next_bit.c
  37 +lib/hweight.c
32 38 lib/rbtree.c
33 39 include/linux/swab.h
34 40 arch/*/include/asm/unistd*.h
tools/perf/Makefile.perf
... ... @@ -232,12 +232,15 @@
232 232 LIB_H += ../../include/linux/stringify.h
233 233 LIB_H += util/include/linux/bitmap.h
234 234 LIB_H += ../include/linux/bitops.h
  235 +LIB_H += ../include/asm-generic/bitops/arch_hweight.h
235 236 LIB_H += ../include/asm-generic/bitops/atomic.h
  237 +LIB_H += ../include/asm-generic/bitops/const_hweight.h
236 238 LIB_H += ../include/asm-generic/bitops/find.h
237 239 LIB_H += ../include/asm-generic/bitops/fls64.h
238 240 LIB_H += ../include/asm-generic/bitops/fls.h
239 241 LIB_H += ../include/asm-generic/bitops/__ffs.h
240 242 LIB_H += ../include/asm-generic/bitops/__fls.h
  243 +LIB_H += ../include/asm-generic/bitops/hweight.h
241 244 LIB_H += ../include/asm-generic/bitops.h
242 245 LIB_H += ../include/linux/compiler.h
243 246 LIB_H += ../include/linux/log2.h
... ... @@ -255,7 +258,6 @@
255 258 LIB_H += util/include/asm/asm-offsets.h
256 259 LIB_H += ../include/asm/bug.h
257 260 LIB_H += util/include/asm/byteorder.h
258   -LIB_H += util/include/asm/hweight.h
259 261 LIB_H += util/include/asm/swab.h
260 262 LIB_H += util/include/asm/system.h
261 263 LIB_H += util/include/asm/uaccess.h
262 264  
... ... @@ -462,10 +464,12 @@
462 464 # Benchmark modules
463 465 BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o
464 466 BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o
465   -ifeq ($(RAW_ARCH),x86_64)
  467 +ifeq ($(ARCH), x86)
  468 +ifeq ($(IS_64_BIT), 1)
466 469 BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o
467 470 BUILTIN_OBJS += $(OUTPUT)bench/mem-memset-x86-64-asm.o
468 471 endif
  472 +endif
469 473 BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o
470 474 BUILTIN_OBJS += $(OUTPUT)bench/futex-hash.o
471 475 BUILTIN_OBJS += $(OUTPUT)bench/futex-wake.o
... ... @@ -741,6 +745,9 @@
741 745 $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $<
742 746  
743 747 $(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
  748 + $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
  749 +
  750 +$(OUTPUT)util/hweight.o: ../../lib/hweight.c $(OUTPUT)PERF-CFLAGS
744 751 $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
745 752  
746 753 $(OUTPUT)util/find_next_bit.o: ../lib/util/find_next_bit.c $(OUTPUT)PERF-CFLAGS
tools/perf/arch/powerpc/util/skip-callchain-idx.c
... ... @@ -103,7 +103,7 @@
103 103 return NULL;
104 104 }
105 105  
106   - result = dwarf_cfi_addrframe(cfi, pc, &frame);
  106 + result = dwarf_cfi_addrframe(cfi, pc-bias, &frame);
107 107 if (result) {
108 108 pr_debug("%s(): %s\n", __func__, dwfl_errmsg(-1));
109 109 return NULL;
... ... @@ -128,7 +128,7 @@
128 128 return NULL;
129 129 }
130 130  
131   - result = dwarf_cfi_addrframe(cfi, pc, &frame);
  131 + result = dwarf_cfi_addrframe(cfi, pc-bias, &frame);
132 132 if (result) {
133 133 pr_debug("%s(): %s\n", __func__, dwfl_errmsg(-1));
134 134 return NULL;
... ... @@ -145,7 +145,7 @@
145 145 * yet used)
146 146 * -1 in case of errors
147 147 */
148   -static int check_return_addr(struct dso *dso, Dwarf_Addr pc)
  148 +static int check_return_addr(struct dso *dso, u64 map_start, Dwarf_Addr pc)
149 149 {
150 150 int rc = -1;
151 151 Dwfl *dwfl;
... ... @@ -155,6 +155,7 @@
155 155 Dwarf_Addr start = pc;
156 156 Dwarf_Addr end = pc;
157 157 bool signalp;
  158 + const char *exec_file = dso->long_name;
158 159  
159 160 dwfl = dso->dwfl;
160 161  
... ... @@ -165,8 +166,10 @@
165 166 return -1;
166 167 }
167 168  
168   - if (dwfl_report_offline(dwfl, "", dso->long_name, -1) == NULL) {
169   - pr_debug("dwfl_report_offline() failed %s\n",
  169 + mod = dwfl_report_elf(dwfl, exec_file, exec_file, -1,
  170 + map_start, false);
  171 + if (!mod) {
  172 + pr_debug("dwfl_report_elf() failed %s\n",
170 173 dwarf_errmsg(-1));
171 174 /*
172 175 * We normally cache the DWARF debug info and never
173 176  
... ... @@ -256,10 +259,10 @@
256 259 return skip_slot;
257 260 }
258 261  
259   - rc = check_return_addr(dso, ip);
  262 + rc = check_return_addr(dso, al.map->start, ip);
260 263  
261   - pr_debug("DSO %s, nr %" PRIx64 ", ip 0x%" PRIx64 "rc %d\n",
262   - dso->long_name, chain->nr, ip, rc);
  264 + pr_debug("[DSO %s, sym %s, ip 0x%" PRIx64 "] rc %d\n",
  265 + dso->long_name, al.sym->name, ip, rc);
263 266  
264 267 if (rc == 0) {
265 268 /*
tools/perf/bench/sched-pipe.c
... ... @@ -19,12 +19,12 @@
19 19 #include <stdlib.h>
20 20 #include <signal.h>
21 21 #include <sys/wait.h>
22   -#include <linux/unistd.h>
23 22 #include <string.h>
24 23 #include <errno.h>
25 24 #include <assert.h>
26 25 #include <sys/time.h>
27 26 #include <sys/types.h>
  27 +#include <sys/syscall.h>
28 28  
29 29 #include <pthread.h>
30 30  
tools/perf/builtin-top.c
... ... @@ -66,7 +66,6 @@
66 66 #include <sys/utsname.h>
67 67 #include <sys/mman.h>
68 68  
69   -#include <linux/unistd.h>
70 69 #include <linux/types.h>
71 70  
72 71 static volatile int done;
tools/perf/config/Makefile
... ... @@ -20,7 +20,7 @@
20 20  
21 21 # Additional ARCH settings for x86
22 22 ifeq ($(ARCH),x86)
23   - ifeq (${IS_X86_64}, 1)
  23 + ifeq (${IS_64_BIT}, 1)
24 24 CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
25 25 ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
26 26 LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
tools/perf/config/Makefile.arch
1 1  
2 2 uname_M := $(shell uname -m 2>/dev/null || echo not)
3 3  
4   -ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
  4 +RAW_ARCH := $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
5 5 -e s/arm.*/arm/ -e s/sa110/arm/ \
6 6 -e s/s390x/s390/ -e s/parisc64/parisc/ \
7 7 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
8 8  
9 9  
10 10  
11 11  
... ... @@ -9,24 +9,24 @@
9 9 -e s/tile.*/tile/ )
10 10  
11 11 # Additional ARCH settings for x86
12   -ifeq ($(ARCH),i386)
13   - override ARCH := x86
  12 +ifeq ($(RAW_ARCH),i386)
  13 + ARCH ?= x86
14 14 endif
15 15  
16   -ifeq ($(ARCH),x86_64)
17   - override ARCH := x86
18   - IS_X86_64 := 0
19   - ifeq (, $(findstring m32,$(CFLAGS)))
20   - IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
21   - RAW_ARCH := x86_64
  16 +ifeq ($(RAW_ARCH),x86_64)
  17 + ARCH ?= x86
  18 +
  19 + ifneq (, $(findstring m32,$(CFLAGS)))
  20 + RAW_ARCH := x86_32
22 21 endif
23 22 endif
24 23  
25   -ifeq (${IS_X86_64}, 1)
  24 +ARCH ?= $(RAW_ARCH)
  25 +
  26 +LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
  27 +ifeq ($(LP64), 1)
26 28 IS_64_BIT := 1
27   -else ifeq ($(ARCH),x86)
28   - IS_64_BIT := 0
29 29 else
30   - IS_64_BIT := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
  30 + IS_64_BIT := 0
31 31 endif
tools/perf/perf-sys.h
... ... @@ -6,7 +6,6 @@
6 6 #include <sys/syscall.h>
7 7 #include <linux/types.h>
8 8 #include <linux/perf_event.h>
9   -#include <asm/unistd.h>
10 9  
11 10 #if defined(__i386__)
12 11 #define mb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
tools/perf/tests/dwarf-unwind.c
... ... @@ -11,6 +11,9 @@
11 11 #include "thread.h"
12 12 #include "callchain.h"
13 13  
  14 +/* For bsearch. We try to unwind functions in shared object. */
  15 +#include <stdlib.h>
  16 +
14 17 static int mmap_handler(struct perf_tool *tool __maybe_unused,
15 18 union perf_event *event,
16 19 struct perf_sample *sample __maybe_unused,
... ... @@ -28,7 +31,7 @@
28 31 mmap_handler, machine, true);
29 32 }
30 33  
31   -#define MAX_STACK 6
  34 +#define MAX_STACK 8
32 35  
33 36 static int unwind_entry(struct unwind_entry *entry, void *arg)
34 37 {
... ... @@ -37,6 +40,8 @@
37 40 static const char *funcs[MAX_STACK] = {
38 41 "test__arch_unwind_sample",
39 42 "unwind_thread",
  43 + "compare",
  44 + "bsearch",
40 45 "krava_3",
41 46 "krava_2",
42 47 "krava_1",
43 48  
44 49  
... ... @@ -88,10 +93,37 @@
88 93 return err;
89 94 }
90 95  
  96 +static int global_unwind_retval = -INT_MAX;
  97 +
91 98 __attribute__ ((noinline))
  99 +static int compare(void *p1, void *p2)
  100 +{
  101 + /* Any possible value should be 'thread' */
  102 + struct thread *thread = *(struct thread **)p1;
  103 +
  104 + if (global_unwind_retval == -INT_MAX)
  105 + global_unwind_retval = unwind_thread(thread);
  106 +
  107 + return p1 - p2;
  108 +}
  109 +
  110 +__attribute__ ((noinline))
92 111 static int krava_3(struct thread *thread)
93 112 {
94   - return unwind_thread(thread);
  113 + struct thread *array[2] = {thread, thread};
  114 + void *fp = &bsearch;
  115 + /*
  116 + * make _bsearch a volatile function pointer to
  117 + * prevent potential optimization, which may expand
  118 + * bsearch and call compare directly from this function,
  119 + * instead of libc shared object.
  120 + */
  121 + void *(*volatile _bsearch)(void *, void *, size_t,
  122 + size_t, int (*)(void *, void *));
  123 +
  124 + _bsearch = fp;
  125 + _bsearch(array, &thread, 2, sizeof(struct thread **), compare);
  126 + return global_unwind_retval;
95 127 }
96 128  
97 129 __attribute__ ((noinline))
tools/perf/util/annotate.h
... ... @@ -116,11 +116,6 @@
116 116 struct annotated_source *src;
117 117 };
118 118  
119   -struct sannotation {
120   - struct annotation annotation;
121   - struct symbol symbol;
122   -};
123   -
124 119 static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
125 120 {
126 121 return (((void *)&notes->src->histograms) +
... ... @@ -129,8 +124,7 @@
129 124  
130 125 static inline struct annotation *symbol__annotation(struct symbol *sym)
131 126 {
132   - struct sannotation *a = container_of(sym, struct sannotation, symbol);
133   - return &a->annotation;
  127 + return (void *)sym - symbol_conf.priv_size;
134 128 }
135 129  
136 130 int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx);
tools/perf/util/cache.h
... ... @@ -71,8 +71,10 @@
71 71 extern char *perf_pathdup(const char *fmt, ...)
72 72 __attribute__((format (printf, 1, 2)));
73 73  
  74 +#ifndef __UCLIBC__
74 75 /* Matches the libc/libbsd function attribute so we declare this unconditionally: */
75 76 extern size_t strlcpy(char *dest, const char *src, size_t size);
  77 +#endif
76 78  
77 79 #endif /* __PERF_CACHE_H */
tools/perf/util/hweight.c
1   -#include <linux/bitops.h>
2   -
3   -/**
4   - * hweightN - returns the hamming weight of a N-bit word
5   - * @x: the word to weigh
6   - *
7   - * The Hamming Weight of a number is the total number of bits set in it.
8   - */
9   -
10   -unsigned int hweight32(unsigned int w)
11   -{
12   - unsigned int res = w - ((w >> 1) & 0x55555555);
13   - res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
14   - res = (res + (res >> 4)) & 0x0F0F0F0F;
15   - res = res + (res >> 8);
16   - return (res + (res >> 16)) & 0x000000FF;
17   -}
18   -
19   -unsigned long hweight64(__u64 w)
20   -{
21   -#if BITS_PER_LONG == 32
22   - return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w);
23   -#elif BITS_PER_LONG == 64
24   - __u64 res = w - ((w >> 1) & 0x5555555555555555ul);
25   - res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
26   - res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
27   - res = res + (res >> 8);
28   - res = res + (res >> 16);
29   - return (res + (res >> 32)) & 0x00000000000000FFul;
30   -#endif
31   -}
tools/perf/util/include/asm/hweight.h
1   -#ifndef PERF_HWEIGHT_H
2   -#define PERF_HWEIGHT_H
3   -
4   -#include <linux/types.h>
5   -unsigned int hweight32(unsigned int w);
6   -unsigned long hweight64(__u64 w);
7   -
8   -#endif /* PERF_HWEIGHT_H */
tools/perf/util/machine.c
... ... @@ -389,7 +389,6 @@
389 389 if (th != NULL) {
390 390 rb_link_node(&th->rb_node, parent, p);
391 391 rb_insert_color(&th->rb_node, &machine->threads);
392   - machine->last_match = th;
393 392  
394 393 /*
395 394 * We have to initialize map_groups separately
396 395  
... ... @@ -400,9 +399,12 @@
400 399 * leader and that would screwed the rb tree.
401 400 */
402 401 if (thread__init_map_groups(th, machine)) {
  402 + rb_erase(&th->rb_node, &machine->threads);
403 403 thread__delete(th);
404 404 return NULL;
405 405 }
  406 +
  407 + machine->last_match = th;
406 408 }
407 409  
408 410 return th;
tools/perf/util/probe-event.c
... ... @@ -2052,9 +2052,11 @@
2052 2052 pr_debug("Writing event: %s\n", buf);
2053 2053 if (!probe_event_dry_run) {
2054 2054 ret = write(fd, buf, strlen(buf));
2055   - if (ret <= 0)
  2055 + if (ret <= 0) {
  2056 + ret = -errno;
2056 2057 pr_warning("Failed to write event: %s\n",
2057 2058 strerror_r(errno, sbuf, sizeof(sbuf)));
  2059 + }
2058 2060 }
2059 2061 free(buf);
2060 2062 return ret;
tools/perf/util/python-ext-sources
... ... @@ -10,7 +10,7 @@
10 10 util/evlist.c
11 11 util/evsel.c
12 12 util/cpumap.c
13   -util/hweight.c
  13 +../../lib/hweight.c
14 14 util/thread_map.c
15 15 util/util.c
16 16 util/xyarray.c
tools/perf/util/unwind-libunwind.c
... ... @@ -185,6 +185,28 @@
185 185 return offset;
186 186 }
187 187  
  188 +#ifndef NO_LIBUNWIND_DEBUG_FRAME
  189 +static int elf_is_exec(int fd, const char *name)
  190 +{
  191 + Elf *elf;
  192 + GElf_Ehdr ehdr;
  193 + int retval = 0;
  194 +
  195 + elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
  196 + if (elf == NULL)
  197 + return 0;
  198 + if (gelf_getehdr(elf, &ehdr) == NULL)
  199 + goto out;
  200 +
  201 + retval = (ehdr.e_type == ET_EXEC);
  202 +
  203 +out:
  204 + elf_end(elf);
  205 + pr_debug("unwind: elf_is_exec(%s): %d\n", name, retval);
  206 + return retval;
  207 +}
  208 +#endif
  209 +
188 210 struct table_entry {
189 211 u32 start_ip_offset;
190 212 u32 fde_offset;
191 213  
... ... @@ -322,8 +344,12 @@
322 344 #ifndef NO_LIBUNWIND_DEBUG_FRAME
323 345 /* Check the .debug_frame section for unwinding info */
324 346 if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) {
  347 + int fd = dso__data_fd(map->dso, ui->machine);
  348 + int is_exec = elf_is_exec(fd, map->dso->name);
  349 + unw_word_t base = is_exec ? 0 : map->start;
  350 +
325 351 memset(&di, 0, sizeof(di));
326   - if (dwarf_find_debug_frame(0, &di, ip, 0, map->dso->name,
  352 + if (dwarf_find_debug_frame(0, &di, ip, base, map->dso->name,
327 353 map->start, map->end))
328 354 return dwarf_search_unwind_table(as, ip, &di, pi,
329 355 need_unwind_info, arg);