···147147 /*148148 * AMD specific bits149149 */150150- struct amd_nb *amd_nb;150150+ struct amd_nb *amd_nb;151151+ /* Inverted mask of bits to clear in the perf_ctr ctrl registers */152152+ u64 perf_ctr_virt_mask;151153152154 void *kfree_on_online;153155};···419417static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc,420418 u64 enable_mask)421419{420420+ u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);421421+422422 if (hwc->extra_reg.reg)423423 wrmsrl(hwc->extra_reg.reg, hwc->extra_reg.config);424424- wrmsrl(hwc->config_base, hwc->config | enable_mask);424424+ wrmsrl(hwc->config_base, (hwc->config | enable_mask) & ~disable_mask);425425}426426427427void x86_pmu_enable_all(int added);
+35-2
arch/x86/kernel/cpu/perf_event_amd.c
···11#include <linux/perf_event.h>22+#include <linux/export.h>23#include <linux/types.h>34#include <linux/init.h>45#include <linux/slab.h>···358357 struct amd_nb *nb;359358 int i, nb_id;360359361361- if (boot_cpu_data.x86_max_cores < 2)360360+ cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY;361361+362362+ if (boot_cpu_data.x86_max_cores < 2 || boot_cpu_data.x86 == 0x15)362363 return;363364364365 nb_id = amd_get_nb_id(cpu);···590587 .put_event_constraints = amd_put_event_constraints,591588592589 .cpu_prepare = amd_pmu_cpu_prepare,593593- .cpu_starting = amd_pmu_cpu_starting,594590 .cpu_dead = amd_pmu_cpu_dead,595591#endif592592+ .cpu_starting = amd_pmu_cpu_starting,596593};597594598595__init int amd_pmu_init(void)···624621625622 return 0;626623}624624+625625+void amd_pmu_enable_virt(void)626626+{627627+ struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);628628+629629+ cpuc->perf_ctr_virt_mask = 0;630630+631631+ /* Reload all events */632632+ x86_pmu_disable_all();633633+ x86_pmu_enable_all(0);634634+}635635+EXPORT_SYMBOL_GPL(amd_pmu_enable_virt);636636+637637+void amd_pmu_disable_virt(void)638638+{639639+ struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);640640+641641+ /*642642+ * We only mask out the Host-only bit so that host-only counting works643643+ * when SVM is disabled. If someone sets up a guest-only counter when644644+ * SVM is disabled the Guest-only bits still gets set and the counter645645+ * will not count anything.646646+ */647647+ cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY;648648+649649+ /* Reload all events */650650+ x86_pmu_disable_all();651651+ x86_pmu_enable_all(0);652652+}653653+EXPORT_SYMBOL_GPL(amd_pmu_disable_virt);