diff options
| -rw-r--r-- | arch/powerpc/perf/hv-24x7.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/perf/hv-gpci.c | 6 | ||||
| -rw-r--r-- | arch/s390/kernel/perf_cpum_sf.c | 6 | ||||
| -rw-r--r-- | arch/x86/Kconfig | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/Makefile | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.h | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 173 | ||||
| -rw-r--r-- | include/uapi/linux/perf_event.h | 14 | ||||
| -rw-r--r-- | kernel/events/core.c | 15 | ||||
| -rw-r--r-- | kernel/events/hw_breakpoint.c | 7 | ||||
| -rw-r--r-- | tools/perf/builtin-diff.c | 5 | ||||
| -rw-r--r-- | tools/perf/builtin-probe.c | 2 | ||||
| -rw-r--r-- | tools/perf/perf-sys.h | 30 | ||||
| -rw-r--r-- | tools/perf/util/header.c | 27 | ||||
| -rw-r--r-- | tools/perf/util/sort.c | 102 | ||||
| -rw-r--r-- | tools/perf/util/thread.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/unwind-libunwind.c | 12 | ||||
| -rw-r--r-- | tools/perf/util/unwind.h | 3 |
19 files changed, 158 insertions, 279 deletions
diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index 6c8710dd90c9..dba34088da28 100644 --- a/arch/powerpc/perf/hv-24x7.c +++ b/arch/powerpc/perf/hv-24x7.c | |||
| @@ -417,11 +417,6 @@ static int h_24x7_event_add(struct perf_event *event, int flags) | |||
| 417 | return 0; | 417 | return 0; |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | static int h_24x7_event_idx(struct perf_event *event) | ||
| 421 | { | ||
| 422 | return 0; | ||
| 423 | } | ||
| 424 | |||
| 425 | static struct pmu h_24x7_pmu = { | 420 | static struct pmu h_24x7_pmu = { |
| 426 | .task_ctx_nr = perf_invalid_context, | 421 | .task_ctx_nr = perf_invalid_context, |
| 427 | 422 | ||
| @@ -433,7 +428,6 @@ static struct pmu h_24x7_pmu = { | |||
| 433 | .start = h_24x7_event_start, | 428 | .start = h_24x7_event_start, |
| 434 | .stop = h_24x7_event_stop, | 429 | .stop = h_24x7_event_stop, |
| 435 | .read = h_24x7_event_update, | 430 | .read = h_24x7_event_update, |
| 436 | .event_idx = h_24x7_event_idx, | ||
| 437 | }; | 431 | }; |
| 438 | 432 | ||
| 439 | static int hv_24x7_init(void) | 433 | static int hv_24x7_init(void) |
diff --git a/arch/powerpc/perf/hv-gpci.c b/arch/powerpc/perf/hv-gpci.c index 15fc76c93022..a051fe946c63 100644 --- a/arch/powerpc/perf/hv-gpci.c +++ b/arch/powerpc/perf/hv-gpci.c | |||
| @@ -246,11 +246,6 @@ static int h_gpci_event_init(struct perf_event *event) | |||
| 246 | return 0; | 246 | return 0; |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | static int h_gpci_event_idx(struct perf_event *event) | ||
| 250 | { | ||
| 251 | return 0; | ||
| 252 | } | ||
| 253 | |||
| 254 | static struct pmu h_gpci_pmu = { | 249 | static struct pmu h_gpci_pmu = { |
| 255 | .task_ctx_nr = perf_invalid_context, | 250 | .task_ctx_nr = perf_invalid_context, |
| 256 | 251 | ||
| @@ -262,7 +257,6 @@ static struct pmu h_gpci_pmu = { | |||
| 262 | .start = h_gpci_event_start, | 257 | .start = h_gpci_event_start, |
| 263 | .stop = h_gpci_event_stop, | 258 | .stop = h_gpci_event_stop, |
| 264 | .read = h_gpci_event_update, | 259 | .read = h_gpci_event_update, |
| 265 | .event_idx = h_gpci_event_idx, | ||
| 266 | }; | 260 | }; |
| 267 | 261 | ||
| 268 | static int hv_gpci_init(void) | 262 | static int hv_gpci_init(void) |
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c index 08e761318c17..b878f12a9597 100644 --- a/arch/s390/kernel/perf_cpum_sf.c +++ b/arch/s390/kernel/perf_cpum_sf.c | |||
| @@ -1411,11 +1411,6 @@ static void cpumsf_pmu_del(struct perf_event *event, int flags) | |||
| 1411 | perf_pmu_enable(event->pmu); | 1411 | perf_pmu_enable(event->pmu); |
| 1412 | } | 1412 | } |
| 1413 | 1413 | ||
| 1414 | static int cpumsf_pmu_event_idx(struct perf_event *event) | ||
| 1415 | { | ||
| 1416 | return event->hw.idx; | ||
| 1417 | } | ||
| 1418 | |||
| 1419 | CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC, PERF_EVENT_CPUM_SF); | 1414 | CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC, PERF_EVENT_CPUM_SF); |
| 1420 | CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG); | 1415 | CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG); |
| 1421 | 1416 | ||
| @@ -1458,7 +1453,6 @@ static struct pmu cpumf_sampling = { | |||
| 1458 | .stop = cpumsf_pmu_stop, | 1453 | .stop = cpumsf_pmu_stop, |
| 1459 | .read = cpumsf_pmu_read, | 1454 | .read = cpumsf_pmu_read, |
| 1460 | 1455 | ||
| 1461 | .event_idx = cpumsf_pmu_event_idx, | ||
| 1462 | .attr_groups = cpumsf_pmu_attr_groups, | 1456 | .attr_groups = cpumsf_pmu_attr_groups, |
| 1463 | }; | 1457 | }; |
| 1464 | 1458 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index f2327e88e07c..ded8a6774ac9 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -142,6 +142,10 @@ config INSTRUCTION_DECODER | |||
| 142 | def_bool y | 142 | def_bool y |
| 143 | depends on KPROBES || PERF_EVENTS || UPROBES | 143 | depends on KPROBES || PERF_EVENTS || UPROBES |
| 144 | 144 | ||
| 145 | config PERF_EVENTS_INTEL_UNCORE | ||
| 146 | def_bool y | ||
| 147 | depends on PERF_EVENTS && SUP_SUP_INTEL && PCI | ||
| 148 | |||
| 145 | config OUTPUT_FORMAT | 149 | config OUTPUT_FORMAT |
| 146 | string | 150 | string |
| 147 | default "elf32-i386" if X86_32 | 151 | default "elf32-i386" if X86_32 |
diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index 01d5453b5502..e27b49d7c922 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile | |||
| @@ -39,9 +39,12 @@ obj-$(CONFIG_CPU_SUP_AMD) += perf_event_amd_iommu.o | |||
| 39 | endif | 39 | endif |
| 40 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_p6.o perf_event_knc.o perf_event_p4.o | 40 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_p6.o perf_event_knc.o perf_event_p4.o |
| 41 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_lbr.o perf_event_intel_ds.o perf_event_intel.o | 41 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_lbr.o perf_event_intel_ds.o perf_event_intel.o |
| 42 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_uncore.o perf_event_intel_uncore_snb.o | ||
| 43 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_uncore_snbep.o perf_event_intel_uncore_nhmex.o | ||
| 44 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_rapl.o | 42 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_rapl.o |
| 43 | |||
| 44 | obj-$(CONFIG_PERF_EVENTS_INTEL_UNCORE) += perf_event_intel_uncore.o \ | ||
| 45 | perf_event_intel_uncore_snb.o \ | ||
| 46 | perf_event_intel_uncore_snbep.o \ | ||
| 47 | perf_event_intel_uncore_nhmex.o | ||
| 45 | endif | 48 | endif |
| 46 | 49 | ||
| 47 | 50 | ||
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 1b8299dd3d91..143e5f5dc855 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -243,8 +243,9 @@ static bool check_hw_exists(void) | |||
| 243 | 243 | ||
| 244 | msr_fail: | 244 | msr_fail: |
| 245 | printk(KERN_CONT "Broken PMU hardware detected, using software events only.\n"); | 245 | printk(KERN_CONT "Broken PMU hardware detected, using software events only.\n"); |
| 246 | printk(boot_cpu_has(X86_FEATURE_HYPERVISOR) ? KERN_INFO : KERN_ERR | 246 | printk("%sFailed to access perfctr msr (MSR %x is %Lx)\n", |
| 247 | "Failed to access perfctr msr (MSR %x is %Lx)\n", reg, val_new); | 247 | boot_cpu_has(X86_FEATURE_HYPERVISOR) ? KERN_INFO : KERN_ERR, |
| 248 | reg, val_new); | ||
| 248 | 249 | ||
| 249 | return false; | 250 | return false; |
| 250 | } | 251 | } |
| @@ -444,12 +445,6 @@ int x86_pmu_hw_config(struct perf_event *event) | |||
| 444 | if (event->attr.type == PERF_TYPE_RAW) | 445 | if (event->attr.type == PERF_TYPE_RAW) |
| 445 | event->hw.config |= event->attr.config & X86_RAW_EVENT_MASK; | 446 | event->hw.config |= event->attr.config & X86_RAW_EVENT_MASK; |
| 446 | 447 | ||
| 447 | if (event->attr.sample_period && x86_pmu.limit_period) { | ||
| 448 | if (x86_pmu.limit_period(event, event->attr.sample_period) > | ||
| 449 | event->attr.sample_period) | ||
| 450 | return -EINVAL; | ||
| 451 | } | ||
| 452 | |||
| 453 | return x86_setup_perfctr(event); | 448 | return x86_setup_perfctr(event); |
| 454 | } | 449 | } |
| 455 | 450 | ||
| @@ -987,9 +982,6 @@ int x86_perf_event_set_period(struct perf_event *event) | |||
| 987 | if (left > x86_pmu.max_period) | 982 | if (left > x86_pmu.max_period) |
| 988 | left = x86_pmu.max_period; | 983 | left = x86_pmu.max_period; |
| 989 | 984 | ||
| 990 | if (x86_pmu.limit_period) | ||
| 991 | left = x86_pmu.limit_period(event, left); | ||
| 992 | |||
| 993 | per_cpu(pmc_prev_left[idx], smp_processor_id()) = left; | 985 | per_cpu(pmc_prev_left[idx], smp_processor_id()) = left; |
| 994 | 986 | ||
| 995 | /* | 987 | /* |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index d98a34d435d7..fc5eb390b368 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
| @@ -445,7 +445,6 @@ struct x86_pmu { | |||
| 445 | struct x86_pmu_quirk *quirks; | 445 | struct x86_pmu_quirk *quirks; |
| 446 | int perfctr_second_write; | 446 | int perfctr_second_write; |
| 447 | bool late_ack; | 447 | bool late_ack; |
| 448 | unsigned (*limit_period)(struct perf_event *event, unsigned l); | ||
| 449 | 448 | ||
| 450 | /* | ||
