diff options
| -rw-r--r-- | arch/x86/include/asm/perf_event.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 31 |
3 files changed, 40 insertions, 18 deletions
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 80e693684f18..db6109a885a7 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | INTEL_ARCH_INV_MASK| \ | 50 | INTEL_ARCH_INV_MASK| \ |
| 51 | INTEL_ARCH_EDGE_MASK|\ | 51 | INTEL_ARCH_EDGE_MASK|\ |
| 52 | INTEL_ARCH_UNIT_MASK|\ | 52 | INTEL_ARCH_UNIT_MASK|\ |
| 53 | INTEL_ARCH_EVTSEL_MASK) | 53 | INTEL_ARCH_EVENT_MASK) |
| 54 | 54 | ||
| 55 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c | 55 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c |
| 56 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) | 56 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index aab2e1ce9dee..bfc43fa208bc 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -73,10 +73,10 @@ struct debug_store { | |||
| 73 | struct event_constraint { | 73 | struct event_constraint { |
| 74 | union { | 74 | union { |
| 75 | unsigned long idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; | 75 | unsigned long idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; |
| 76 | u64 idxmsk64[1]; | 76 | u64 idxmsk64; |
| 77 | }; | 77 | }; |
| 78 | int code; | 78 | u64 code; |
| 79 | int cmask; | 79 | u64 cmask; |
| 80 | int weight; | 80 | int weight; |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| @@ -103,7 +103,7 @@ struct cpu_hw_events { | |||
| 103 | }; | 103 | }; |
| 104 | 104 | ||
| 105 | #define __EVENT_CONSTRAINT(c, n, m, w) {\ | 105 | #define __EVENT_CONSTRAINT(c, n, m, w) {\ |
| 106 | { .idxmsk64[0] = (n) }, \ | 106 | { .idxmsk64 = (n) }, \ |
| 107 | .code = (c), \ | 107 | .code = (c), \ |
| 108 | .cmask = (m), \ | 108 | .cmask = (m), \ |
| 109 | .weight = (w), \ | 109 | .weight = (w), \ |
| @@ -116,7 +116,7 @@ struct cpu_hw_events { | |||
| 116 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVTSEL_MASK) | 116 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVTSEL_MASK) |
| 117 | 117 | ||
| 118 | #define FIXED_EVENT_CONSTRAINT(c, n) \ | 118 | #define FIXED_EVENT_CONSTRAINT(c, n) \ |
| 119 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_FIXED_MASK) | 119 | EVENT_CONSTRAINT(c, (1ULL << (32+n)), INTEL_ARCH_FIXED_MASK) |
| 120 | 120 | ||
| 121 | #define EVENT_CONSTRAINT_END \ | 121 | #define EVENT_CONSTRAINT_END \ |
| 122 | EVENT_CONSTRAINT(0, 0, 0) | 122 | EVENT_CONSTRAINT(0, 0, 0) |
| @@ -615,8 +615,8 @@ static int x86_schedule_events(struct cpu_hw_events *cpuc, int n, int *assign) | |||
| 615 | bitmap_zero(used_mask, X86_PMC_IDX_MAX); | 615 | bitmap_zero(used_mask, X86_PMC_IDX_MAX); |
| 616 | 616 | ||
| 617 | for (i = 0; i < n; i++) { | 617 | for (i = 0; i < n; i++) { |
| 618 | constraints[i] = | 618 | c = x86_pmu.get_event_constraints(cpuc, cpuc->event_list[i]); |
| 619 | x86_pmu.get_event_constraints(cpuc, cpuc->event_list[i]); | 619 | constraints[i] = c; |
| 620 | } | 620 | } |
| 621 | 621 | ||
| 622 | /* | 622 | /* |
| @@ -1350,6 +1350,7 @@ static void __init pmu_check_apic(void) | |||
| 1350 | 1350 | ||
| 1351 | void __init init_hw_perf_events(void) | 1351 | void __init init_hw_perf_events(void) |
| 1352 | { | 1352 | { |
| 1353 | struct event_constraint *c; | ||
| 1353 | int err; | 1354 | int err; |
| 1354 | 1355 | ||
| 1355 | pr_info("Performance Events: "); | 1356 | pr_info("Performance Events: "); |
| @@ -1398,6 +1399,16 @@ void __init init_hw_perf_events(void) | |||
| 1398 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_events) - 1, | 1399 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_events) - 1, |
| 1399 | 0, x86_pmu.num_events); | 1400 | 0, x86_pmu.num_events); |
| 1400 | 1401 | ||
| 1402 | if (x86_pmu.event_constraints) { | ||
| 1403 | for_each_event_constraint(c, x86_pmu.event_constraints) { | ||
| 1404 | if (c->cmask != INTEL_ARCH_FIXED_MASK) | ||
| 1405 | continue; | ||
| 1406 | |||
| 1407 | c->idxmsk64 |= (1ULL << x86_pmu.num_events) - 1; | ||
| 1408 | c->weight += x86_pmu.num_events; | ||
| 1409 | } | ||
| 1410 | } | ||
| 1411 | |||
| 1401 | pr_info("... version: %d\n", x86_pmu.version); | 1412 | pr_info("... version: %d\n", x86_pmu.version); |
| 1402 | pr_info("... bit width: %d\n", x86_pmu.event_bits); | 1413 | pr_info("... bit width: %d\n", x86_pmu.event_bits); |
| 1403 | pr_info("... generic registers: %d\n", x86_pmu.num_events); | 1414 | pr_info("... generic registers: %d\n", x86_pmu.num_events); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index cf6590cf4a5f..4fbdfe5708d9 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifdef CONFIG_CPU_SUP_INTEL | 1 | #ifdef CONFIG_CPU_SUP_INTEL |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Intel PerfMon v3. Used on Core2 and later. | 4 | * Intel PerfMon, used on Core and later. |
| 5 | */ | 5 | */ |
| 6 | static const u64 intel_perfmon_event_map[] = | 6 | static const u64 intel_perfmon_event_map[] = |
| 7 | { | 7 | { |
| @@ -27,8 +27,14 @@ static struct event_constraint intel_core_event_constraints[] = | |||
| 27 | 27 | ||
| 28 | static struct event_constraint intel_core2_event_constraints[] = | 28 | static struct event_constraint intel_core2_event_constraints[] = |
| 29 | { | 29 | { |
| 30 | FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 30 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 31 | FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 31 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 32 | /* | ||
| 33 | * Core2 has Fixed Counter 2 listed as CPU_CLK_UNHALTED.REF and event | ||
| 34 | * 0x013c as CPU_CLK_UNHALTED.BUS and specifies there is a fixed | ||
| 35 | * ratio between these counters. | ||
| 36 | */ | ||
| 37 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 32 | INTEL_EVENT_CONSTRAINT(0x10, 0x1), /* FP_COMP_OPS_EXE */ | 38 | INTEL_EVENT_CONSTRAINT(0x10, 0x1), /* FP_COMP_OPS_EXE */ |
| 33 | INTEL_EVENT_CONSTRAINT(0x11, 0x2), /* FP_ASSIST */ | 39 | INTEL_EVENT_CONSTRAINT(0x11, 0x2), /* FP_ASSIST */ |
| 34 | INTEL_EVENT_CONSTRAINT(0x12, 0x2), /* MUL */ | 40 | INTEL_EVENT_CONSTRAINT(0x12, 0x2), /* MUL */ |
| @@ -37,14 +43,16 @@ static struct event_constraint intel_core2_event_constraints[] = | |||
| 37 | INTEL_EVENT_CONSTRAINT(0x18, 0x1), /* IDLE_DURING_DIV */ | 43 | INTEL_EVENT_CONSTRAINT(0x18, 0x1), /* IDLE_DURING_DIV */ |
| 38 | INTEL_EVENT_CONSTRAINT(0x19, 0x2), /* DELAYED_BYPASS */ | 44 | INTEL_EVENT_CONSTRAINT(0x19, 0x2), /* DELAYED_BYPASS */ |
| 39 | INTEL_EVENT_CONSTRAINT(0xa1, 0x1), /* RS_UOPS_DISPATCH_CYCLES */ | 45 | INTEL_EVENT_CONSTRAINT(0xa1, 0x1), /* RS_UOPS_DISPATCH_CYCLES */ |
| 46 | INTEL_EVENT_CONSTRAINT(0xc9, 0x1), /* ITLB_MISS_RETIRED (T30-9) */ | ||
| 40 | INTEL_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED */ | 47 | INTEL_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED */ |
| 41 | EVENT_CONSTRAINT_END | 48 | EVENT_CONSTRAINT_END |
| 42 | }; | 49 | }; |
| 43 | 50 | ||
| 44 | static struct event_constraint intel_nehalem_event_constraints[] = | 51 | static struct event_constraint intel_nehalem_event_constraints[] = |
| 45 | { | 52 | { |
| 46 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 53 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 47 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 54 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 55 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 48 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ | 56 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ |
| 49 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ | 57 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ |
| 50 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ | 58 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ |
| @@ -58,8 +66,9 @@ static struct event_constraint intel_nehalem_event_constraints[] = | |||
| 58 | 66 | ||
| 59 | static struct event_constraint intel_westmere_event_constraints[] = | 67 | static struct event_constraint intel_westmere_event_constraints[] = |
| 60 | { | 68 | { |
| 61 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 69 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 62 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 70 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 71 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 63 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | 72 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ |
| 64 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ | 73 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ |
| 65 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ | 74 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ |
| @@ -68,8 +77,9 @@ static struct event_constraint intel_westmere_event_constraints[] = | |||
| 68 | 77 | ||
| 69 | static struct event_constraint intel_gen_event_constraints[] = | 78 | static struct event_constraint intel_gen_event_constraints[] = |
| 70 | { | 79 | { |
| 71 | FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 80 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 72 | FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 81 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 82 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 73 | EVENT_CONSTRAINT_END | 83 | EVENT_CONSTRAINT_END |
| 74 | }; | 84 | }; |
| 75 | 85 | ||
| @@ -935,7 +945,7 @@ static __init int intel_pmu_init(void) | |||
| 935 | x86_pmu.event_constraints = intel_nehalem_event_constraints; | 945 | x86_pmu.event_constraints = intel_nehalem_event_constraints; |
| 936 | pr_cont("Nehalem/Corei7 events, "); | 946 | pr_cont("Nehalem/Corei7 events, "); |
| 937 | break; | 947 | break; |
| 938 | case 28: | 948 | case 28: /* Atom */ |
| 939 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, | 949 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, |
| 940 | sizeof(hw_cache_event_ids)); | 950 | sizeof(hw_cache_event_ids)); |
| 941 | 951 | ||
| @@ -951,6 +961,7 @@ static __init int intel_pmu_init(void) | |||
| 951 | x86_pmu.event_constraints = intel_westmere_event_constraints; | 961 | x86_pmu.event_constraints = intel_westmere_event_constraints; |
| 952 | pr_cont("Westmere events, "); | 962 | pr_cont("Westmere events, "); |
| 953 | break; | 963 | break; |
| 964 | |||
| 954 | default: | 965 | default: |
| 955 | /* | 966 | /* |
| 956 | * default constraints for v2 and up | 967 | * default constraints for v2 and up |
