diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-16 19:38:57 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-16 19:38:57 -0400 |
| commit | 2a83dc7e37045ecf6791bb98e7b91c3f761e5efe (patch) | |
| tree | 4a820de1fbcd2f1290afeb7f2e06a98c18410e87 | |
| parent | 17cf7db27b3af29ebbc14466785236878aad98eb (diff) | |
| parent | ad466db5b0c302e85ad96c42a43194c234cbd862 (diff) | |
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
| -rw-r--r-- | MAINTAINERS | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_rapl.c | 33 | ||||
| -rw-r--r-- | tools/lib/traceevent/event-parse.c | 109 | ||||
| -rw-r--r-- | tools/perf/Documentation/perf-bench.txt | 22 | ||||
| -rw-r--r-- | tools/perf/Documentation/perf-top.txt | 1 | ||||
| -rw-r--r-- | tools/perf/Makefile.perf | 4 | ||||
| -rw-r--r-- | tools/perf/bench/numa.c | 4 | ||||
| -rw-r--r-- | tools/perf/builtin-stat.c | 11 | ||||
| -rw-r--r-- | tools/perf/config/Makefile | 7 | ||||
| -rw-r--r-- | tools/perf/tests/code-reading.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/probe-finder.c | 15 |
11 files changed, 148 insertions, 61 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 6dc67b1fdb50..80399fff805d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -6782,7 +6782,7 @@ PERFORMANCE EVENTS SUBSYSTEM | |||
| 6782 | M: Peter Zijlstra <a.p.zijlstra@chello.nl> | 6782 | M: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| 6783 | M: Paul Mackerras <paulus@samba.org> | 6783 | M: Paul Mackerras <paulus@samba.org> |
| 6784 | M: Ingo Molnar <mingo@redhat.com> | 6784 | M: Ingo Molnar <mingo@redhat.com> |
| 6785 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 6785 | M: Arnaldo Carvalho de Melo <acme@kernel.org> |
| 6786 | L: linux-kernel@vger.kernel.org | 6786 | L: linux-kernel@vger.kernel.org |
| 6787 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core | 6787 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core |
| 6788 | S: Supported | 6788 | S: Supported |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c index 059218ed5208..4b9a9e9466bd 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
| @@ -59,7 +59,7 @@ | |||
| 59 | #define INTEL_RAPL_PKG 0x2 /* pseudo-encoding */ | 59 | #define INTEL_RAPL_PKG 0x2 /* pseudo-encoding */ |
| 60 | #define RAPL_IDX_RAM_NRG_STAT 2 /* DRAM */ | 60 | #define RAPL_IDX_RAM_NRG_STAT 2 /* DRAM */ |
| 61 | #define INTEL_RAPL_RAM 0x3 /* pseudo-encoding */ | 61 | #define INTEL_RAPL_RAM 0x3 /* pseudo-encoding */ |
| 62 | #define RAPL_IDX_PP1_NRG_STAT 3 /* DRAM */ | 62 | #define RAPL_IDX_PP1_NRG_STAT 3 /* gpu */ |
| 63 | #define INTEL_RAPL_PP1 0x4 /* pseudo-encoding */ | 63 | #define INTEL_RAPL_PP1 0x4 /* pseudo-encoding */ |
| 64 | 64 | ||
| 65 | /* Clients have PP0, PKG */ | 65 | /* Clients have PP0, PKG */ |
| @@ -72,6 +72,12 @@ | |||
| 72 | 1<<RAPL_IDX_PKG_NRG_STAT|\ | 72 | 1<<RAPL_IDX_PKG_NRG_STAT|\ |
| 73 | 1<<RAPL_IDX_RAM_NRG_STAT) | 73 | 1<<RAPL_IDX_RAM_NRG_STAT) |
| 74 | 74 | ||
| 75 | /* Servers have PP0, PKG, RAM, PP1 */ | ||
| 76 | #define RAPL_IDX_HSW (1<<RAPL_IDX_PP0_NRG_STAT|\ | ||
| 77 | 1<<RAPL_IDX_PKG_NRG_STAT|\ | ||
| 78 | 1<<RAPL_IDX_RAM_NRG_STAT|\ | ||
| 79 | 1<<RAPL_IDX_PP1_NRG_STAT) | ||
| 80 | |||
| 75 | /* | 81 | /* |
| 76 | * event code: LSB 8 bits, passed in attr->config | 82 | * event code: LSB 8 bits, passed in attr->config |
| 77 | * any other bit is reserved | 83 | * any other bit is reserved |
| @@ -425,6 +431,24 @@ static struct attribute *rapl_events_cln_attr[] = { | |||
| 425 | NULL, | 431 | NULL, |
| 426 | }; | 432 | }; |
| 427 | 433 | ||
| 434 | static struct attribute *rapl_events_hsw_attr[] = { | ||
| 435 | EVENT_PTR(rapl_cores), | ||
| 436 | EVENT_PTR(rapl_pkg), | ||
| 437 | EVENT_PTR(rapl_gpu), | ||
| 438 | EVENT_PTR(rapl_ram), | ||
| 439 | |||
| 440 | EVENT_PTR(rapl_cores_unit), | ||
| 441 | EVENT_PTR(rapl_pkg_unit), | ||
| 442 | EVENT_PTR(rapl_gpu_unit), | ||
| 443 | EVENT_PTR(rapl_ram_unit), | ||
| 444 | |||
| 445 | EVENT_PTR(rapl_cores_scale), | ||
| 446 | EVENT_PTR(rapl_pkg_scale), | ||
| 447 | EVENT_PTR(rapl_gpu_scale), | ||
| 448 | EVENT_PTR(rapl_ram_scale), | ||
| 449 | NULL, | ||
| 450 | }; | ||
| 451 | |||
| 428 | static struct attribute_group rapl_pmu_events_group = { | 452 | static struct attribute_group rapl_pmu_events_group = { |
| 429 | .name = "events", | 453 | .name = "events", |
| 430 | .attrs = NULL, /* patched at runtime */ | 454 | .attrs = NULL, /* patched at runtime */ |
| @@ -631,11 +655,14 @@ static int __init rapl_pmu_init(void) | |||
| 631 | switch (boot_cpu_data.x86_model) { | 655 | switch (boot_cpu_data.x86_model) { |
| 632 | case 42: /* Sandy Bridge */ | 656 | case 42: /* Sandy Bridge */ |
| 633 | case 58: /* Ivy Bridge */ | 657 | case 58: /* Ivy Bridge */ |
| 634 | case 60: /* Haswell */ | ||
| 635 | case 69: /* Haswell-Celeron */ | ||
| 636 | rapl_cntr_mask = RAPL_IDX_CLN; | 658 | rapl_cntr_mask = RAPL_IDX_CLN; |
| 637 | rapl_pmu_events_group.attrs = rapl_events_cln_attr; | 659 | rapl_pmu_events_group.attrs = rapl_events_cln_attr; |
| 638 | break; | 660 | break; |
| 661 | case 60: /* Haswell */ | ||
| 662 | case 69: /* Haswell-Celeron */ | ||
| 663 | rapl_cntr_mask = RAPL_IDX_HSW; | ||
| 664 | rapl_pmu_events_group.attrs = rapl_events_hsw_attr; | ||
| 665 | break; | ||
| 639 | case 45: /* Sandy Bridge-EP */ | 666 | case 45: /* Sandy Bridge-EP */ |
| 640 | case 62: /* IvyTown */ | 667 | case 62: /* IvyTown */ |
| 641 | rapl_cntr_mask = RAPL_IDX_SRV; | 668 | rapl_cntr_mask = RAPL_IDX_SRV; |
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index 1587ea392ad6..baec7d887da4 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c | |||
| @@ -50,6 +50,18 @@ static int show_warning = 1; | |||
| 50 | warning(fmt, ##__VA_ARGS__); \ | 50 | warning(fmt, ##__VA_ARGS__); \ |
| 51 | } while (0) | 51 | } while (0) |
| 52 | 52 | ||
| 53 | #define do_warning_event(event, fmt, ...) \ | ||
| 54 | do { \ | ||
| 55 | if (!show_warning) \ | ||
| 56 | continue; \ | ||
| 57 | \ | ||
| 58 | if (event) \ | ||
| 59 | warning("[%s:%s] " fmt, event->system, \ | ||
| 60 | event->name, ##__VA_ARGS__); \ | ||
| 61 | else \ | ||
| 62 | warning(fmt, ##__VA_ARGS__); \ | ||
| 63 | } while (0) | ||
| 64 | |||
| 53 | static void init_input_buf(const char *buf, unsigned long long size) | 65 | static void init_input_buf(const char *buf, unsigned long long size) |
| 54 | { | 66 | { |
| 55 | input_buf = buf; | 67 | input_buf = buf; |
| @@ -1355,7 +1367,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f | |||
| 1355 | } | 1367 | } |
| 1356 | 1368 | ||
| 1357 | if (!field->type) { | 1369 | if (!field->type) { |
| 1358 | do_warning("%s: no type found", __func__); | 1370 | do_warning_event(event, "%s: no type found", __func__); |
| 1359 | goto fail; | 1371 | goto fail; |
| 1360 | } | 1372 | } |
| 1361 | field->name = last_token; | 1373 | field->name = last_token; |
| @@ -1402,7 +1414,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f | |||
| 1402 | free_token(token); | 1414 | free_token(token); |
| 1403 | type = read_token(&token); | 1415 | type = read_token(&token); |
| 1404 | if (type == EVENT_NONE) { | 1416 | if (type == EVENT_NONE) { |
| 1405 | do_warning("failed to find token"); | 1417 | do_warning_event(event, "failed to find token"); |
| 1406 | goto fail; | 1418 | goto fail; |
| 1407 | } | 1419 | } |
| 1408 | } | 1420 | } |
| @@ -1636,7 +1648,7 @@ process_cond(struct event_format *event, struct print_arg *top, char **tok) | |||
| 1636 | right = alloc_arg(); | 1648 | right = alloc_arg(); |
| 1637 | 1649 | ||
| 1638 | if (!arg || !left || !right) { | 1650 | if (!arg || !left || !right) { |
| 1639 | do_warning("%s: not enough memory!", __func__); | 1651 | do_warning_event(event, "%s: not enough memory!", __func__); |
| 1640 | /* arg will be freed at out_free */ | 1652 | /* arg will be freed at out_free */ |
| 1641 | free_arg(left); | 1653 | free_arg(left); |
| 1642 | free_arg(right); | 1654 | free_arg(right); |
| @@ -1686,7 +1698,7 @@ process_array(struct event_format *event, struct print_arg *top, char **tok) | |||
| 1686 | 1698 | ||
| 1687 | arg = alloc_arg(); | 1699 | arg = alloc_arg(); |
| 1688 | if (!arg) { | 1700 | if (!arg) { |
| 1689 | do_warning("%s: not enough memory!", __func__); | 1701 | do_warning_event(event, "%s: not enough memory!", __func__); |
| 1690 | /* '*tok' is set to top->op.op. No need to free. */ | 1702 | /* '*tok' is set to top->op.op. No need to free. */ |
| 1691 | *tok = NULL; | 1703 | *tok = NULL; |
| 1692 | return EVENT_ERROR; | 1704 | return EVENT_ERROR; |
| @@ -1792,7 +1804,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) | |||
| 1792 | if (arg->type == PRINT_OP && !arg->op.left) { | 1804 | if (arg->type == PRINT_OP && !arg->op.left) { |
