History

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, plus a static key fix fixing /sys/devices/cpu/rdpmc" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf tools: Really allow to specify custom CC, AR or LD perf auxtrace: Fix misplaced check for HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT perf hists browser: Take the --comm, --dsos, etc filters into account perf symbols: Store if there is a filter in place x86, perf: Fix static_key bug in load_mm_cr4() tools: Copy lib/hweight.c from the kernel sources perf tools: Fix the detached tarball wrt rbtree copy perf thread_map: Fix the sizeof() calculation for map entries tools lib: Improve clean target perf stat: Fix shadow declaration of close perf tools: Fix lockup using 32-bit compat vdso

Linus Torvalds committed 11 years ago

Commit f79a17b2 parents 59ee762 a6acd6a15 files · +101 −26Browse files

Unified · Split

15 files
  1. arch/x86/include/asm/mmu_context.h +1 −1
  2. tools/lib/api/Makefile +1 −1
  3. tools/lib/hweight.c +62 −0
  4. tools/lib/traceevent/Makefile +1 −1
  5. tools/perf/MANIFEST +1 −1
  6. tools/perf/Makefile.perf +16 −3
  7. tools/perf/builtin-stat.c +2 −2
  8. tools/perf/ui/browsers/hists.c +1 −1
  9. tools/perf/util/Build +1 −1
  10. tools/perf/util/auxtrace.c +5 −5
  11. tools/perf/util/python-ext-sources +2 −2
  12. tools/perf/util/symbol.c +2 −0
  13. tools/perf/util/symbol.h +2 −1
  14. tools/perf/util/thread_map.c +1 −2
  15. tools/perf/util/vdso.c +3 −5
arch/x86/include/asm/mmu_context.h+1−1
@@ -23,7 +23,7 @@ extern struct static_key rdpmc_always_available; · 22 unmodified lines
23 23
24static inline void load_mm_cr4(struct mm_struct *mm)24static inline void load_mm_cr4(struct mm_struct *mm)
25{25{
26 if (static_key_true(&rdpmc_always_available) ||26 if (static_key_false(&rdpmc_always_available) ||
27 atomic_read(&mm->context.perf_rdpmc_allowed))27 atomic_read(&mm->context.perf_rdpmc_allowed))
28 cr4_set_bits(X86_CR4_PCE);28 cr4_set_bits(X86_CR4_PCE);
29 else29 else
tools/lib/api/Makefile+1−1
@@ -36,7 +36,7 @@ $(LIBFILE): $(API_IN) · 35 unmodified lines
36 36
37clean:37clean:
38 $(call QUIET_CLEAN, libapi) $(RM) $(LIBFILE); \38 $(call QUIET_CLEAN, libapi) $(RM) $(LIBFILE); \
39 find $(if $(OUTPUT),$(OUTPUT),.) -name \*.o | xargs $(RM)39 find $(if $(OUTPUT),$(OUTPUT),.) -name \*.o -or -name \*.o.cmd -or -name \*.o.d | xargs $(RM)
40 40
41FORCE:41FORCE:
42 42
tools/lib/hweight.c+62−0
@@ -0,0 +1,62 @@
1#include <linux/bitops.h>
2#include <asm/types.h>
3
4/**
5 * hweightN - returns the hamming weight of a N-bit word
6 * @x: the word to weigh
7 *
8 * The Hamming Weight of a number is the total number of bits set in it.
9 */
10
11unsigned int __sw_hweight32(unsigned int w)
12{
13#ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER
14 w -= (w >> 1) & 0x55555555;
15 w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
16 w = (w + (w >> 4)) & 0x0f0f0f0f;
17 return (w * 0x01010101) >> 24;
18#else
19 unsigned int res = w - ((w >> 1) & 0x55555555);
20 res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
21 res = (res + (res >> 4)) & 0x0F0F0F0F;
22 res = res + (res >> 8);
23 return (res + (res >> 16)) & 0x000000FF;
24#endif
25}
26
27unsigned int __sw_hweight16(unsigned int w)
28{
29 unsigned int res = w - ((w >> 1) & 0x5555);
30 res = (res & 0x3333) + ((res >> 2) & 0x3333);
31 res = (res + (res >> 4)) & 0x0F0F;
32 return (res + (res >> 8)) & 0x00FF;
33}
34
35unsigned int __sw_hweight8(unsigned int w)
36{
37 unsigned int res = w - ((w >> 1) & 0x55);
38 res = (res & 0x33) + ((res >> 2) & 0x33);
39 return (res + (res >> 4)) & 0x0F;
40}
41
42unsigned long __sw_hweight64(__u64 w)
43{
44#if BITS_PER_LONG == 32
45 return __sw_hweight32((unsigned int)(w >> 32)) +
46 __sw_hweight32((unsigned int)w);
47#elif BITS_PER_LONG == 64
48#ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER
49 w -= (w >> 1) & 0x5555555555555555ul;
50 w = (w & 0x3333333333333333ul) + ((w >> 2) & 0x3333333333333333ul);
51 w = (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0ful;
52 return (w * 0x0101010101010101ul) >> 56;
53#else
54 __u64 res = w - ((w >> 1) & 0x5555555555555555ul);
55 res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
56 res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
57 res = res + (res >> 8);
58 res = res + (res >> 16);
59 return (res + (res >> 32)) & 0x00000000000000FFul;
60#endif
61#endif
62}
tools/lib/traceevent/Makefile+1−1
@@ -268,7 +268,7 @@ install: install_lib · 267 unmodified lines
268 268
269clean:269clean:
270 $(call QUIET_CLEAN, libtraceevent) \270 $(call QUIET_CLEAN, libtraceevent) \
271 $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \271 $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd \
272 $(RM) TRACEEVENT-CFLAGS tags TAGS272 $(RM) TRACEEVENT-CFLAGS tags TAGS
273 273
274PHONY += force plugins274PHONY += force plugins
tools/perf/MANIFEST+1−1
@@ -18,6 +18,7 @@ tools/arch/x86/include/asm/atomic.h · 17 unmodified lines
18tools/arch/x86/include/asm/rmwcc.h18tools/arch/x86/include/asm/rmwcc.h
19tools/lib/traceevent19tools/lib/traceevent
20tools/lib/api20tools/lib/api
21tools/lib/hweight.c
21tools/lib/rbtree.c22tools/lib/rbtree.c
22tools/lib/symbol/kallsyms.c23tools/lib/symbol/kallsyms.c
23tools/lib/symbol/kallsyms.h24tools/lib/symbol/kallsyms.h
@@ -57,7 +58,6 @@ include/linux/perf_event.h · 33 unmodified lines
57include/linux/list.h58include/linux/list.h
58include/linux/hash.h59include/linux/hash.h
59include/linux/stringify.h60include/linux/stringify.h
60lib/hweight.c
61include/linux/swab.h61include/linux/swab.h
62arch/*/include/asm/unistd*.h62arch/*/include/asm/unistd*.h
63arch/*/include/uapi/asm/unistd*.h63arch/*/include/uapi/asm/unistd*.h
tools/perf/Makefile.perf+16−3
@@ -109,9 +109,22 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD · 108 unmodified lines
109 $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)109 $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
110 $(Q)touch $(OUTPUT)PERF-VERSION-FILE110 $(Q)touch $(OUTPUT)PERF-VERSION-FILE
111 111
112CC = $(CROSS_COMPILE)gcc112# Makefiles suck: This macro sets a default value of $(2) for the
113LD ?= $(CROSS_COMPILE)ld113# variable named by $(1), unless the variable has been set by
114AR = $(CROSS_COMPILE)ar114# environment or command line. This is necessary for CC and AR
115# because make sets default values, so the simpler ?= approach
116# won't work as expected.
117define allow-override
118 $(if $(or $(findstring environment,$(origin $(1))),\
119 $(findstring command line,$(origin $(1)))),,\
120 $(eval $(1) = $(2)))
121endef
122
123# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix.
124$(call allow-override,CC,$(CROSS_COMPILE)gcc)
125$(call allow-override,AR,$(CROSS_COMPILE)ar)
126$(call allow-override,LD,$(CROSS_COMPILE)ld)
127
115PKG_CONFIG = $(CROSS_COMPILE)pkg-config128PKG_CONFIG = $(CROSS_COMPILE)pkg-config
116 129
117RM = rm -f130RM = rm -f
tools/perf/builtin-stat.c+2−2
@@ -343,7 +343,7 @@ static int read_counter(struct perf_evsel *counter) · 342 unmodified lines
343 return 0;343 return 0;
344}344}
345 345
346static void read_counters(bool close)346static void read_counters(bool close_counters)
347{347{
348 struct perf_evsel *counter;348 struct perf_evsel *counter;
349 349
@@ -354,7 +354,7 @@ static void read_counters(bool close) · 4 unmodified lines
354 if (process_counter(counter))354 if (process_counter(counter))
355 pr_warning("failed to process counter %s\n", counter->name);355 pr_warning("failed to process counter %s\n", counter->name);
356 356
357 if (close) {357 if (close_counters) {
358 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),358 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
359 thread_map__nr(evsel_list->threads));359 thread_map__nr(evsel_list->threads));
360 }360 }
tools/perf/ui/browsers/hists.c+1−1
@@ -48,7 +48,7 @@ static struct rb_node *hists__filter_entries(struct rb_node *nd, · 47 unmodified lines
48 48
49static bool hist_browser__has_filter(struct hist_browser *hb)49static bool hist_browser__has_filter(struct hist_browser *hb)
50{50{
51 return hists__has_filter(hb->hists) || hb->min_pcnt;51 return hists__has_filter(hb->hists) || hb->min_pcnt || symbol_conf.has_filter;
52}52}
53 53
54static int hist_browser__get_folding(struct hist_browser *browser)54static int hist_browser__get_folding(struct hist_browser *browser)
tools/perf/util/Build+1−1
@@ -143,6 +143,6 @@ $(OUTPUT)util/rbtree.o: ../lib/rbtree.c FORCE · 142 unmodified lines
143 $(call rule_mkdir)143 $(call rule_mkdir)
144 $(call if_changed_dep,cc_o_c)144 $(call if_changed_dep,cc_o_c)
145 145
146$(OUTPUT)util/hweight.o: ../../lib/hweight.c FORCE146$(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
147 $(call rule_mkdir)147 $(call rule_mkdir)
148 $(call if_changed_dep,cc_o_c)148 $(call if_changed_dep,cc_o_c)
tools/perf/util/auxtrace.c+5−5
@@ -53,11 +53,6 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, · 52 unmodified lines
53{53{
54 struct perf_event_mmap_page *pc = userpg;54 struct perf_event_mmap_page *pc = userpg;
55 55
56#if BITS_PER_LONG != 64 && !defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT)
57 pr_err("Cannot use AUX area tracing mmaps\n");
58 return -1;
59#endif
60
61 WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n");56 WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n");
62 57
63 mm->userpg = userpg;58 mm->userpg = userpg;
@@ -73,6 +68,11 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, · 9 unmodified lines
73 return 0;68 return 0;
74 }69 }
75 70
71#if BITS_PER_LONG != 64 && !defined(HAVE_SYNC_COMPARE_AND_SWAP_SUPPORT)
72 pr_err("Cannot use AUX area tracing mmaps\n");
73 return -1;
74#endif
75
76 pc->aux_offset = mp->offset;76 pc->aux_offset = mp->offset;
77 pc->aux_size = mp->len;77 pc->aux_size = mp->len;
78 78
tools/perf/util/python-ext-sources+2−2
@@ -10,7 +10,7 @@ util/ctype.c · 9 unmodified lines
10util/evlist.c10util/evlist.c
11util/evsel.c11util/evsel.c
12util/cpumap.c12util/cpumap.c
13../../lib/hweight.c13../lib/hweight.c
14util/thread_map.c14util/thread_map.c
15util/util.c15util/util.c
16util/xyarray.c16util/xyarray.c
@@ -19,5 +19,5 @@ util/rblist.c · 2 unmodified lines
19util/stat.c19util/stat.c
20util/strlist.c20util/strlist.c
21util/trace-event.c21util/trace-event.c
22../../lib/rbtree.c22../lib/rbtree.c
23util/string.c23util/string.c
tools/perf/util/symbol.c+2−0
@@ -1911,6 +1911,8 @@ int setup_list(struct strlist **list, const char *list_str, · 1910 unmodified lines
1911 pr_err("problems parsing %s list\n", list_name);1911 pr_err("problems parsing %s list\n", list_name);
1912 return -1;1912 return -1;
1913 }1913 }
1914
1915 symbol_conf.has_filter = true;
1914 return 0;1916 return 0;
1915}1917}
1916 1918
tools/perf/util/symbol.h+2−1
@@ -105,7 +105,8 @@ struct symbol_conf { · 104 unmodified lines
105 demangle_kernel,105 demangle_kernel,
106 filter_relative,106 filter_relative,
107 show_hist_headers,107 show_hist_headers,
108 branch_callstack;108 branch_callstack,
109 has_filter;
109 const char *vmlinux_name,110 const char *vmlinux_name,
110 *kallsyms_name,111 *kallsyms_name,
111 *source_prefix,112 *source_prefix,
tools/perf/util/thread_map.c+1−2
@@ -136,8 +136,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) · 135 unmodified lines
136 if (grow) {136 if (grow) {
137 struct thread_map *tmp;137 struct thread_map *tmp;
138 138
139 tmp = realloc(threads, (sizeof(*threads) +139 tmp = thread_map__realloc(threads, max_threads);
140 max_threads * sizeof(pid_t)));
141 if (tmp == NULL)140 if (tmp == NULL)
142 goto out_free_namelist;141 goto out_free_namelist;
143 142
tools/perf/util/vdso.c+3−5
@@ -236,18 +236,16 @@ static struct dso *__machine__findnew_compat(struct machine *machine, · 235 unmodified lines
236 const char *file_name;236 const char *file_name;
237 struct dso *dso;237 struct dso *dso;
238 238
239 pthread_rwlock_wrlock(&machine->dsos.lock);
240 dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true);239 dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true);
241 if (dso)240 if (dso)
242 goto out_unlock;241 goto out;
243 242
244 file_name = vdso__get_compat_file(vdso_file);243 file_name = vdso__get_compat_file(vdso_file);
245 if (!file_name)244 if (!file_name)
246 goto out_unlock;245 goto out;
247 246
248 dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name);247 dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name);
249out_unlock:248out:
250 pthread_rwlock_unlock(&machine->dsos.lock);
251 return dso;249 return dso;
252}250}
253 251