Commit e99bc917 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'perf-urgent-2020-03-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Thomas Gleixner:
 "A pile of perf fixes:

  Kernel side:

   - AMD uncore driver: Replace the open coded sanity check with the
     core variant, which provides the correct error code and also leaves
     a hint in dmesg

  Tooling:

   - Fix the stdio input handling with glibc versions >= 2.28

   - Unbreak the futex-wake benchmark which was reduced to 0 test
     threads due to the conversion to cpumaps

   - Initialize sigaction structs before invoking sys_sigactio()

   - Plug the mapfile memory leak in perf jevents

   - Fix off by one relative directory includes

   - Fix an undefined string comparison in perf diff"

* tag 'perf-urgent-2020-03-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/amd/uncore: Replace manual sampling check with CAP_NO_INTERRUPT flag
  tools: Fix off-by 1 relative directory includes
  perf jevents: Fix leak of mapfile memory
  perf bench: Clear struct sigaction before sigaction() syscall
  perf bench futex-wake: Restore thread count default to online CPU count
  perf top: Fix stdio interface input handling with glibc 2.28+
  perf diff: Fix undefined string comparision spotted by clang's -Wstring-compare
  perf symbols: Don't try to find a vmlinux file when looking for kernel modules
  perf bench: Share some global variables to fix build with gcc 10
  perf parse-events: Use asprintf() instead of strncpy() to read tracepoint files
  perf env: Do not return pointers to local variables
  perf tests bp_account: Make global variable static
