• Alexandru Elisei's avatar
    KVM: arm64: Add KVM_ARM_VCPU_PMU_V3_SET_PMU attribute · 6ee7fca2
    Alexandru Elisei authored
    When KVM creates an event and there are more than one PMUs present on the
    system, perf_init_event() will go through the list of available PMUs and
    will choose the first one that can create the event. The order of the PMUs
    in this list depends on the probe order, which can change under various
    circumstances, for example if the order of the PMU nodes change in the DTB
    or if asynchronous driver probing is enabled on the kernel command line
    (with the driver_async_probe=armv8-pmu option).
    
    Another consequence of this approach is that on heteregeneous systems all
    virtual machines that KVM creates will use the same PMU. This might cause
    unexpected behaviour for userspace: when a VCPU is executing on the
    physical CPU that uses this default PMU, PMU events in the guest work
    correctly; but when the same VCPU executes on another CPU, PMU events in
    the guest will suddenly stop counting.
    
    Fortunately, perf core allows user to specify on which PMU to create an
    event by using the perf_event_attr->type field, which is used by
    perf_init_event() as an index in the radix tree of available PMUs.
    
    Add the KVM_ARM_VCPU_PMU_V3_CTRL(KVM_ARM_VCPU_PMU_V3_SET_PMU) VCPU
    attribute to allow userspace to specify the arm_pmu that KVM will use when
    creating events for that VCPU. KVM will make no attempt to run the VCPU on
    the physical CPUs that share the PMU, leaving it up to userspace to manage
    the VCPU threads' affinity accordingly.
    
    To ensure that KVM doesn't expose an asymmetric system to the guest, the
    PMU set for one VCPU will be used by all other VCPUs. Once a VCPU has run,
    the PMU cannot be changed in order to avoid changing the list of available
    events for a VCPU, or to change the semantics of existing events.
    Signed-off-by: default avatarAlexandru Elisei <alexandru.elisei@arm.com>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20220127161759.53553-6-alexandru.elisei@arm.com
    6ee7fca2
kvm.h 13.7 KB