|
|
@@ -210,15 +210,22 @@ static int amd_uncore_event_init(struct perf_event *event)
|
|
|
hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB;
|
|
|
hwc->idx = -1;
|
|
|
|
|
|
+ if (event->cpu < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
/*
|
|
|
* SliceMask and ThreadMask need to be set for certain L3 events in
|
|
|
* Family 17h. For other events, the two fields do not affect the count.
|
|
|
*/
|
|
|
- if (l3_mask && is_llc_event(event))
|
|
|
- hwc->config |= (AMD64_L3_SLICE_MASK | AMD64_L3_THREAD_MASK);
|
|
|
+ if (l3_mask && is_llc_event(event)) {
|
|
|
+ int thread = 2 * (cpu_data(event->cpu).cpu_core_id % 4);
|
|
|
|
|
|
- if (event->cpu < 0)
|
|
|
- return -EINVAL;
|
|
|
+ if (smp_num_siblings > 1)
|
|
|
+ thread += cpu_data(event->cpu).apicid & 1;
|
|
|
+
|
|
|
+ hwc->config |= (1ULL << (AMD64_L3_THREAD_SHIFT + thread) &
|
|
|
+ AMD64_L3_THREAD_MASK) | AMD64_L3_SLICE_MASK;
|
|
|
+ }
|
|
|
|
|
|
uncore = event_to_amd_uncore(event);
|
|
|
if (!uncore)
|