parents ffe6da91 f967140d
...@@ -190,15 +190,12 @@ static int amd_uncore_event_init(struct perf_event *event) ...@@ -190,15 +190,12 @@ static int amd_uncore_event_init(struct perf_event *event)
/* /*
* NB and Last level cache counters (MSRs) are shared across all cores * NB and Last level cache counters (MSRs) are shared across all cores
* that share the same NB / Last level cache. Interrupts can be directed * that share the same NB / Last level cache. On family 16h and below,
* to a single target core, however, event counts generated by processes * Interrupts can be directed to a single target core, however, event
* running on other cores cannot be masked out. So we do not support * counts generated by processes running on other cores cannot be masked
* sampling and per-thread events. * out. So we do not support sampling and per-thread events via
* CAP_NO_INTERRUPT, and we do not enable counter overflow interrupts:
*/ */
if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK)
return -EINVAL;
/* and we do not enable counter overflow interrupts */
hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB;
hwc->idx = -1; hwc->idx = -1;
...@@ -306,7 +303,7 @@ static struct pmu amd_nb_pmu = { ...@@ -306,7 +303,7 @@ static struct pmu amd_nb_pmu = {
.start = amd_uncore_start, .start = amd_uncore_start,
.stop = amd_uncore_stop, .stop = amd_uncore_stop,
.read = amd_uncore_read, .read = amd_uncore_read,
.capabilities = PERF_PMU_CAP_NO_EXCLUDE, .capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
}; };
static struct pmu amd_llc_pmu = { static struct pmu amd_llc_pmu = {
...@@ -317,7 +314,7 @@ static struct pmu amd_llc_pmu = { ...@@ -317,7 +314,7 @@ static struct pmu amd_llc_pmu = {
.start = amd_uncore_start, .start = amd_uncore_start,
.stop = amd_uncore_stop, .stop = amd_uncore_stop,
.read = amd_uncore_read, .read = amd_uncore_read,
.capabilities = PERF_PMU_CAP_NO_EXCLUDE, .capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
}; };
static struct amd_uncore *amd_uncore_alloc(unsigned int cpu) static struct amd_uncore *amd_uncore_alloc(unsigned int cpu)
......
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
#include "../../arch/x86/include/uapi/asm/errno.h" #include "../../../arch/x86/include/uapi/asm/errno.h"
#elif defined(__powerpc__) #elif defined(__powerpc__)
#include "../../arch/powerpc/include/uapi/asm/errno.h" #include "../../../arch/powerpc/include/uapi/asm/errno.h"
#elif defined(__sparc__) #elif defined(__sparc__)
#include "../../arch/sparc/include/uapi/asm/errno.h" #include "../../../arch/sparc/include/uapi/asm/errno.h"
#elif defined(__alpha__) #elif defined(__alpha__)
#include "../../arch/alpha/include/uapi/asm/errno.h" #include "../../../arch/alpha/include/uapi/asm/errno.h"
#elif defined(__mips__) #elif defined(__mips__)
#include "../../arch/mips/include/uapi/asm/errno.h" #include "../../../arch/mips/include/uapi/asm/errno.h"
#elif defined(__ia64__) #elif defined(__ia64__)
#include "../../arch/ia64/include/uapi/asm/errno.h" #include "../../../arch/ia64/include/uapi/asm/errno.h"
#elif defined(__xtensa__) #elif defined(__xtensa__)
#include "../../arch/xtensa/include/uapi/asm/errno.h" #include "../../../arch/xtensa/include/uapi/asm/errno.h"
#else #else
#include <asm-generic/errno.h> #include <asm-generic/errno.h>
#endif #endif
...@@ -11,17 +11,17 @@ ...@@ -11,17 +11,17 @@
#include <linux/zalloc.h> #include <linux/zalloc.h>
#include <time.h> #include <time.h>
#include "../../util/cpumap.h" #include "../../../util/cpumap.h"
#include "../../util/event.h" #include "../../../util/event.h"
#include "../../util/evsel.h" #include "../../../util/evsel.h"
#include "../../util/evlist.h" #include "../../../util/evlist.h"
#include "../../util/session.h" #include "../../../util/session.h"
#include <internal/lib.h> // page_size #include <internal/lib.h> // page_size
#include "../../util/pmu.h" #include "../../../util/pmu.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#include "../../util/auxtrace.h" #include "../../../util/auxtrace.h"
#include "../../util/record.h" #include "../../../util/record.h"
#include "../../util/arm-spe.h" #include "../../../util/arm-spe.h"
#define KiB(x) ((x) * 1024) #define KiB(x) ((x) * 1024)
#define MiB(x) ((x) * 1024 * 1024) #define MiB(x) ((x) * 1024 * 1024)
......
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include "../../util/perf_regs.h" #include "../../../util/perf_regs.h"
const struct sample_reg sample_reg_masks[] = { const struct sample_reg sample_reg_masks[] = {
SMPL_REG_END SMPL_REG_END
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
#include <regex.h> #include <regex.h>
#include <linux/zalloc.h> #include <linux/zalloc.h>
#include "../../util/perf_regs.h" #include "../../../util/perf_regs.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -7,13 +7,13 @@ ...@@ -7,13 +7,13 @@
#include <errno.h> #include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include "../../util/header.h" #include "../../../util/header.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#include "../../util/pmu.h" #include "../../../util/pmu.h"
#include "../../util/auxtrace.h" #include "../../../util/auxtrace.h"
#include "../../util/intel-pt.h" #include "../../../util/intel-pt.h"
#include "../../util/intel-bts.h" #include "../../../util/intel-bts.h"
#include "../../util/evlist.h" #include "../../../util/evlist.h"
static static
struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist, struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist,
......
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/zalloc.h> #include <linux/zalloc.h>
#include "../../util/event.h" #include "../../../util/event.h"
#include "../../util/synthetic-events.h" #include "../../../util/synthetic-events.h"
#include "../../util/machine.h" #include "../../../util/machine.h"
#include "../../util/tool.h" #include "../../../util/tool.h"
#include "../../util/map.h" #include "../../../util/map.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#if defined(__x86_64__) #if defined(__x86_64__)
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>
#include "../../util/debug.h" #include "../../../util/debug.h"
#include "../../util/header.h" #include "../../../util/header.h"
static inline void static inline void
cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c, cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c,
......
...@@ -11,18 +11,18 @@ ...@@ -11,18 +11,18 @@
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/zalloc.h> #include <linux/zalloc.h>
#include "../../util/cpumap.h" #include "../../../util/cpumap.h"
#include "../../util/event.h" #include "../../../util/event.h"
#include "../../util/evsel.h" #include "../../../util/evsel.h"
#include "../../util/evlist.h" #include "../../../util/evlist.h"
#include "../../util/mmap.h" #include "../../../util/mmap.h"
#include "../../util/session.h" #include "../../../util/session.h"
#include "../../util/pmu.h" #include "../../../util/pmu.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#include "../../util/record.h" #include "../../../util/record.h"
#include "../../util/tsc.h" #include "../../../util/tsc.h"
#include "../../util/auxtrace.h" #include "../../../util/auxtrace.h"
#include "../../util/intel-bts.h" #include "../../../util/intel-bts.h"
#include <internal/lib.h> // page_size #include <internal/lib.h> // page_size
#define KiB(x) ((x) * 1024) #define KiB(x) ((x) * 1024)
......
...@@ -13,23 +13,23 @@ ...@@ -13,23 +13,23 @@
#include <linux/zalloc.h> #include <linux/zalloc.h>
#include <cpuid.h> #include <cpuid.h>
#include "../../util/session.h" #include "../../../util/session.h"
#include "../../util/event.h" #include "../../../util/event.h"
#include "../../util/evlist.h" #include "../../../util/evlist.h"
#include "../../util/evsel.h" #include "../../../util/evsel.h"
#include "../../util/evsel_config.h" #include "../../../util/evsel_config.h"
#include "../../util/cpumap.h" #include "../../../util/cpumap.h"
#include "../../util/mmap.h" #include "../../../util/mmap.h"
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
#include "../../util/parse-events.h" #include "../../../util/parse-events.h"
#include "../../util/pmu.h" #include "../../../util/pmu.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#include "../../util/auxtrace.h" #include "../../../util/auxtrace.h"
#include "../../util/record.h" #include "../../../util/record.h"
#include "../../util/target.h" #include "../../../util/target.h"
#include "../../util/tsc.h" #include "../../../util/tsc.h"
#include <internal/lib.h> // page_size #include <internal/lib.h> // page_size
#include "../../util/intel-pt.h" #include "../../../util/intel-pt.h"
#define KiB(x) ((x) * 1024) #define KiB(x) ((x) * 1024)
#define MiB(x) ((x) * 1024 * 1024) #define MiB(x) ((x) * 1024 * 1024)
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <internal/lib.h> // page_size #include <internal/lib.h> // page_size
#include "../../util/machine.h" #include "../../../util/machine.h"
#include "../../util/map.h" #include "../../../util/map.h"
#include "../../util/symbol.h" #include "../../../util/symbol.h"
#include <linux/ctype.h> #include <linux/ctype.h>
#include <symbol/kallsyms.h> #include <symbol/kallsyms.h>
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/zalloc.h> #include <linux/zalloc.h>
#include "../../perf-sys.h" #include "../../../perf-sys.h"
#include "../../util/perf_regs.h" #include "../../../util/perf_regs.h"
#include "../../util/debug.h" #include "../../../util/debug.h"
#include "../../util/event.h" #include "../../../util/event.h"
const struct sample_reg sample_reg_masks[] = { const struct sample_reg sample_reg_masks[] = {
SMPL_REG(AX, PERF_REG_X86_AX), SMPL_REG(AX, PERF_REG_X86_AX),
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/perf_event.h> #include <linux/perf_event.h>
#include "../../util/intel-pt.h" #include "../../../util/intel-pt.h"
#include "../../util/intel-bts.h" #include "../../../util/intel-bts.h"
#include "../../util/pmu.h" #include "../../../util/pmu.h"
struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused) struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
{ {
......
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
#ifndef BENCH_H #ifndef BENCH_H
#define BENCH_H #define BENCH_H
#include <sys/time.h>
extern struct timeval bench__start, bench__end, bench__runtime;
/* /*
* The madvise transparent hugepage constants were added in glibc * The madvise transparent hugepage constants were added in glibc
* 2.13. For compatibility with older versions of glibc, define these * 2.13. For compatibility with older versions of glibc, define these
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
static unsigned int nthreads = 0; static unsigned int nthreads = 0;
static unsigned int nsecs = 8; static unsigned int nsecs = 8;
struct timeval start, end, runtime;
static bool done, __verbose, randomize; static bool done, __verbose, randomize;
/* /*
...@@ -94,8 +93,8 @@ static void toggle_done(int sig __maybe_unused, ...@@ -94,8 +93,8 @@ static void toggle_done(int sig __maybe_unused,
{ {
/* inform all threads that we're done for the day */ /* inform all threads that we're done for the day */
done = true; done = true;
gettimeofday(&end, NULL); gettimeofday(&bench__end, NULL);
timersub(&end, &start, &runtime); timersub(&bench__end, &bench__start, &bench__runtime);
} }
static void nest_epollfd(void) static void nest_epollfd(void)
...@@ -313,6 +312,7 @@ int bench_epoll_ctl(int argc, const char **argv) ...@@ -313,6 +312,7 @@ int bench_epoll_ctl(int argc, const char **argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
...@@ -361,7 +361,7 @@ int bench_epoll_ctl(int argc, const char **argv) ...@@ -361,7 +361,7 @@ int bench_epoll_ctl(int argc, const char **argv)
threads_starting = nthreads; threads_starting = nthreads;
gettimeofday(&start, NULL); gettimeofday(&bench__start, NULL);
do_threads(worker, cpu); do_threads(worker, cpu);
......
...@@ -90,7 +90,6 @@ ...@@ -90,7 +90,6 @@
static unsigned int nthreads = 0; static unsigned int nthreads = 0;
static unsigned int nsecs = 8; static unsigned int nsecs = 8;
struct timeval start, end, runtime;
static bool wdone, done, __verbose, randomize, nonblocking; static bool wdone, done, __verbose, randomize, nonblocking;
/* /*
...@@ -276,8 +275,8 @@ static void toggle_done(int sig __maybe_unused, ...@@ -276,8 +275,8 @@ static void toggle_done(int sig __maybe_unused,
{ {
/* inform all threads that we're done for the day */ /* inform all threads that we're done for the day */
done = true; done = true;
gettimeofday(&end, NULL); gettimeofday(&bench__end, NULL);
timersub(&end, &start, &runtime); timersub(&bench__end, &bench__start, &bench__runtime);
} }
static void print_summary(void) static void print_summary(void)
...@@ -287,7 +286,7 @@ static void print_summary(void) ...@@ -287,7 +286,7 @@ static void print_summary(void)
printf("\nAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", printf("\nAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
avg, rel_stddev_stats(stddev, avg), avg, rel_stddev_stats(stddev, avg),
(int) runtime.tv_sec); (int)bench__runtime.tv_sec);
} }
static int do_threads(struct worker *worker, struct perf_cpu_map *cpu) static int do_threads(struct worker *worker, struct perf_cpu_map *cpu)
...@@ -427,6 +426,7 @@ int bench_epoll_wait(int argc, const char **argv) ...@@ -427,6 +426,7 @@ int bench_epoll_wait(int argc, const char **argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
...@@ -479,7 +479,7 @@ int bench_epoll_wait(int argc, const char **argv) ...@@ -479,7 +479,7 @@ int bench_epoll_wait(int argc, const char **argv)
threads_starting = nthreads; threads_starting = nthreads;
gettimeofday(&start, NULL); gettimeofday(&bench__start, NULL);
do_threads(worker, cpu); do_threads(worker, cpu);
...@@ -519,7 +519,7 @@ int bench_epoll_wait(int argc, const char **argv) ...@@ -519,7 +519,7 @@ int bench_epoll_wait(int argc, const char **argv)
qsort(worker, nthreads, sizeof(struct worker), cmpworker); qsort(worker, nthreads, sizeof(struct worker), cmpworker);
for (i = 0; i < nthreads; i++) { for (i = 0; i < nthreads; i++) {
unsigned long t = worker[i].ops/runtime.tv_sec; unsigned long t = worker[i].ops / bench__runtime.tv_sec;
update_stats(&throughput_stats, t); update_stats(&throughput_stats, t);
......
...@@ -37,7 +37,7 @@ static unsigned int nfutexes = 1024; ...@@ -37,7 +37,7 @@ static unsigned int nfutexes = 1024;
static bool fshared = false, done = false, silent = false; static bool fshared = false, done = false, silent = false;
static int futex_flag = 0; static int futex_flag = 0;
struct timeval start, end, runtime; struct timeval bench__start, bench__end, bench__runtime;
static pthread_mutex_t thread_lock; static pthread_mutex_t thread_lock;
static unsigned int threads_starting; static unsigned int threads_starting;
static struct stats throughput_stats; static struct stats throughput_stats;
...@@ -103,8 +103,8 @@ static void toggle_done(int sig __maybe_unused, ...@@ -103,8 +103,8 @@ static void toggle_done(int sig __maybe_unused,
{ {
/* inform all threads that we're done for the day */ /* inform all threads that we're done for the day */
done = true; done = true;
gettimeofday(&end, NULL); gettimeofday(&bench__end, NULL);
timersub(&end, &start, &runtime); timersub(&bench__end, &bench__start, &bench__runtime);
} }
static void print_summary(void) static void print_summary(void)
...@@ -114,7 +114,7 @@ static void print_summary(void) ...@@ -114,7 +114,7 @@ static void print_summary(void)
printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
!silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg),
(int) runtime.tv_sec); (int)bench__runtime.tv_sec);
} }
int bench_futex_hash(int argc, const char **argv) int bench_futex_hash(int argc, const char **argv)
...@@ -137,6 +137,7 @@ int bench_futex_hash(int argc, const char **argv) ...@@ -137,6 +137,7 @@ int bench_futex_hash(int argc, const char **argv)
if (!cpu) if (!cpu)
goto errmem; goto errmem;
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
...@@ -161,7 +162,7 @@ int bench_futex_hash(int argc, const char **argv) ...@@ -161,7 +162,7 @@ int bench_futex_hash(int argc, const char **argv)
threads_starting = nthreads; threads_starting = nthreads;
pthread_attr_init(&thread_attr); pthread_attr_init(&thread_attr);
gettimeofday(&start, NULL); gettimeofday(&bench__start, NULL);
for (i = 0; i < nthreads; i++) { for (i = 0; i < nthreads; i++) {
worker[i].tid = i; worker[i].tid = i;
worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex)); worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex));
...@@ -204,7 +205,7 @@ int bench_futex_hash(int argc, const char **argv) ...@@ -204,7 +205,7 @@ int bench_futex_hash(int argc, const char **argv)
pthread_mutex_destroy(&thread_lock); pthread_mutex_destroy(&thread_lock);
for (i = 0; i < nthreads; i++) { for (i = 0; i < nthreads; i++) {
unsigned long t = worker[i].ops/runtime.tv_sec; unsigned long t = worker[i].ops / bench__runtime.tv_sec;
update_stats(&throughput_stats, t); update_stats(&throughput_stats, t);
if (!silent) { if (!silent) {
if (nfutexes == 1) if (nfutexes == 1)
......
...@@ -37,7 +37,6 @@ static bool silent = false, multi = false; ...@@ -37,7 +37,6 @@ static bool silent = false, multi = false;
static bool done = false, fshared = false; static bool done = false, fshared = false;
static unsigned int nthreads = 0; static unsigned int nthreads = 0;
static int futex_flag = 0; static int futex_flag = 0;
struct timeval start, end, runtime;
static pthread_mutex_t thread_lock; static pthread_mutex_t thread_lock;
static unsigned int threads_starting; static unsigned int threads_starting;
static struct stats throughput_stats; static struct stats throughput_stats;
...@@ -64,7 +63,7 @@ static void print_summary(void) ...@@ -64,7 +63,7 @@ static void print_summary(void)
printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n", printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
!silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg), !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg),
(int) runtime.tv_sec); (int)bench__runtime.tv_sec);
} }
static void toggle_done(int sig __maybe_unused, static void toggle_done(int sig __maybe_unused,
...@@ -73,8 +72,8 @@ static void toggle_done(int sig __maybe_unused, ...@@ -73,8 +72,8 @@ static void toggle_done(int sig __maybe_unused,
{ {
/* inform all threads that we're done for the day */ /* inform all threads that we're done for the day */
done = true; done = true;
gettimeofday(&end, NULL); gettimeofday(&bench__end, NULL);
timersub(&end, &start, &runtime); timersub(&bench__end, &bench__start, &bench__runtime);
} }
static void *workerfn(void *arg) static void *workerfn(void *arg)
...@@ -161,6 +160,7 @@ int bench_futex_lock_pi(int argc, const char **argv) ...@@ -161,6 +160,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
if (!cpu) if (!cpu)
err(EXIT_FAILURE, "calloc"); err(EXIT_FAILURE, "calloc");
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
...@@ -185,7 +185,7 @@ int bench_futex_lock_pi(int argc, const char **argv) ...@@ -185,7 +185,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
threads_starting = nthreads; threads_starting = nthreads;
pthread_attr_init(&thread_attr); pthread_attr_init(&thread_attr);
gettimeofday(&start, NULL); gettimeofday(&bench__start, NULL);
create_threads(worker, thread_attr, cpu); create_threads(worker, thread_attr, cpu);
pthread_attr_destroy(&thread_attr); pthread_attr_destroy(&thread_attr);
...@@ -211,7 +211,7 @@ int bench_futex_lock_pi(int argc, const char **argv) ...@@ -211,7 +211,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
pthread_mutex_destroy(&thread_lock); pthread_mutex_destroy(&thread_lock);
for (i = 0; i < nthreads; i++) { for (i = 0; i < nthreads; i++) {
unsigned long t = worker[i].ops/runtime.tv_sec; unsigned long t = worker[i].ops / bench__runtime.tv_sec;
update_stats(&throughput_stats, t); update_stats(&throughput_stats, t);
if (!silent) if (!silent)
......
...@@ -128,6 +128,7 @@ int bench_futex_requeue(int argc, const char **argv) ...@@ -128,6 +128,7 @@ int bench_futex_requeue(int argc, const char **argv)
if (!cpu) if (!cpu)
err(EXIT_FAILURE, "cpu_map__new"); err(EXIT_FAILURE, "cpu_map__new");
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
......
...@@ -234,6 +234,7 @@ int bench_futex_wake_parallel(int argc, const char **argv) ...@@ -234,6 +234,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
......
...@@ -43,7 +43,7 @@ static bool done = false, silent = false, fshared = false; ...@@ -43,7 +43,7 @@ static bool done = false, silent = false, fshared = false;
static pthread_mutex_t thread_lock; static pthread_mutex_t thread_lock;
static pthread_cond_t thread_parent, thread_worker; static pthread_cond_t thread_parent, thread_worker;
static struct stats waketime_stats, wakeup_stats; static struct stats waketime_stats, wakeup_stats;
static unsigned int ncpus, threads_starting, nthreads = 0; static unsigned int threads_starting, nthreads = 0;
static int futex_flag = 0; static int futex_flag = 0;
static const struct option options[] = { static const struct option options[] = {
...@@ -136,12 +136,13 @@ int bench_futex_wake(int argc, const char **argv) ...@@ -136,12 +136,13 @@ int bench_futex_wake(int argc, const char **argv)
if (!cpu) if (!cpu)
err(EXIT_FAILURE, "calloc"); err(EXIT_FAILURE, "calloc");
memset(&act, 0, sizeof(act));
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
if (!nthreads) if (!nthreads)
nthreads = ncpus; nthreads = cpu->nr;
worker = calloc(nthreads, sizeof(*worker)); worker = calloc(nthreads, sizeof(*worker));
if (!worker) if (!worker)
......
...@@ -1312,7 +1312,8 @@ static int cycles_printf(struct hist_entry *he, struct hist_entry *pair, ...@@ -1312,7 +1312,8 @@ static int cycles_printf(struct hist_entry *he, struct hist_entry *pair,
end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, end_line = map__srcline(he->ms.map, bi->sym->start + bi->end,
he->ms.sym); he->ms.sym);
if ((start_line != SRCLINE_UNKNOWN) && (end_line != SRCLINE_UNKNOWN)) { if ((strncmp(start_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) &&
(strncmp(end_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)) {
scnprintf(buf, sizeof(buf), "[%s -> %s] %4ld", scnprintf(buf, sizeof(buf), "[%s -> %s] %4ld",
start_line, end_line, block_he->diff.cycles); start_line, end_line, block_he->diff.cycles);
} else { } else {
......
...@@ -684,7 +684,9 @@ static void *display_thread(void *arg) ...@@ -684,7 +684,9 @@ static void *display_thread(void *arg)
delay_msecs = top->delay_secs * MSEC_PER_SEC; delay_msecs = top->delay_secs * MSEC_PER_SEC;
set_term_quiet_input(&save); set_term_quiet_input(&save);
/* trash return*/ /* trash return*/
getc(stdin); clearerr(stdin);
if (poll(&stdin_poll, 1, 0) > 0)
getc(stdin);
while (!done) { while (!done) {
perf_top__print_sym_table(top); perf_top__print_sym_table(top);
......
...@@ -1082,10 +1082,9 @@ static int process_one_file(const char *fpath, const struct stat *sb, ...@@ -1082,10 +1082,9 @@ static int process_one_file(const char *fpath, const struct stat *sb,
*/ */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int rc; int rc, ret = 0;
int maxfds; int maxfds;
char ldirname[PATH_MAX]; char ldirname[PATH_MAX];
const char *arch; const char *arch;
const char *output_file; const char *output_file;
const char *start_dirname; const char *start_dirname;
...@@ -1156,7 +1155,8 @@ int main(int argc, char *argv[]) ...@@ -1156,7 +1155,8 @@ int main(int argc, char *argv[])
/* Make build fail */ /* Make build fail */
fclose(eventsfp); fclose(eventsfp);
free_arch_std_events(); free_arch_std_events();
return 1; ret = 1;
goto out_free_mapfile;
} else if (rc) { } else if (rc) {
goto empty_map; goto empty_map;
} }
...@@ -1174,14 +1174,17 @@ int main(int argc, char *argv[]) ...@@ -1174,14 +1174,17 @@ int main(int argc, char *argv[])
/* Make build fail */ /* Make build fail */
fclose(eventsfp); fclose(eventsfp);
free_arch_std_events(); free_arch_std_events();
return 1; ret = 1;
} }
return 0;
goto out_free_mapfile;
empty_map: empty_map:
fclose(eventsfp); fclose(eventsfp);
create_empty_mapping(output_file); create_empty_mapping(output_file);
free_arch_std_events(); free_arch_std_events();
return 0; out_free_mapfile:
free(mapfile);
return ret;
} }
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include "../perf-sys.h" #include "../perf-sys.h"
#include "cloexec.h" #include "cloexec.h"
volatile long the_var; static volatile long the_var;
static noinline int test_function(void) static noinline int test_function(void)
{ {
......
...@@ -295,7 +295,8 @@ static int block_range_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, ...@@ -295,7 +295,8 @@ static int block_range_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
end_line = map__srcline(he->ms.map, bi->sym->start + bi->end, end_line = map__srcline(he->ms.map, bi->sym->start + bi->end,
he->ms.sym); he->ms.sym);
if ((start_line != SRCLINE_UNKNOWN) && (end_line != SRCLINE_UNKNOWN)) { if ((strncmp(start_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) &&
(strncmp(end_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)) {
scnprintf(buf, sizeof(buf), "[%s -> %s]", scnprintf(buf, sizeof(buf), "[%s -> %s]",
start_line, end_line); start_line, end_line);
} else { } else {
......
...@@ -343,11 +343,11 @@ static const char *normalize_arch(char *arch) ...@@ -343,11 +343,11 @@ static const char *normalize_arch(char *arch)
const char *perf_env__arch(struct perf_env *env) const char *perf_env__arch(struct perf_env *env)
{ {
struct utsname uts;
char *arch_name; char *arch_name;
if (!env || !env->arch) { /* Assume local operation */ if (!env || !env->arch) { /* Assume local operation */
if (uname(&uts) < 0) static struct utsname uts = { .machine[0] = '\0', };
if (uts.machine[0] == '\0' && uname(&uts) < 0)
return NULL; return NULL;
arch_name = uts.machine; arch_name = uts.machine;
} else } else
......
...@@ -431,7 +431,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, ...@@ -431,7 +431,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
if (map && map->dso) { if (map && map->dso) {
char *srcline = map__srcline(map, addr, NULL); char *srcline = map__srcline(map, addr, NULL);
if (srcline != SRCLINE_UNKNOWN) if (strncmp(srcline, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)
ret = fprintf(fp, "%s%s", prefix, srcline); ret = fprintf(fp, "%s%s", prefix, srcline);
free_srcline(srcline); free_srcline(srcline);
} }
......
...@@ -257,21 +257,15 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config) ...@@ -257,21 +257,15 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)
path = zalloc(sizeof(*path)); path = zalloc(sizeof(*path));
if (!path) if (!path)
return NULL; return NULL;
path->system = malloc(MAX_EVENT_LENGTH); if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) {
if (!path->system) {
free(path); free(path);
return NULL; return NULL;
} }
path->name = malloc(MAX_EVENT_LENGTH); if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) {
if (!path->name) {
zfree(&path->system); zfree(&path->system);
free(path); free(path);
return NULL; return NULL;
} }
strncpy(path->system, sys_dirent->d_name,
MAX_EVENT_LENGTH);
strncpy(path->name, evt_dirent->d_name,
MAX_EVENT_LENGTH);
return path; return path;
} }
} }
......
...@@ -1622,7 +1622,12 @@ int dso__load(struct dso *dso, struct map *map) ...@@ -1622,7 +1622,12 @@ int dso__load(struct dso *dso, struct map *map)
goto out; goto out;
} }
if (dso->kernel) { kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
if (dso->kernel && !kmod) {
if (dso->kernel == DSO_TYPE_KERNEL) if (dso->kernel == DSO_TYPE_KERNEL)
ret = dso__load_kernel_sym(dso, map); ret = dso__load_kernel_sym(dso, map);
else if (dso->kernel == DSO_TYPE_GUEST_KERNEL) else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
...@@ -1650,12 +1655,6 @@ int dso__load(struct dso *dso, struct map *map) ...@@ -1650,12 +1655,6 @@ int dso__load(struct dso *dso, struct map *map)
if (!name) if (!name)
goto out; goto out;
kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
/* /*
* Read the build id if possible. This is required for * Read the build id if possible. This is required for
* DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment