Преглед на файлове

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

Pull perf fixes from Thomas Gleixner:
 "A few fixes from the perf departement

   - prevent a imbalanced preemption disable in the events teardown code
   - prevent out of bound acces in perf userspace
   - make perf tools compile with UCLIBC again
   - a fix for the userspace unwinder utility"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/core: Use this_cpu_ptr() when stopping AUX events
  perf evsel: Do not access outside hw cache name arrays
  tools lib: Reinstate strlcpy() header guard with __UCLIBC__
  perf unwind: Use addr_location::addr instead of ip for entries
Linus Torvalds преди 9 години
родител
ревизия
908e373f1c
променени са 5 файла, в които са добавени 11 реда и са изтрити 7 реда
  1. 1 1
      kernel/events/core.c
  2. 5 1
      tools/include/linux/string.h
  3. 3 3
      tools/perf/util/evsel.c
  4. 1 1
      tools/perf/util/unwind-libdw.c
  5. 1 1
      tools/perf/util/unwind-libunwind-local.c

+ 1 - 1
kernel/events/core.c

@@ -6166,7 +6166,7 @@ static int __perf_pmu_output_stop(void *info)
 {
 {
 	struct perf_event *event = info;
 	struct perf_event *event = info;
 	struct pmu *pmu = event->pmu;
 	struct pmu *pmu = event->pmu;
-	struct perf_cpu_context *cpuctx = get_cpu_ptr(pmu->pmu_cpu_context);
+	struct perf_cpu_context *cpuctx = this_cpu_ptr(pmu->pmu_cpu_context);
 	struct remote_output ro = {
 	struct remote_output ro = {
 		.rb	= event->rb,
 		.rb	= event->rb,
 	};
 	};

+ 5 - 1
tools/include/linux/string.h

@@ -8,7 +8,11 @@ void *memdup(const void *src, size_t len);
 
 
 int strtobool(const char *s, bool *res);
 int strtobool(const char *s, bool *res);
 
 
-#ifdef __GLIBC__
+/*
+ * glibc based builds needs the extern while uClibc doesn't.
+ * However uClibc headers also define __GLIBC__ hence the hack below
+ */
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
 extern size_t strlcpy(char *dest, const char *src, size_t size);
 extern size_t strlcpy(char *dest, const char *src, size_t size);
 #endif
 #endif
 
 

+ 3 - 3
tools/perf/util/evsel.c

@@ -507,17 +507,17 @@ static int __perf_evsel__hw_cache_name(u64 config, char *bf, size_t size)
 	u8 op, result, type = (config >>  0) & 0xff;
 	u8 op, result, type = (config >>  0) & 0xff;
 	const char *err = "unknown-ext-hardware-cache-type";
 	const char *err = "unknown-ext-hardware-cache-type";
 
 
-	if (type > PERF_COUNT_HW_CACHE_MAX)
+	if (type >= PERF_COUNT_HW_CACHE_MAX)
 		goto out_err;
 		goto out_err;
 
 
 	op = (config >>  8) & 0xff;
 	op = (config >>  8) & 0xff;
 	err = "unknown-ext-hardware-cache-op";
 	err = "unknown-ext-hardware-cache-op";
-	if (op > PERF_COUNT_HW_CACHE_OP_MAX)
+	if (op >= PERF_COUNT_HW_CACHE_OP_MAX)
 		goto out_err;
 		goto out_err;
 
 
 	result = (config >> 16) & 0xff;
 	result = (config >> 16) & 0xff;
 	err = "unknown-ext-hardware-cache-result";
 	err = "unknown-ext-hardware-cache-result";
-	if (result > PERF_COUNT_HW_CACHE_RESULT_MAX)
+	if (result >= PERF_COUNT_HW_CACHE_RESULT_MAX)
 		goto out_err;
 		goto out_err;
 
 
 	err = "invalid-cache";
 	err = "invalid-cache";

+ 1 - 1
tools/perf/util/unwind-libdw.c

@@ -66,7 +66,7 @@ static int entry(u64 ip, struct unwind_info *ui)
 	if (__report_module(&al, ip, ui))
 	if (__report_module(&al, ip, ui))
 		return -1;
 		return -1;
 
 
-	e->ip  = ip;
+	e->ip  = al.addr;
 	e->map = al.map;
 	e->map = al.map;
 	e->sym = al.sym;
 	e->sym = al.sym;
 
 

+ 1 - 1
tools/perf/util/unwind-libunwind-local.c

@@ -542,7 +542,7 @@ static int entry(u64 ip, struct thread *thread,
 	thread__find_addr_location(thread, PERF_RECORD_MISC_USER,
 	thread__find_addr_location(thread, PERF_RECORD_MISC_USER,
 				   MAP__FUNCTION, ip, &al);
 				   MAP__FUNCTION, ip, &al);
 
 
-	e.ip = ip;
+	e.ip = al.addr;
 	e.map = al.map;
 	e.map = al.map;
 	e.sym = al.sym;
 	e.sym = al.sym;