1. Jan 08, 2024
  2. Jan 07, 2024
  3. Jan 06, 2024
  4. Jan 05, 2024
  5. Jan 04, 2024
    • 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