mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Chen, Zide" <zide.chen@intel.com>
To: Jim Mattson <jmattson@google.com>
Cc: Yosry Ahmed <yosry@kernel.org>,
	Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	kvm@vger.kernel.org, Andi Kleen <ak@linux.intel.com>,
	Stephane Eranian <eranian@google.com>,
	linux-kernel@vger.kernel.org, Mingwei Zhang <mizhang@google.com>,
	Das Sandipan <Sandipan.Das@amd.com>,
	Shukla Manali <Manali.Shukla@amd.com>,
	Dapeng Mi <dapeng1.mi@linux.intel.com>,
	Xudong Hao <xudong.hao@intel.com>
Subject: Re: [PATCH v2 11/16] KVM: x86/pmu: Emulate the GLOBAL_STATUS_SET and GLOBAL_INUSE MSRs
Date: Wed, 4 Nov 2026 09:19:57 -0600	[thread overview]
Message-ID: <d97ab0ff-a6a5-408b-b2be-78d9c3352dc6@intel.com> (raw)
In-Reply-To: <CALMp9eTiAMLsH7cO9Mc982WwDTAFcYOua+32Ykpj3gR_Oscfww@mail.gmail.com>



On 11/2/2026 12:32 PM, Jim Mattson wrote:
> On Mon, Nov 2, 2026 at 9:38 AM Chen, Zide <zide.chen@intel.com> wrote:
>>
>>
>>
>> On 10/30/2026 5:13 PM, Yosry Ahmed wrote:
>>>>> @@ -865,6 +867,7 @@ int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>>>>         case MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR:
>>>>>         case MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_SET:
>>>>>         case MSR_CORE_PERF_GLOBAL_OVF_CTRL:
>>>>> +       case MSR_CORE_PERF_GLOBAL_STATUS_SET:
>>>>>                 msr_info->data = 0;
>>>>>                 break;
>>>>>         default:
>>>>> @@ -931,6 +934,12 @@ int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>>>>                 if (!msr_info->host_initiated)
>>>>>                         pmu->global_status &= ~data;
>>>>>                 break;
>>>>> +       case MSR_CORE_PERF_GLOBAL_STATUS_SET:
>>>>> +               if (data & pmu->global_status_rsvd)
>>>>> +                       return 1;
>>>>> +               if (!msr_info->host_initiated)
>>>>> +                       pmu->global_status |= data;
>>>>> +               break;
>>>>
>>>> According to Intel SDM Vol. 4, Table 2-2 ("IA-32 Architectural MSRs"),
>>>> IA32_PERF_GLOBAL_STATUS.CondChgd[bit 63] cannot be set by writing to
>>>> IA32_PERF_GLOBAL_STATUS_SET, because IA32_PERF_GLOBAL_STATUS_SET[bit 63] is
>>>> reserved.  In other words, it is not possible to save/restore
>>>> IA32_PERF_GLOBAL_STATUS when bit 63 is set.
>>>>
>>>> Because bit 63 is clear in pmu->global_status_rsvd:
>>>>
>>>> 1. An intercepted guest WRMSR(MSR_CORE_PERF_GLOBAL_STATUS_SET, BIT_ULL(63))
>>>>    succeeds instead of injecting #GP(0) and sets bit 63 in
>>>>    pmu->global_status.
>>>> 2. When bit 63 is set in pmu->global_status (whether it was set by
>>>>    kvm_pmu_set_msr() or by intel_mediated_pmu_put()), the next
>>>>    intel_mediated_pmu_load() will try to write an illegal value to
>>>>    MSR_CORE_PERF_GLOBAL_STATUS_SET. I don't think we get a #GP, because
>>>>    every wrmsr is "safe" these days, but the write will be ignored.
>>>
>>> On SPR, it does produce a #GP that gets ignored (and logged) and the bit
>>> is not set.  Interestingly, on CLX, the write goes through and the bit
>>> is set. Didn't check other CPUs.
>>
>> Good catch! I tested a few more CPUs (DMR/CWF/SRF/GNR/NVL/LNL), and all
>> of them #GP on writes that set bit 63.
>>
>> However, SKX, CLX, and ICX accept writes with bit 63 set and do not
>> generate #GP. On those systems, bit 63 also becomes visible when reading
>> back GLOBAL_STATUS. This behavior is documented in their errata:
>>
>> SKX95/CLX89/ICX166. Bit 63 of IA32_PERF_GLOBAL_STATUS_SET MSR (391H) is
>> reserved. Due to this erratum, setting the bit will not result in #GP.
>>
>> SKX:
>> https://cdrdv2-public.intel.com/336065/336065_Intel%20Xeon%20Processor%20Scalable%20Family%20Public%20Specification%20Update_rev17.pdf
>>
>> CLX:
>> https://cdrdv2-public.intel.com/338848/338848_2nd%20Gen%20Intel%C2%AE%20Xeon%C2%AE%20Scalable%20Processors%20Specification%20Update_Rev028US.pdf
>>
>> ICX:
>> https://cdrdv2-public.intel.com/637780/637780_3rd_Gen_Xeon_Scalable_Spec_Update_026US.pdf
>>
>> Given that SKX95/CLX89/ICX166 document this behavior as an erratum,
>> while SPR and newer CPUs appear to follow the SDM and #GP, should KVM
>> continue to inject #GP for writes that set bit 63?
> 
> Ugh. It seems like we have two options, neither of them all that appealing.
> 
> 1. KVM fixes the errata and raises #GP. To ensure consistency, KVM
> always intercepts the MSR on affected CPUs.
> 2. KVM mimics the errata and allows writes to bit 63 when virtualizing
> affected CPUs. This allows the MSR to be passed through, unless an
> unaffected CPU masquerades as an affected one.
> 
> Sean? WDYT?

