Commit 2a83dc7e authored by Linus Torvalds's avatar 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:
 "Tooling fixes, plus a simple hardware-enablement patch for the Intel
  RAPL PMU (energy use measurement) on Haswell CPUs, which I hope is
  still fine at this stage"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf tools: Instead of redirecting flex output, use -o
  perf tools: Fix double free in perf test 21 (code-reading.c)
  perf stat: Initialize statistics correctly
  perf bench: Set more defaults in the 'numa' suite
  perf bench: Fix segfault at the end of an 'all' execution
  perf bench: Update manpage to mention numa and futex
  perf probe: Use dwarf_getcfi_elf() instead of dwarf_getcfi()
  perf probe: Fix to handle errors in line_range searching
  perf probe: Fix --line option behavior
  perf tools: Pick up libdw without explicit LIBDW_DIR
  MAINTAINERS: Change e-mail to kernel.org one
  perf callchains: Disable unwind libraries when libelf isn't found
  tools lib traceevent: Do not call warning() directly
  tools lib traceevent: Print event name when show warning if possible
  perf top: Fix documentation of invalid -s option
  perf/x86: Enable DRAM RAPL support on Intel Haswell
parents 17cf7db2 ad466db5
...@@ -6782,7 +6782,7 @@ PERFORMANCE EVENTS SUBSYSTEM ...@@ -6782,7 +6782,7 @@ PERFORMANCE EVENTS SUBSYSTEM
M: Peter Zijlstra <a.p.zijlstra@chello.nl> M: Peter Zijlstra <a.p.zijlstra@chello.nl>
M: Paul Mackerras <paulus@samba.org> M: Paul Mackerras <paulus@samba.org>
M: Ingo Molnar <mingo@redhat.com> M: Ingo Molnar <mingo@redhat.com>
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> M: Arnaldo Carvalho de Melo <acme@kernel.org>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
S: Supported S: Supported
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
#define INTEL_RAPL_PKG 0x2 /* pseudo-encoding */ #define INTEL_RAPL_PKG 0x2 /* pseudo-encoding */
#define RAPL_IDX_RAM_NRG_STAT 2 /* DRAM */ #define RAPL_IDX_RAM_NRG_STAT 2 /* DRAM */
#define INTEL_RAPL_RAM 0x3 /* pseudo-encoding */ #define INTEL_RAPL_RAM 0x3 /* pseudo-encoding */
#define RAPL_IDX_PP1_NRG_STAT 3 /* DRAM */ #define RAPL_IDX_PP1_NRG_STAT 3 /* gpu */
#define INTEL_RAPL_PP1 0x4 /* pseudo-encoding */ #define INTEL_RAPL_PP1 0x4 /* pseudo-encoding */
/* Clients have PP0, PKG */ /* Clients have PP0, PKG */
...@@ -72,6 +72,12 @@ ...@@ -72,6 +72,12 @@
1<<RAPL_IDX_PKG_NRG_STAT|\ 1<<RAPL_IDX_PKG_NRG_STAT|\
1<<RAPL_IDX_RAM_NRG_STAT) 1<<RAPL_IDX_RAM_NRG_STAT)
/* Servers have PP0, PKG, RAM, PP1 */
#define RAPL_IDX_HSW (1<<RAPL_IDX_PP0_NRG_STAT|\
1<<RAPL_IDX_PKG_NRG_STAT|\
1<<RAPL_IDX_RAM_NRG_STAT|\
1<<RAPL_IDX_PP1_NRG_STAT)
/* /*
* event code: LSB 8 bits, passed in attr->config * event code: LSB 8 bits, passed in attr->config
* any other bit is reserved * any other bit is reserved
...@@ -425,6 +431,24 @@ static struct attribute *rapl_events_cln_attr[] = { ...@@ -425,6 +431,24 @@ static struct attribute *rapl_events_cln_attr[] = {
NULL, NULL,
}; };
static struct attribute *rapl_events_hsw_attr[] = {
EVENT_PTR(rapl_cores),
EVENT_PTR(rapl_pkg),
EVENT_PTR(rapl_gpu),
EVENT_PTR(rapl_ram),
EVENT_PTR(rapl_cores_unit),
EVENT_PTR(rapl_pkg_unit),
EVENT_PTR(rapl_gpu_unit),
EVENT_PTR(rapl_ram_unit),
EVENT_PTR(rapl_cores_scale),
EVENT_PTR(rapl_pkg_scale),
EVENT_PTR(rapl_gpu_scale),
EVENT_PTR(rapl_ram_scale),
NULL,
};
static struct attribute_group rapl_pmu_events_group = { static struct attribute_group rapl_pmu_events_group = {
.name = "events", .name = "events",
.attrs = NULL, /* patched at runtime */ .attrs = NULL, /* patched at runtime */
...@@ -631,11 +655,14 @@ static int __init rapl_pmu_init(void) ...@@ -631,11 +655,14 @@ static int __init rapl_pmu_init(void)
switch (boot_cpu_data.x86_model) { switch (boot_cpu_data.x86_model) {
case 42: /* Sandy Bridge */ case 42: /* Sandy Bridge */
case 58: /* Ivy Bridge */ case 58: /* Ivy Bridge */
case 60: /* Haswell */
case 69: /* Haswell-Celeron */
rapl_cntr_mask = RAPL_IDX_CLN; rapl_cntr_mask = RAPL_IDX_CLN;
rapl_pmu_events_group.attrs = rapl_events_cln_attr; rapl_pmu_events_group.attrs = rapl_events_cln_attr;
break; break;
case 60: /* Haswell */
case 69: /* Haswell-Celeron */
rapl_cntr_mask = RAPL_IDX_HSW;
rapl_pmu_events_group.attrs = rapl_events_hsw_attr;
break;
case 45: /* Sandy Bridge-EP */ case 45: /* Sandy Bridge-EP */
case 62: /* IvyTown */ case 62: /* IvyTown */
rapl_cntr_mask = RAPL_IDX_SRV; rapl_cntr_mask = RAPL_IDX_SRV;
......
This diff is collapsed.
...@@ -48,6 +48,12 @@ SUBSYSTEM ...@@ -48,6 +48,12 @@ SUBSYSTEM
'mem':: 'mem'::
Memory access performance. Memory access performance.
'numa'::
NUMA scheduling and MM benchmarks.
'futex'::
Futex stressing benchmarks.
'all':: 'all'::
All benchmark subsystems. All benchmark subsystems.
...@@ -187,6 +193,22 @@ Show only the result with page faults before memset. ...@@ -187,6 +193,22 @@ Show only the result with page faults before memset.
--no-prefault:: --no-prefault::
Show only the result without page faults before memset. Show only the result without page faults before memset.
SUITES FOR 'numa'
~~~~~~~~~~~~~~~~~
*mem*::
Suite for evaluating NUMA workloads.
SUITES FOR 'futex'
~~~~~~~~~~~~~~~~~~
*hash*::
Suite for evaluating hash tables.
*wake*::
Suite for evaluating wake calls.
*requeue*::
Suite for evaluating requeue calls.
SEE ALSO SEE ALSO
-------- --------
linkperf:perf[1] linkperf:perf[1]
...@@ -87,7 +87,6 @@ Default is to monitor all CPUS. ...@@ -87,7 +87,6 @@ Default is to monitor all CPUS.
--realtime=<priority>:: --realtime=<priority>::
Collect data with this RT SCHED_FIFO priority. Collect data with this RT SCHED_FIFO priority.
-s <symbol>::
--sym-annotate=<symbol>:: --sym-annotate=<symbol>::
Annotate this symbol. Annotate this symbol.
......
...@@ -192,13 +192,13 @@ endif ...@@ -192,13 +192,13 @@ endif
export PERL_PATH export PERL_PATH
$(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c $(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c
$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c $(QUIET_FLEX)$(FLEX) -o $@ --header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) util/parse-events.l
$(OUTPUT)util/parse-events-bison.c: util/parse-events.y $(OUTPUT)util/parse-events-bison.c: util/parse-events.y
$(QUIET_BISON)$(BISON) -v util/parse-events.y -d $(PARSER_DEBUG_BISON) -o $(OUTPUT)util/parse-events-bison.c -p parse_events_ $(QUIET_BISON)$(BISON) -v util/parse-events.y -d $(PARSER_DEBUG_BISON) -o $(OUTPUT)util/parse-events-bison.c -p parse_events_
$(OUTPUT)util/pmu-flex.c: util/pmu.l $(OUTPUT)util/pmu-bison.c $(OUTPUT)util/pmu-flex.c: util/pmu.l $(OUTPUT)util/pmu-bison.c
$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/pmu-flex.h -t util/pmu.l > $(OUTPUT)util/pmu-flex.c $(QUIET_FLEX)$(FLEX) -o $@ --header-file=$(OUTPUT)util/pmu-flex.h util/pmu.l
$(OUTPUT)util/pmu-bison.c: util/pmu.y $(OUTPUT)util/pmu-bison.c: util/pmu.y
$(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c -p perf_pmu_ $(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c -p perf_pmu_
......
...@@ -1593,6 +1593,10 @@ static void init_params(struct params *p, const char *name, int argc, const char ...@@ -1593,6 +1593,10 @@ static void init_params(struct params *p, const char *name, int argc, const char
p->data_rand_walk = true; p->data_rand_walk = true;
p->nr_loops = -1; p->nr_loops = -1;
p->init_random = true; p->init_random = true;
p->mb_global_str = "1";
p->nr_proc = 1;
p->nr_threads = 1;
p->nr_secs = 5;
p->run_all = argc == 1; p->run_all = argc == 1;
} }
......
...@@ -174,13 +174,20 @@ static inline int perf_evsel__nr_cpus(struct perf_evsel *evsel) ...@@ -174,13 +174,20 @@ static inline int perf_evsel__nr_cpus(struct perf_evsel *evsel)
static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel) static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel)
{ {
memset(evsel->priv, 0, sizeof(struct perf_stat)); int i;
struct perf_stat *ps = evsel->priv;
for (i = 0; i < 3; i++)
init_stats(&ps->res_stats[i]);
} }
static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel) static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel)
{ {
evsel->priv = zalloc(sizeof(struct perf_stat)); evsel->priv = zalloc(sizeof(struct perf_stat));
return evsel->priv == NULL ? -ENOMEM : 0; if (evsel == NULL)
return -ENOMEM;
perf_evsel__reset_stat_priv(evsel);
return 0;
} }
static void perf_evsel__free_stat_priv(struct perf_evsel *evsel) static void perf_evsel__free_stat_priv(struct perf_evsel *evsel)
......
...@@ -65,10 +65,9 @@ ifndef NO_LIBELF ...@@ -65,10 +65,9 @@ ifndef NO_LIBELF
ifdef LIBDW_DIR ifdef LIBDW_DIR
LIBDW_CFLAGS := -I$(LIBDW_DIR)/include LIBDW_CFLAGS := -I$(LIBDW_DIR)/include
LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) -ldw
endif endif
FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) -ldw
endif endif
# include ARCH specific config # include ARCH specific config
...@@ -278,6 +277,8 @@ else ...@@ -278,6 +277,8 @@ else
NO_LIBELF := 1 NO_LIBELF := 1
NO_DWARF := 1 NO_DWARF := 1
NO_DEMANGLE := 1 NO_DEMANGLE := 1
NO_LIBUNWIND := 1
NO_LIBDW_DWARF_UNWIND := 1
else else
msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static); msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
endif endif
......
...@@ -504,6 +504,7 @@ static int do_test_code_reading(bool try_kcore) ...@@ -504,6 +504,7 @@ static int do_test_code_reading(bool try_kcore)
if (ret < 0) { if (ret < 0) {
if (!excl_kernel) { if (!excl_kernel) {
excl_kernel = true; excl_kernel = true;
perf_evlist__set_maps(evlist, NULL, NULL);
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
evlist = NULL; evlist = NULL;
continue; continue;
......
...@@ -985,7 +985,7 @@ static int debuginfo__find_probes(struct debuginfo *dbg, ...@@ -985,7 +985,7 @@ static int debuginfo__find_probes(struct debuginfo *dbg,
#if _ELFUTILS_PREREQ(0, 142) #if _ELFUTILS_PREREQ(0, 142)
/* Get the call frame information from this dwarf */ /* Get the call frame information from this dwarf */
pf->cfi = dwarf_getcfi(dbg->dbg); pf->cfi = dwarf_getcfi_elf(dwarf_getelf(dbg->dbg));
#endif #endif
off = 0; off = 0;
...@@ -1441,13 +1441,15 @@ static int line_range_walk_cb(const char *fname, int lineno, ...@@ -1441,13 +1441,15 @@ static int line_range_walk_cb(const char *fname, int lineno,
void *data) void *data)
{ {
struct line_finder *lf = data; struct line_finder *lf = data;
int err;
if ((strtailcmp(fname, lf->fname) != 0) || if ((strtailcmp(fname, lf->fname) != 0) ||
(lf->lno_s > lineno || lf->lno_e < lineno)) (lf->lno_s > lineno || lf->lno_e < lineno))
return 0; return 0;
if (line_range_add_line(fname, lineno, lf->lr) < 0) err = line_range_add_line(fname, lineno, lf->lr);
return -EINVAL; if (err < 0 && err != -EEXIST)
return err;
return 0; return 0;
} }
...@@ -1473,14 +1475,15 @@ static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf) ...@@ -1473,14 +1475,15 @@ static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf)
static int line_range_inline_cb(Dwarf_Die *in_die, void *data) static int line_range_inline_cb(Dwarf_Die *in_die, void *data)
{ {
find_line_range_by_line(in_die, data); int ret = find_line_range_by_line(in_die, data);
/* /*
* We have to check all instances of inlined function, because * We have to check all instances of inlined function, because
* some execution paths can be optimized out depends on the * some execution paths can be optimized out depends on the
* function argument of instances * function argument of instances. However, if an error occurs,
* it should be handled by the caller.
*/ */
return 0; return ret < 0 ? ret : 0;
} }
/* Search function definition from function name */ /* Search function definition from function name */
......
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