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
2323
2424 static inline void load_mm_cr4(struct mm_struct *mm)
2525 {
26− if (static_key_true(&rdpmc_always_available) ||
26+ if (static_key_false(&rdpmc_always_available) ||
2727 atomic_read(&mm->context.perf_rdpmc_allowed))
2828 cr4_set_bits(X86_CR4_PCE);
2929 else
tools/lib/api/Makefile+1−1
@@ -36,7 +36,7 @@ $(LIBFILE): $(API_IN) · 35 unmodified lines
3636
3737 clean:
3838 $(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)
4040
4141 FORCE:
4242
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+
11+unsigned 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+
27+unsigned 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+
35+unsigned 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+
42+unsigned 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
268268
269269 clean:
270270 $(call QUIET_CLEAN, libtraceevent) \
271− $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \
271+ $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd \
272272 $(RM) TRACEEVENT-CFLAGS tags TAGS
273273
274274 PHONY += force plugins
tools/perf/MANIFEST+1−1
@@ -18,6 +18,7 @@ tools/arch/x86/include/asm/atomic.h · 17 unmodified lines
1818 tools/arch/x86/include/asm/rmwcc.h
1919 tools/lib/traceevent
2020 tools/lib/api
21+tools/lib/hweight.c
2122 tools/lib/rbtree.c
2223 tools/lib/symbol/kallsyms.c
2324 tools/lib/symbol/kallsyms.h
@@ -57,7 +58,6 @@ include/linux/perf_event.h · 33 unmodified lines
5758 include/linux/list.h
5859 include/linux/hash.h
5960 include/linux/stringify.h
60−lib/hweight.c
6161 include/linux/swab.h
6262 arch/*/include/asm/unistd*.h
6363 arch/*/include/uapi/asm/unistd*.h
tools/perf/Makefile.perf+16−3
@@ -109,9 +109,22 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD · 108 unmodified lines
109109 $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
110110 $(Q)touch $(OUTPUT)PERF-VERSION-FILE
111111
112−CC = $(CROSS_COMPILE)gcc
113−LD ?= $(CROSS_COMPILE)ld
114−AR = $(CROSS_COMPILE)ar
112+# Makefiles suck: This macro sets a default value of $(2) for the
113+# variable named by $(1), unless the variable has been set by
114+# 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.
117+define allow-override
118+ $(if $(or $(findstring environment,$(origin $(1))),\
119+ $(findstring command line,$(origin $(1)))),,\
120+ $(eval $(1) = $(2)))
121+endef
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+
115128 PKG_CONFIG = $(CROSS_COMPILE)pkg-config
116129
117130 RM = rm -f
tools/perf/builtin-stat.c+2−2
@@ -343,7 +343,7 @@ static int read_counter(struct perf_evsel *counter) · 342 unmodified lines
343343 return 0;
344344 }
345345
346−static void read_counters(bool close)
346+static void read_counters(bool close_counters)
347347 {
348348 struct perf_evsel *counter;
349349
@@ -354,7 +354,7 @@ static void read_counters(bool close) · 4 unmodified lines
354354 if (process_counter(counter))
355355 pr_warning("failed to process counter %s\n", counter->name);
356356
357− if (close) {
357+ if (close_counters) {
358358 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
359359 thread_map__nr(evsel_list->threads));
360360 }
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
4848
4949 static bool hist_browser__has_filter(struct hist_browser *hb)
5050 {
51− return hists__has_filter(hb->hists) || hb->min_pcnt;
51+ return hists__has_filter(hb->hists) || hb->min_pcnt || symbol_conf.has_filter;
5252 }
5353
5454 static 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
143143 $(call rule_mkdir)
144144 $(call if_changed_dep,cc_o_c)
145145
146−$(OUTPUT)util/hweight.o: ../../lib/hweight.c FORCE
146+$(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
147147 $(call rule_mkdir)
148148 $(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
5353 {
5454 struct perf_event_mmap_page *pc = userpg;
5555
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−
6156 WARN_ONCE(mm->base, "Uninitialized auxtrace_mmap\n");
6257
6358 mm->userpg = userpg;
@@ -73,6 +68,11 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, · 9 unmodified lines
7368 return 0;
7469 }
7570
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+
7676 pc->aux_offset = mp->offset;
7777 pc->aux_size = mp->len;
7878
tools/perf/util/python-ext-sources+2−2
@@ -10,7 +10,7 @@ util/ctype.c · 9 unmodified lines
1010 util/evlist.c
1111 util/evsel.c
1212 util/cpumap.c
13−../../lib/hweight.c
13+../lib/hweight.c
1414 util/thread_map.c
1515 util/util.c
1616 util/xyarray.c
@@ -19,5 +19,5 @@ util/rblist.c · 2 unmodified lines
1919 util/stat.c
2020 util/strlist.c
2121 util/trace-event.c
22−../../lib/rbtree.c
22+../lib/rbtree.c
2323 util/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
19111911 pr_err("problems parsing %s list\n", list_name);
19121912 return -1;
19131913 }
1914+
1915+ symbol_conf.has_filter = true;
19141916 return 0;
19151917 }
19161918
tools/perf/util/symbol.h+2−1
@@ -105,7 +105,8 @@ struct symbol_conf { · 104 unmodified lines
105105 demangle_kernel,
106106 filter_relative,
107107 show_hist_headers,
108− branch_callstack;
108+ branch_callstack,
109+ has_filter;
109110 const char *vmlinux_name,
110111 *kallsyms_name,
111112 *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
136136 if (grow) {
137137 struct thread_map *tmp;
138138
139− tmp = realloc(threads, (sizeof(*threads) +
140− max_threads * sizeof(pid_t)));
139+ tmp = thread_map__realloc(threads, max_threads);
141140 if (tmp == NULL)
142141 goto out_free_namelist;
143142
tools/perf/util/vdso.c+3−5
@@ -236,18 +236,16 @@ static struct dso *__machine__findnew_compat(struct machine *machine, · 235 unmodified lines
236236 const char *file_name;
237237 struct dso *dso;
238238
239− pthread_rwlock_wrlock(&machine->dsos.lock);
240239 dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true);
241240 if (dso)
242− goto out_unlock;
241+ goto out;
243242
244243 file_name = vdso__get_compat_file(vdso_file);
245244 if (!file_name)
246− goto out_unlock;
245+ goto out;
247246
248247 dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name);
249−out_unlock:
250− pthread_rwlock_unlock(&machine->dsos.lock);
248+out:
251249 return dso;
252250 }
253251