• Paolo Bonzini's avatar
    KVM: x86/pmu: fix masking logic for MSR_CORE_PERF_GLOBAL_CTRL · 97107946
    Paolo Bonzini authored
    When commit c59a1f10 ("KVM: x86/pmu: Add IA32_PEBS_ENABLE
    MSR emulation for extended PEBS") switched the initialization of
    cpuc->guest_switch_msrs to use compound literals, it screwed up
    the boolean logic:
    
    +	u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable;
    ...
    -	arr[0].guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask;
    -	arr[0].guest &= ~(cpuc->pebs_enabled & x86_pmu.pebs_capable);
    +               .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask),
    
    Before the patch, the value of arr[0].guest would have been intel_ctrl &
    ~cpuc->intel_ctrl_host_mask & ~pebs_mask.  The intent is to always treat
    PEBS events as host-only because, while the guest runs, there is no way
    to tell the processor about the virtual address where to put PEBS records
    intended for the host.
    
    Unfortunately, the new expression can be expanded to
    
    	(intel_ctrl & ~cpuc->intel_ctrl_host_mask) | (intel_ctrl & ~pebs_mask)
    
    which makes no sense; it includes any bit that isn't *both* marked as
    exclude_guest and using PEBS.  So, reinstate the old logic.  Another
    way to write it could be "intel_ctrl & ~(cpuc->intel_ctrl_host_mask |
    pebs_mask)", presumably the intention of the author of the faulty.
    However, I personally find the repeated application of A AND NOT B to
    be a bit more readable.
    
    This shows up as guest failures when running concurrent long-running
    perf workloads on the host, and was reported to happen with rcutorture.
    All guests on a given host would die simultaneously with something like an
    instruction fault or a segmentation violation.
    Reported-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Analyzed-by: default avatarSean Christopherson <seanjc@google.com>
    Tested-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Cc: stable@vger.kernel.org
    Fixes: c59a1f10 ("KVM: x86/pmu: Add IA32_PEBS_ENABLE MSR emulation for extended PEBS")
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    97107946
core.c 198 KB