|
|
@@ -2533,34 +2533,6 @@ ssize_t intel_event_sysfs_show(char *page, u64 config)
|
|
|
return x86_event_sysfs_show(page, config, event);
|
|
|
}
|
|
|
|
|
|
-static __initconst const struct x86_pmu core_pmu = {
|
|
|
- .name = "core",
|
|
|
- .handle_irq = x86_pmu_handle_irq,
|
|
|
- .disable_all = x86_pmu_disable_all,
|
|
|
- .enable_all = core_pmu_enable_all,
|
|
|
- .enable = core_pmu_enable_event,
|
|
|
- .disable = x86_pmu_disable_event,
|
|
|
- .hw_config = x86_pmu_hw_config,
|
|
|
- .schedule_events = x86_schedule_events,
|
|
|
- .eventsel = MSR_ARCH_PERFMON_EVENTSEL0,
|
|
|
- .perfctr = MSR_ARCH_PERFMON_PERFCTR0,
|
|
|
- .event_map = intel_pmu_event_map,
|
|
|
- .max_events = ARRAY_SIZE(intel_perfmon_event_map),
|
|
|
- .apic = 1,
|
|
|
- /*
|
|
|
- * Intel PMCs cannot be accessed sanely above 32 bit width,
|
|
|
- * so we install an artificial 1<<31 period regardless of
|
|
|
- * the generic event period:
|
|
|
- */
|
|
|
- .max_period = (1ULL << 31) - 1,
|
|
|
- .get_event_constraints = intel_get_event_constraints,
|
|
|
- .put_event_constraints = intel_put_event_constraints,
|
|
|
- .event_constraints = intel_core_event_constraints,
|
|
|
- .guest_get_msrs = core_guest_get_msrs,
|
|
|
- .format_attrs = intel_arch_formats_attr,
|
|
|
- .events_sysfs_show = intel_event_sysfs_show,
|
|
|
-};
|
|
|
-
|
|
|
struct intel_shared_regs *allocate_shared_regs(int cpu)
|
|
|
{
|
|
|
struct intel_shared_regs *regs;
|
|
|
@@ -2743,6 +2715,44 @@ static struct attribute *intel_arch3_formats_attr[] = {
|
|
|
NULL,
|
|
|
};
|
|
|
|
|
|
+static __initconst const struct x86_pmu core_pmu = {
|
|
|
+ .name = "core",
|
|
|
+ .handle_irq = x86_pmu_handle_irq,
|
|
|
+ .disable_all = x86_pmu_disable_all,
|
|
|
+ .enable_all = core_pmu_enable_all,
|
|
|
+ .enable = core_pmu_enable_event,
|
|
|
+ .disable = x86_pmu_disable_event,
|
|
|
+ .hw_config = x86_pmu_hw_config,
|
|
|
+ .schedule_events = x86_schedule_events,
|
|
|
+ .eventsel = MSR_ARCH_PERFMON_EVENTSEL0,
|
|
|
+ .perfctr = MSR_ARCH_PERFMON_PERFCTR0,
|
|
|
+ .event_map = intel_pmu_event_map,
|
|
|
+ .max_events = ARRAY_SIZE(intel_perfmon_event_map),
|
|
|
+ .apic = 1,
|
|
|
+ /*
|
|
|
+ * Intel PMCs cannot be accessed sanely above 32-bit width,
|
|
|
+ * so we install an artificial 1<<31 period regardless of
|
|
|
+ * the generic event period:
|
|
|
+ */
|
|
|
+ .max_period = (1ULL<<31) - 1,
|
|
|
+ .get_event_constraints = intel_get_event_constraints,
|
|
|
+ .put_event_constraints = intel_put_event_constraints,
|
|
|
+ .event_constraints = intel_core_event_constraints,
|
|
|
+ .guest_get_msrs = core_guest_get_msrs,
|
|
|
+ .format_attrs = intel_arch_formats_attr,
|
|
|
+ .events_sysfs_show = intel_event_sysfs_show,
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Virtual (or funny metal) CPU can define x86_pmu.extra_regs
|
|
|
+ * together with PMU version 1 and thus be using core_pmu with
|
|
|
+ * shared_regs. We need following callbacks here to allocate
|
|
|
+ * it properly.
|
|
|
+ */
|
|
|
+ .cpu_prepare = intel_pmu_cpu_prepare,
|
|
|
+ .cpu_starting = intel_pmu_cpu_starting,
|
|
|
+ .cpu_dying = intel_pmu_cpu_dying,
|
|
|
+};
|
|
|
+
|
|
|
static __initconst const struct x86_pmu intel_pmu = {
|
|
|
.name = "Intel",
|
|
|
.handle_irq = intel_pmu_handle_irq,
|