diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-09-21 17:24:48 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-09-21 17:24:48 -0400 |
| commit | 18f5600ba2629feca202a7d6387b9c32371af329 (patch) | |
| tree | cd65b0d53bd0ad65bd02eddda51373a775d8f26d | |
| parent | 789f95b788146ec27ab068103aacd546d05db266 (diff) | |
| parent | 85f2a2ef1d0ab99523e0b947a2b723f5650ed6aa (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:
"Small perf fixlets"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
tracing: Don't call page_to_pfn() if page is NULL
perf/x86: Fix Intel Ivy Bridge support
perf/x86/ibs: Check syscall attribute flags
perf/x86: Export Sandy Bridge uncore clockticks event in sysfs
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_amd_ibs.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 24 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_ds.c | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_uncore.c | 6 | ||||
| -rw-r--r-- | include/linux/perf_event.h | 2 | ||||
| -rw-r--r-- | include/trace/events/kmem.h | 4 |
7 files changed, 61 insertions, 3 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 6605a81ba339..8b6defe7eefc 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
| @@ -586,6 +586,8 @@ extern struct event_constraint intel_westmere_pebs_event_constraints[]; | |||
| 586 | 586 | ||
| 587 | extern struct event_constraint intel_snb_pebs_event_constraints[]; | 587 | extern struct event_constraint intel_snb_pebs_event_constraints[]; |
| 588 | 588 | ||
| 589 | extern struct event_constraint intel_ivb_pebs_event_constraints[]; | ||
| 590 | |||
| 589 | struct event_constraint *intel_pebs_constraints(struct perf_event *event); | 591 | struct event_constraint *intel_pebs_constraints(struct perf_event *event); |
| 590 | 592 | ||
| 591 | void intel_pmu_pebs_enable(struct perf_event *event); | 593 | void intel_pmu_pebs_enable(struct perf_event *event); |
diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c index 7bfb5bec8630..eebd5ffe1bba 100644 --- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c +++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c | |||
| @@ -209,6 +209,15 @@ static int perf_ibs_precise_event(struct perf_event *event, u64 *config) | |||
| 209 | return -EOPNOTSUPP; | 209 | return -EOPNOTSUPP; |
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | static const struct perf_event_attr ibs_notsupp = { | ||
| 213 | .exclude_user = 1, | ||
| 214 | .exclude_kernel = 1, | ||
| 215 | .exclude_hv = 1, | ||
| 216 | .exclude_idle = 1, | ||
| 217 | .exclude_host = 1, | ||
| 218 | .exclude_guest = 1, | ||
| 219 | }; | ||
| 220 | |||
| 212 | static int perf_ibs_init(struct perf_event *event) | 221 | static int perf_ibs_init(struct perf_event *event) |
| 213 | { | 222 | { |
| 214 | struct hw_perf_event *hwc = &event->hw; | 223 | struct hw_perf_event *hwc = &event->hw; |
| @@ -229,6 +238,9 @@ static int perf_ibs_init(struct perf_event *event) | |||
| 229 | if (event->pmu != &perf_ibs->pmu) | 238 | if (event->pmu != &perf_ibs->pmu) |
| 230 | return -ENOENT; | 239 | return -ENOENT; |
| 231 | 240 | ||
| 241 | if (perf_flags(&event->attr) & perf_flags(&ibs_notsupp)) | ||
| 242 | return -EINVAL; | ||
| 243 | |||
| 232 | if (config & ~perf_ibs->config_mask) | 244 | if (config & ~perf_ibs->config_mask) |
| 233 | return -EINVAL; | 245 | return -EINVAL; |
| 234 | 246 | ||
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 0d3d63afa76a..6bca492b8547 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -2048,7 +2048,6 @@ __init int intel_pmu_init(void) | |||
| 2048 | case 42: /* SandyBridge */ | 2048 | case 42: /* SandyBridge */ |
| 2049 | case 45: /* SandyBridge, "Romely-EP" */ | 2049 | case 45: /* SandyBridge, "Romely-EP" */ |
| 2050 | x86_add_quirk(intel_sandybridge_quirk); | 2050 | x86_add_quirk(intel_sandybridge_quirk); |
| 2051 | case 58: /* IvyBridge */ | ||
| 2052 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, | 2051 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, |
| 2053 | sizeof(hw_cache_event_ids)); | 2052 | sizeof(hw_cache_event_ids)); |
| 2054 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, | 2053 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, |
| @@ -2073,6 +2072,29 @@ __init int intel_pmu_init(void) | |||
| 2073 | 2072 | ||
| 2074 | pr_cont("SandyBridge events, "); | 2073 | pr_cont("SandyBridge events, "); |
| 2075 | break; | 2074 | break; |
| 2075 | case 58: /* IvyBridge */ | ||
| 2076 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, | ||
| 2077 | sizeof(hw_cache_event_ids)); | ||
| 2078 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, | ||
| 2079 | sizeof(hw_cache_extra_regs)); | ||
| 2080 | |||
| 2081 | intel_pmu_lbr_init_snb(); | ||
| 2082 | |||
| 2083 | x86_pmu.event_constraints = intel_snb_event_constraints; | ||
| 2084 | x86_pmu.pebs_constraints = intel_ivb_pebs_event_constraints; | ||
| 2085 | x86_pmu.pebs_aliases = intel_pebs_aliases_snb; | ||
| 2086 | x86_pmu.extra_regs = intel_snb_extra_regs; | ||
| 2087 | /* all extra regs are per-cpu when HT is on */ | ||
| 2088 | x86_pmu.er_flags |= ERF_HAS_RSP_1; | ||
| 2089 | x86_pmu.er_flags |= ERF_NO_HT_SHARING; | ||
| 2090 | |||
| 2091 | /* UOPS_ISSUED.ANY,c=1,i=1 to count stall cycles */ | ||
| 2092 | intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = | ||
| 2093 | X86_CONFIG(.event=0x0e, .umask=0x01, .inv=1, .cmask=1); | ||
| 2094 | |||
| 2095 | pr_cont("IvyBridge events, "); | ||
| 2096 | break; | ||
| 2097 | |||
| 2076 | 2098 | ||
| 2077 | default: | 2099 | default: |
| 2078 | switch (x86_pmu.version) { | 2100 | switch (x86_pmu.version) { |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index e38d97bf4259..826054a4f2ee 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
| @@ -407,6 +407,20 @@ struct event_constraint intel_snb_pebs_event_constraints[] = { | |||
| 407 | EVENT_CONSTRAINT_END | 407 | EVENT_CONSTRAINT_END |
| 408 | }; | 408 | }; |
| 409 | 409 | ||
| 410 | struct event_constraint intel_ivb_pebs_event_constraints[] = { | ||
| 411 | INTEL_UEVENT_CONSTRAINT(0x01c0, 0x2), /* INST_RETIRED.PRECDIST */ | ||
| 412 | INTEL_UEVENT_CONSTRAINT(0x01c2, 0xf), /* UOPS_RETIRED.ALL */ | ||
| 413 | INTEL_UEVENT_CONSTRAINT(0x02c2, 0xf), /* UOPS_RETIRED.RETIRE_SLOTS */ | ||
| 414 | INTEL_EVENT_CONSTRAINT(0xc4, 0xf), /* BR_INST_RETIRED.* */ | ||
| 415 | INTEL_EVENT_CONSTRAINT(0xc5, 0xf), /* BR_MISP_RETIRED.* */ | ||
| 416 | INTEL_EVENT_CONSTRAINT(0xcd, 0x8), /* MEM_TRANS_RETIRED.* */ | ||
| 417 | INTEL_EVENT_CONSTRAINT(0xd0, 0xf), /* MEM_UOP_RETIRED.* */ | ||
| 418 | INTEL_EVENT_CONSTRAINT(0xd1, 0xf), /* MEM_LOAD_UOPS_RETIRED.* */ | ||
| 419 | INTEL_EVENT_CONSTRAINT(0xd2, 0xf), /* MEM_LOAD_UOPS_LLC_HIT_RETIRED.* */ | ||
| 420 | INTEL_EVENT_CONSTRAINT(0xd3, 0xf), /* MEM_LOAD_UOPS_LLC_MISS_RETIRED.* */ | ||
| 421 | EVENT_CONSTRAINT_END | ||
| 422 | }; | ||
| 423 | |||
| 410 | struct event_constraint *intel_pebs_constraints(struct perf_event *event) | 424 | struct event_constraint *intel_pebs_constraints(struct perf_event *event) |
| 411 | { | 425 | { |
| 412 | struct event_constraint *c; | 426 | struct event_constraint *c; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 0a5571080e74..38e4894165b9 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
| @@ -661,6 +661,11 @@ static void snb_uncore_msr_init_box(struct intel_uncore_box *box) | |||
| 661 | } | 661 | } |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | static struct uncore_event_desc snb_uncore_events[] = { | ||
| 665 | INTEL_UNCORE_EVENT_DESC(clockticks, "event=0xff,umask=0x00"), | ||
| 666 | { /* end: all zeroes */ }, | ||
| 667 | }; | ||
| 668 | |||
| 664 | static struct attribute *snb_uncore_formats_attr[] = { | 669 | static struct attribute *snb_uncore_formats_attr[] = { |
| 665 | &format_attr_event.attr, | 670 | &format_attr_event.attr, |
| 666 | &format_attr_umask.attr, | 671 | &format_attr_umask.attr, |
| @@ -704,6 +709,7 @@ static struct intel_uncore_type snb_uncore_cbox = { | |||
| 704 | .constraints = snb_uncore_cbox_constraints, | 709 | .constraints = snb_uncore_cbox_constraints, |
| 705 | .ops = &snb_uncore_msr_ops, | 710 | .ops = &snb_uncore_msr_ops, |
| 706 | .format_group = &snb_uncore_format_group, | 711 | .format_group = &snb_uncore_format_group, |
| 712 | .event_descs = snb_uncore_events, | ||
| 707 | }; | 713 | }; |
| 708 | 714 | ||
| 709 | static struct intel_uncore_type *snb_msr_uncores[] = { | 715 | static struct intel_uncore_type *snb_msr_uncores[] = { |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 33ed9d605f91..bdb41612bfec 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -274,6 +274,8 @@ struct perf_event_attr { | |||
| 274 | __u64 branch_sample_type; /* enum branch_sample_type */ | 274 | __u64 branch_sample_type; /* enum branch_sample_type */ |
| 275 | }; | 275 | }; |
| 276 | 276 | ||
| 277 | #define perf_flags(attr) (*(&(attr)->read_format + 1)) | ||
| 278 | |||
| 277 | /* | 279 | /* |
| 278 | * Ioctls that can be done on a perf event fd: | 280 | * Ioctls that can be done on a perf event fd: |
| 279 | */ | 281 | */ |
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index 5f889f16b0c8..08fa27244da7 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h | |||
| @@ -214,7 +214,7 @@ TRACE_EVENT(mm_page_alloc, | |||
| 214 | 214 | ||
| 215 | TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", | 215 | TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", |
| 216 | __entry->page, | 216 | __entry->page, |
| 217 | page_to_pfn(__entry->page), | 217 | __entry->page ? page_to_pfn(__entry->page) : 0, |
| 218 | __entry->order, | 218 | __entry->order, |
| 219 | __entry->migratetype, | 219 | __entry->migratetype, |
| 220 | show_gfp_flags(__entry->gfp_flags)) | 220 | show_gfp_flags(__entry->gfp_flags)) |
| @@ -240,7 +240,7 @@ DECLARE_EVENT_CLASS(mm_page, | |||
| 240 | 240 | ||
| 241 | TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", | 241 | TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", |
| 242 | __entry->page, | 242 | __entry->page, |
| 243 | page_to_pfn(__entry->page), | 243 | __entry->page ? page_to_pfn(__entry->page) : 0, |
| 244 | __entry->order, | 244 | __entry->order, |
| 245 | __entry->migratetype, | 245 | __entry->migratetype, |
| 246 | __entry->order == 0) | 246 | __entry->order == 0) |
