diff options
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 124 |
1 files changed, 117 insertions, 7 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index cf10839f20ea..3fac0bfc2dee 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -244,18 +244,26 @@ static struct event_constraint intel_core_event_constraints[] = | |||
| 244 | 244 | ||
| 245 | static struct event_constraint intel_nehalem_event_constraints[] = | 245 | static struct event_constraint intel_nehalem_event_constraints[] = |
| 246 | { | 246 | { |
| 247 | FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 247 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ |
| 248 | FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 248 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ |
| 249 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ | 249 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ |
| 250 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ | 250 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ |
| 251 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ | 251 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ |
| 252 | INTEL_EVENT_CONSTRAINT(0x43, 0x3), /* L1D_ALL_REF */ | 252 | INTEL_EVENT_CONSTRAINT(0x43, 0x3), /* L1D_ALL_REF */ |
| 253 | INTEL_EVENT_CONSTRAINT(0x48, 0x3), /* L1D_PEND_MISS */ | ||
| 253 | INTEL_EVENT_CONSTRAINT(0x4e, 0x3), /* L1D_PREFETCH */ | 254 | INTEL_EVENT_CONSTRAINT(0x4e, 0x3), /* L1D_PREFETCH */ |
| 254 | INTEL_EVENT_CONSTRAINT(0x4c, 0x3), /* LOAD_HIT_PRE */ | ||
| 255 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | 255 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ |
| 256 | INTEL_EVENT_CONSTRAINT(0x52, 0x3), /* L1D_CACHE_PREFETCH_LOCK_FB_HIT */ | 256 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ |
| 257 | INTEL_EVENT_CONSTRAINT(0x53, 0x3), /* L1D_CACHE_LOCK_FB_HIT */ | 257 | EVENT_CONSTRAINT_END |
| 258 | INTEL_EVENT_CONSTRAINT(0xc5, 0x3), /* CACHE_LOCK_CYCLES */ | 258 | }; |
| 259 | |||
| 260 | static struct event_constraint intel_westmere_event_constraints[] = | ||
| 261 | { | ||
| 262 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | ||
| 263 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | ||
| 264 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | ||
| 265 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ | ||
| 266 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ | ||
| 259 | EVENT_CONSTRAINT_END | 267 | EVENT_CONSTRAINT_END |
| 260 | }; | 268 | }; |
| 261 | 269 | ||
| @@ -286,6 +294,97 @@ static u64 __read_mostly hw_cache_event_ids | |||
| 286 | [PERF_COUNT_HW_CACHE_OP_MAX] | 294 | [PERF_COUNT_HW_CACHE_OP_MAX] |
| 287 | [PERF_COUNT_HW_CACHE_RESULT_MAX]; | 295 | [PERF_COUNT_HW_CACHE_RESULT_MAX]; |
| 288 | 296 | ||
| 297 | static __initconst u64 westmere_hw_cache_event_ids | ||
| 298 | [PERF_COUNT_HW_CACHE_MAX] | ||
| 299 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
| 300 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | ||
| 301 | { | ||
| 302 | [ C(L1D) ] = { | ||
| 303 | [ C(OP_READ) ] = { | ||
| 304 | [ C(RESULT_ACCESS) ] = 0x010b, /* MEM_INST_RETIRED.LOADS */ | ||
| 305 | [ C(RESULT_MISS) ] = 0x0151, /* L1D.REPL */ | ||
| 306 | }, | ||
| 307 | [ C(OP_WRITE) ] = { | ||
| 308 | [ C(RESULT_ACCESS) ] = 0x020b, /* MEM_INST_RETURED.STORES */ | ||
| 309 | [ C(RESULT_MISS) ] = 0x0251, /* L1D.M_REPL */ | ||
| 310 | }, | ||
| 311 | [ C(OP_PREFETCH) ] = { | ||
| 312 | [ C(RESULT_ACCESS) ] = 0x014e, /* L1D_PREFETCH.REQUESTS */ | ||
| 313 | [ C(RESULT_MISS) ] = 0x024e, /* L1D_PREFETCH.MISS */ | ||
| 314 | }, | ||
| 315 | }, | ||
| 316 | [ C(L1I ) ] = { | ||
| 317 | [ C(OP_READ) ] = { | ||
| 318 | [ C(RESULT_ACCESS) ] = 0x0380, /* L1I.READS */ | ||
| 319 | [ C(RESULT_MISS) ] = 0x0280, /* L1I.MISSES */ | ||
| 320 | }, | ||
| 321 | [ C(OP_WRITE) ] = { | ||
| 322 | [ C(RESULT_ACCESS) ] = -1, | ||
| 323 | [ C(RESULT_MISS) ] = -1, | ||
| 324 | }, | ||
| 325 | [ C(OP_PREFETCH) ] = { | ||
| 326 | [ C(RESULT_ACCESS) ] = 0x0, | ||
| 327 | [ C(RESULT_MISS) ] = 0x0, | ||
| 328 | }, | ||
| 329 | }, | ||
| 330 | [ C(LL ) ] = { | ||
| 331 | [ C(OP_READ) ] = { | ||
| 332 | [ C(RESULT_ACCESS) ] = 0x0324, /* L2_RQSTS.LOADS */ | ||
| 333 | [ C(RESULT_MISS) ] = 0x0224, /* L2_RQSTS.LD_MISS */ | ||
| 334 | }, | ||
| 335 | [ C(OP_WRITE) ] = { | ||
| 336 | [ C(RESULT_ACCESS) ] = 0x0c24, /* L2_RQSTS.RFOS */ | ||
| 337 | [ C(RESULT_MISS) ] = 0x0824, /* L2_RQSTS.RFO_MISS */ | ||
| 338 | }, | ||
| 339 | [ C(OP_PREFETCH) ] = { | ||
| 340 | [ C(RESULT_ACCESS) ] = 0x4f2e, /* LLC Reference */ | ||
| 341 | [ C(RESULT_MISS) ] = 0x412e, /* LLC Misses */ | ||
| 342 | }, | ||
| 343 | }, | ||
| 344 | [ C(DTLB) ] = { | ||
| 345 | [ C(OP_READ) ] = { | ||
| 346 | [ C(RESULT_ACCESS) ] = 0x010b, /* MEM_INST_RETIRED.LOADS */ | ||
| 347 | [ C(RESULT_MISS) ] = 0x0108, /* DTLB_LOAD_MISSES.ANY */ | ||
| 348 | }, | ||
| 349 | [ C(OP_WRITE) ] = { | ||
| 350 | [ C(RESULT_ACCESS) ] = 0x020b, /* MEM_INST_RETURED.STORES */ | ||
| 351 | [ C(RESULT_MISS) ] = 0x010c, /* MEM_STORE_RETIRED.DTLB_MISS */ | ||
| 352 | }, | ||
| 353 | [ C(OP_PREFETCH) ] = { | ||
| 354 | [ C(RESULT_ACCESS) ] = 0x0, | ||
| 355 | [ C(RESULT_MISS) ] = 0x0, | ||
| 356 | }, | ||
| 357 | }, | ||
| 358 | [ C(ITLB) ] = { | ||
| 359 | [ C(OP_READ) ] = { | ||
| 360 | [ C(RESULT_ACCESS) ] = 0x01c0, /* INST_RETIRED.ANY_P */ | ||
| 361 | [ C(RESULT_MISS) ] = 0x0185, /* ITLB_MISSES.ANY */ | ||
| 362 | }, | ||
| 363 | [ C(OP_WRITE) ] = { | ||
| 364 | [ C(RESULT_ACCESS) ] = -1, | ||
| 365 | [ C(RESULT_MISS) ] = -1, | ||
| 366 | }, | ||
| 367 | [ C(OP_PREFETCH) ] = { | ||
| 368 | [ C(RESULT_ACCESS) ] = -1, | ||
| 369 | [ C(RESULT_MISS) ] = -1, | ||
| 370 | }, | ||
| 371 | }, | ||
| 372 | [ C(BPU ) ] = { | ||
| 373 | [ C(OP_READ) ] = { | ||
| 374 | [ C(RESULT_ACCESS) ] = 0x00c4, /* BR_INST_RETIRED.ALL_BRANCHES */ | ||
| 375 | [ C(RESULT_MISS) ] = 0x03e8, /* BPU_CLEARS.ANY */ | ||
| 376 | }, | ||
| 377 | [ C(OP_WRITE) ] = { | ||
| 378 | [ C(RESULT_ACCESS) ] = -1, | ||
| 379 | [ C(RESULT_MISS) ] = -1, | ||
| 380 | }, | ||
| 381 | [ C(OP_PREFETCH) ] = { | ||
| 382 | [ C(RESULT_ACCESS) ] = -1, | ||
| 383 | [ C(RESULT_MISS) ] = -1, | ||
| 384 | }, | ||
| 385 | }, | ||
| 386 | }; | ||
| 387 | |||
| 289 | static __initconst u64 nehalem_hw_cache_event_ids | 388 | static __initconst u64 nehalem_hw_cache_event_ids |
| 290 | [PERF_COUNT_HW_CACHE_MAX] | 389 | [PERF_COUNT_HW_CACHE_MAX] |
| 291 | [PERF_COUNT_HW_CACHE_OP_MAX] | 390 | [PERF_COUNT_HW_CACHE_OP_MAX] |
| @@ -2423,7 +2522,9 @@ static __init int intel_pmu_init(void) | |||
| 2423 | x86_pmu.event_constraints = intel_core_event_constraints; | 2522 | x86_pmu.event_constraints = intel_core_event_constraints; |
| 2424 | pr_cont("Core2 events, "); | 2523 | pr_cont("Core2 events, "); |
| 2425 | break; | 2524 | break; |
| 2426 | case 26: | 2525 | |
| 2526 | case 26: /* 45 nm nehalem, "Bloomfield" */ | ||
| 2527 | case 30: /* 45 nm nehalem, "Lynnfield" */ | ||
| 2427 | memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids, | 2528 | memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids, |
| 2428 | sizeof(hw_cache_event_ids)); | 2529 | sizeof(hw_cache_event_ids)); |
| 2429 | 2530 | ||
| @@ -2437,6 +2538,15 @@ static __init int intel_pmu_init(void) | |||
| 2437 | x86_pmu.event_constraints = intel_gen_event_constraints; | 2538 | x86_pmu.event_constraints = intel_gen_event_constraints; |
| 2438 | pr_cont("Atom events, "); | 2539 | pr_cont("Atom events, "); |
| 2439 | break; | 2540 | break; |
| 2541 | |||
| 2542 | case 37: /* 32 nm nehalem, "Clarkdale" */ | ||
| 2543 | case 44: /* 32 nm nehalem, "Gulftown" */ | ||
| 2544 | memcpy(hw_cache_event_ids, westmere_hw_cache_event_ids, | ||
| 2545 | sizeof(hw_cache_event_ids)); | ||
| 2546 | |||
| 2547 | x86_pmu.event_constraints = intel_westmere_event_constraints; | ||
| 2548 | pr_cont("Westmere events, "); | ||
| 2549 | break; | ||
| 2440 | default: | 2550 | default: |
| 2441 | /* | 2551 | /* |
| 2442 | * default constraints for v2 and up | 2552 | * default constraints for v2 and up |
