Re: [PATCH 0/5] KVM: x86/pmu: Hide guest counter updates from the VMRUN instruction

From: Sandipan Das
Date: Mon Mar 13 2023 - 06:57:29 EST


+CC: Santosh, Tom, Ananth

Hi Like,

On 3/10/2023 4:23 PM, Like Xu wrote:
> Considering that developers are more likely to have access to AMD VMs
> and use vPMU inside guest, there's a dark cloud that needs to rain.
> The x86_64/pmu_event_filter_test always fails on Zen3 boxes:
>
> test_amd_deny_list: Branch instructions retired = 43 (expected 42)
> test_without_filter: Branch instructions retired = 43 (expected 42)
> test_member_allow_list: Branch instructions retired = 43 (expected 42)
> test_not_member_deny_list: Branch instructions retired = 43 (expected 42)
>
> ,which is not caused by the event_filter feature (otherwise it's zero).
>
> After some dubious guessing and microtesting on Zen3+ pmu hardware,
> we found that VMRUN or one of the instructions in __svm_vcpu_run()
> causes a guest-only enabled counter for counting guest instruction (in the
> pmu_event_filter case, the branch instruction) to always increase by one
> right after each vm_entry.
>
> This creates an inconsistency with the AMD64_EVENTSEL_GUESTONLY,
> where the vPMU user in the VM does not expect to see any counter
> changes due to the SVM transaction at all. This patch set provides a low
> overhead software fix until HW change arrives or simply no fix planned.
>

Yes, VMRUNs do get counted as retired branches in the guest context. My
understanding is that this behaviour applies to all generations of Zen
and even some older ones too, not just Zen 3 and later. I also do not
expect this to change in the near future.

- Sandipan