From: "Mi, Dapeng" <dapeng1.mi@linux.intel.com>
To: Dongli Zhang <dongli.zhang@oracle.com>,
qemu-devel@nongnu.org, kvm@vger.kernel.org
Cc: pbonzini@redhat.com, zhao1.liu@intel.com, mtosatti@redhat.com,
sandipan.das@amd.com, babu.moger@amd.com, likexu@tencent.com,
like.xu.linux@gmail.com, groug@kaod.org, khorenko@virtuozzo.com,
alexander.ivanov@virtuozzo.com, den@virtuozzo.com,
davydov-max@yandex-team.ru, xiaoyao.li@intel.com,
joe.jin@oracle.com, ewanhai-oc@zhaoxin.com, ewanhai@zhaoxin.com
Subject: Re: [PATCH v6 4/9] target/i386/kvm: extract unrelated code out of kvm_x86_build_cpuid()
Date: Wed, 2 Jul 2025 11:52:10 +0800 [thread overview]
Message-ID: <59fb1bc6-e3d6-4865-87f0-ed7182caaee5@linux.intel.com> (raw)
In-Reply-To: <20250624074421.40429-5-dongli.zhang@oracle.com>
On 6/24/2025 3:43 PM, Dongli Zhang wrote:
> The initialization of 'has_architectural_pmu_version',
> 'num_architectural_pmu_gp_counters', and
> 'num_architectural_pmu_fixed_counters' is unrelated to the process of
> building the CPUID.
>
> Extract them out of kvm_x86_build_cpuid().
>
> In addition, use cpuid_find_entry() instead of cpu_x86_cpuid(), because
> CPUID has already been filled at this stage.
>
> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
> Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
> ---
> Changed since v1:
> - Still extract the code, but call them for all CPUs.
> Changed since v2:
> - Use cpuid_find_entry() instead of cpu_x86_cpuid().
> - Didn't add Reviewed-by from Dapeng as the change isn't minor.
>
> target/i386/kvm/kvm.c | 62 ++++++++++++++++++++++++-------------------
> 1 file changed, 35 insertions(+), 27 deletions(-)
>
> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
> index 15155b79b5..4baaa069b8 100644
> --- a/target/i386/kvm/kvm.c
> +++ b/target/i386/kvm/kvm.c
> @@ -1968,33 +1968,6 @@ uint32_t kvm_x86_build_cpuid(CPUX86State *env, struct kvm_cpuid_entry2 *entries,
> }
> }
>
> - if (limit >= 0x0a) {
> - uint32_t eax, edx;
> -
> - cpu_x86_cpuid(env, 0x0a, 0, &eax, &unused, &unused, &edx);
> -
> - has_architectural_pmu_version = eax & 0xff;
> - if (has_architectural_pmu_version > 0) {
> - num_architectural_pmu_gp_counters = (eax & 0xff00) >> 8;
> -
> - /* Shouldn't be more than 32, since that's the number of bits
> - * available in EBX to tell us _which_ counters are available.
> - * Play it safe.
> - */
> - if (num_architectural_pmu_gp_counters > MAX_GP_COUNTERS) {
> - num_architectural_pmu_gp_counters = MAX_GP_COUNTERS;
> - }
> -
> - if (has_architectural_pmu_version > 1) {
> - num_architectural_pmu_fixed_counters = edx & 0x1f;
> -
> - if (num_architectural_pmu_fixed_counters > MAX_FIXED_COUNTERS) {
> - num_architectural_pmu_fixed_counters = MAX_FIXED_COUNTERS;
> - }
> - }
> - }
> - }
> -
> cpu_x86_cpuid(env, 0x80000000, 0, &limit, &unused, &unused, &unused);
>
> for (i = 0x80000000; i <= limit; i++) {
> @@ -2098,6 +2071,39 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
> return 0;
> }
>
> +static void kvm_init_pmu_info(struct kvm_cpuid2 *cpuid)
> +{
> + struct kvm_cpuid_entry2 *c;
> +
> + c = cpuid_find_entry(cpuid, 0xa, 0);
> +
> + if (!c) {
> + return;
> + }
> +
> + has_architectural_pmu_version = c->eax & 0xff;
> + if (has_architectural_pmu_version > 0) {
> + num_architectural_pmu_gp_counters = (c->eax & 0xff00) >> 8;
> +
> + /*
> + * Shouldn't be more than 32, since that's the number of bits
> + * available in EBX to tell us _which_ counters are available.
> + * Play it safe.
> + */
> + if (num_architectural_pmu_gp_counters > MAX_GP_COUNTERS) {
> + num_architectural_pmu_gp_counters = MAX_GP_COUNTERS;
> + }
> +
> + if (has_architectural_pmu_version > 1) {
> + num_architectural_pmu_fixed_counters = c->edx & 0x1f;
> +
> + if (num_architectural_pmu_fixed_counters > MAX_FIXED_COUNTERS) {
> + num_architectural_pmu_fixed_counters = MAX_FIXED_COUNTERS;
> + }
> + }
> + }
> +}
> +
> int kvm_arch_init_vcpu(CPUState *cs)
> {
> struct {
> @@ -2288,6 +2294,8 @@ int kvm_arch_init_vcpu(CPUState *cs)
> cpuid_i = kvm_x86_build_cpuid(env, cpuid_data.entries, cpuid_i);
> cpuid_data.cpuid.nent = cpuid_i;
>
> + kvm_init_pmu_info(&cpuid_data.cpuid);
> +
> if (((env->cpuid_version >> 8)&0xF) >= 6
> && (env->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
> (CPUID_MCE | CPUID_MCA)) {
Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
next prev parent reply other threads:[~2025-07-02 3:52 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-24 7:43 [PATCH v6 0/9] target/i386/kvm/pmu: PMU Enhancement, Bugfix and Cleanup Dongli Zhang
2025-06-24 7:43 ` [PATCH v6 1/9] target/i386: disable PerfMonV2 when PERFCORE unavailable Dongli Zhang
2025-06-24 7:43 ` [PATCH v6 2/9] target/i386: disable PERFCORE when "-pmu" is configured Dongli Zhang
2025-06-24 7:43 ` [PATCH v6 3/9] target/i386/kvm: set KVM_PMU_CAP_DISABLE if " Dongli Zhang
2025-07-02 3:47 ` Mi, Dapeng
2025-06-24 7:43 ` [PATCH v6 4/9] target/i386/kvm: extract unrelated code out of kvm_x86_build_cpuid() Dongli Zhang
2025-07-02 3:52 ` Mi, Dapeng [this message]
2025-06-24 7:43 ` [PATCH v6 5/9] target/i386/kvm: rename architectural PMU variables Dongli Zhang
2025-08-13 9:18 ` Sandipan Das
2025-06-24 7:43 ` [PATCH v6 6/9] target/i386/kvm: query kvm.enable_pmu parameter Dongli Zhang
2025-07-02 5:10 ` Mi, Dapeng
2025-06-24 7:43 ` [PATCH v6 7/9] target/i386/kvm: reset AMD PMU registers during VM reset Dongli Zhang
2025-07-02 5:38 ` Mi, Dapeng
2025-06-24 7:43 ` [PATCH v6 8/9] target/i386/kvm: support perfmon-v2 for reset Dongli Zhang
2025-06-24 7:43 ` [PATCH v6 9/9] target/i386/kvm: don't stop Intel PMU counters Dongli Zhang
2025-07-02 5:42 ` Mi, Dapeng
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=59fb1bc6-e3d6-4865-87f0-ed7182caaee5@linux.intel.com \
--to=dapeng1.mi@linux.intel.com \
--cc=alexander.ivanov@virtuozzo.com \
--cc=babu.moger@amd.com \
--cc=davydov-max@yandex-team.ru \
--cc=den@virtuozzo.com \
--cc=dongli.zhang@oracle.com \
--cc=ewanhai-oc@zhaoxin.com \
--cc=ewanhai@zhaoxin.com \
--cc=groug@kaod.org \
--cc=joe.jin@oracle.com \
--cc=khorenko@virtuozzo.com \
--cc=kvm@vger.kernel.org \
--cc=like.xu.linux@gmail.com \
--cc=likexu@tencent.com \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=sandipan.das@amd.com \
--cc=xiaoyao.li@intel.com \
--cc=zhao1.liu@intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.