After looking into this more closely, I think KVM should simply reject
guest writes to bit 63 (CondChgd).

In platform-specific documentation (EDS for SPR, ICX, DMR, PTL, etc.),
this bit is explicitly described as: "Set in case of a change to
IA32_MISC_ENABLES.PERFMON_AVAILABLE (bit 7)", clarifying the SDM
wording "changes to the state of performance monitoring hardware", or
"CondChgd: Status bits of this register have changed.".

This is also consistent with my testing, where I was unable to trigger
CondChgd on the host while exercising other PMU functionality that sets
GLOBAL_STATUS bits.

Since IA32_MISC_ENABLE is intercepted by KVM and is read-only for the
guest, CondChgd should never be set on GLOBAL_STATUS in the guest.

KVM cannot preserve this bit on GLOBAL_STATUS across vPMU context
switches, since it cannot be restored through GLOBAL_STATUS_SET.
That is fine, however, since CondChgd is not set on the guest.

BTW, the history on early CPUs is somewhat messy. As mentioned earlier,
some CPUs have errata that accept writing to bit 63 without #GP
(SKX95, CLX89, CPX89, ICX166, ICL019, etc.). Additionally, the reset
value of this bit is not consistent on some early CPUs, as noted in
commit b292d7a10487 ("perf/x86/intel: ignore CondChgd bit to avoid
false NMI handling").

I'd suggest splitting this into two separate patches: one patch
to emulate each MSR, for clarity.

  reply	other threads:[~2026-11-04 15:19 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-27 22:37 [PATCH] KVM: x86/pmu: Add mediated vPMU PerfMon v5 support Zide Chen
2026-08-27 22:37 ` [PATCH v2 01/16] KVM: x86/pmu: Remove redundant Perf Global Status MSR bit definitions Zide Chen
2026-09-01  2:07   ` Mi, Dapeng
2026-10-28 14:03   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 02/16] KVM: x86/pmu: Rename all_valid_pmc_idx to pmc_exists Zide Chen
2026-09-01  2:09   ` Mi, Dapeng
2026-10-28 14:04   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 03/16] KVM: x86/pmu: Rename reserved_bits to eventsel_rsvd in kvm_pmu Zide Chen
2026-09-01  2:17   ` Mi, Dapeng
2026-10-28 14:05   ` Jim Mattson
2026-11-02 13:53   ` Sandipan Das
2026-08-27 22:37 ` [PATCH v2 04/16] KVM: x86/pmu: Gate BUFFER_OVF reserved bit on guest DS Zide Chen
2026-09-01  2:30   ` Mi, Dapeng
2026-10-28 14:25   ` Jim Mattson
2026-10-28 19:05     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 05/16] KVM: x86/pmu: Add PMC bitmap accessor helpers Zide Chen
2026-09-01  2:43   ` Mi, Dapeng
2026-10-28 14:32   ` Jim Mattson
2026-10-28 17:24     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 06/16] KVM: x86/pmu: Drop nr_arch_{gp,fixed}_counters from kvm_pmu Zide Chen
2026-09-01  3:07   ` Mi, Dapeng
2026-10-28 14:49   ` Jim Mattson
2026-10-28 17:04     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 07/16] KVM: x86/pmu: Expose kvm_host_pmu to vendor modules Zide Chen
2026-09-01  3:08   ` Mi, Dapeng
2026-10-28 17:33   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 08/16] perf/x86: Plumb counter bitmap from x86_pmu to x86_pmu_cap Zide Chen
2026-10-28 17:39   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 09/16] KVM: x86/pmu: Switch to bitmask-based KVM PMU capabilities Zide Chen
2026-09-01  3:32   ` Mi, Dapeng
2026-10-28 17:57   ` Jim Mattson
2026-10-28 20:56     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 10/16] perf/x86: Remove num_counters_{gp,fixed} from x86_pmu_capability Zide Chen
2026-10-28 18:01   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 11/16] KVM: x86/pmu: Emulate the GLOBAL_STATUS_SET and GLOBAL_INUSE MSRs Zide Chen
2026-09-01  6:45   ` Mi, Dapeng
2026-09-01 14:20     ` Chen, Zide
2026-09-02  0:44       ` Mi, Dapeng
2026-10-28 21:24   ` Jim Mattson
2026-10-29 17:45     ` Chen, Zide
2026-10-30 11:55       ` Jim Mattson
2026-10-30 17:20         ` Chen, Zide
2026-10-30 18:23           ` Jim Mattson
2026-10-30 20:01             ` Chen, Zide
2026-10-30 22:13     ` Yosry Ahmed
2026-11-02 17:38       ` Chen, Zide
2026-11-02 18:32         ` Jim Mattson
2026-11-04 15:19           ` Chen, Zide [this message]
2026-11-02 18:49         ` Yosry Ahmed
2026-11-02 21:29           ` Chen, Zide
2026-11-02 21:36             ` Yosry Ahmed
2026-11-02 22:13               ` Chen, Zide
2026-11-02 22:25                 ` Jim Mattson
2026-11-02 22:48                   ` Chen, Zide
2026-11-02 22:51                     ` Yosry Ahmed
2026-11-02 23:26                       ` Chen, Zide
2026-11-02 23:37                         ` Yosry Ahmed
2026-11-03  4:32                           ` Chen, Zide
2026-11-02 23:44                       ` Jim Mattson
2026-11-03  4:32                         ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 12/16] KVM: x86/pmu: Populate CPUID.0AH:ECX fixed-counter bitmap Zide Chen
2026-09-01  6:50   ` Mi, Dapeng
2026-10-28 21:29   ` Jim Mattson
2026-10-28 21:55     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 13/16] KVM: x86/pmu: Factor out fixed counter control bit calculation Zide Chen
2026-09-01  6:57   ` Mi, Dapeng
2026-10-28 21:30   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 14/16] KVM: x86/pmu: Ignore AnyThread bit if CPUID.0AH:EDX[15] is set Zide Chen
2026-09-01  8:01   ` Mi, Dapeng
2026-10-28 21:50   ` Jim Mattson
2026-10-28 23:05     ` Chen, Zide
2026-10-28 23:09       ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 15/16] KVM: x86/pmu: Advertise PerfMon version 5 on Intel hosts Zide Chen
2026-10-28 21:59   ` Jim Mattson
2026-10-28 22:10     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 16/16] KVM: selftests: Support fixed counters bitmap in pmu_counters_test Zide Chen
2026-08-29  9:30 ` [PATCH] KVM: x86/pmu: Add mediated vPMU PerfMon v5 support Peter Zijlstra
2026-10-19 19:15 ` [PATCH v2] " Chen, Zide

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d97ab0ff-a6a5-408b-b2be-78d9c3352dc6@intel.com \
    --to=zide.chen@intel.com \
    --cc=Manali.Shukla@amd.com \
    --cc=Sandipan.Das@amd.com \
    --cc=ak@linux.intel.com \
    --cc=dapeng1.mi@linux.intel.com \
    --cc=eranian@google.com \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mizhang@google.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=seanjc@google.com \
    --cc=xudong.hao@intel.com \
    --cc=yosry@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®