Hi Zhao, On 3/10/25 12:47 AM, Zhao Liu wrote: > (+EwanHai for zhaoxin case...) > > ... > [snip] >> + >> + /* >> + * Performance-monitoring supported from K7 and later. >> + */ >> + if (family < 6) { >> + return; >> + } > > I understand we can get family by object_property_get_int() helper: Thank you very much for suggestion! > > diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c > index 4902694129f9..ff08c7bfee6c 100644 > --- a/target/i386/kvm/kvm.c > +++ b/target/i386/kvm/kvm.c > @@ -2106,27 +2106,22 @@ static void kvm_init_pmu_info_intel(CPUX86State *env) > } > } > [snip] > > @@ -2197,7 +2192,7 @@ static void kvm_init_pmu_info(CPUState *cs) > if (IS_INTEL_CPU(env)) { > kvm_init_pmu_info_intel(env); > } else if (IS_AMD_CPU(env)) { > - kvm_init_pmu_info_amd(env); > + kvm_init_pmu_info_amd(cpu); > } > } > > --- > Then for consistency, kvm_init_pmu_info_intel() could also accept > "X86CPU *cpu" as the argument. Sure. Will do. > >> + has_pmu_version = 1; >> + >> + cpu_x86_cpuid(env, 0x80000001, 0, &unused, &unused, &ecx, &unused); >> + >> + if (!(ecx & CPUID_EXT3_PERFCORE)) { >> + num_pmu_gp_counters = AMD64_NUM_COUNTERS; >> + return; >> + } >> + >> + num_pmu_gp_counters = AMD64_NUM_COUNTERS_CORE; >> +} > > ... > >> +static void kvm_init_pmu_info(CPUState *cs) >> +{ >> + X86CPU *cpu = X86_CPU(cs); >> + CPUX86State *env = &cpu->env; >> + >> + /* >> + * The PMU virtualization is disabled by kvm.enable_pmu=N. >> + */ >> + if (kvm_pmu_disabled) { >> + return; >> + } > > As I said in patch 7, we could return an error instead. Sure. In addition, as we have discussed, we are going to pass cpuid_data.cpuid as argument, so that we don't need cpu_x86_cpuid() any longer. > >> + /* >> + * It is not supported to virtualize AMD PMU registers on Intel >> + * processors, nor to virtualize Intel PMU registers on AMD processors. >> + */ >> + if (!is_same_vendor(env)) { > > Here it deserves a warning like: > > error_report("host doesn't support requested feature: vPMU\n"); Sure. Will do. > >> + return; >> + } >> >> + /* >> + * If KVM_CAP_PMU_CAPABILITY is not supported, there is no way to >> + * disable the AMD pmu virtualization. >> + * >> + * If KVM_CAP_PMU_CAPABILITY is supported !cpu->enable_pmu >> + * indicates the KVM has already disabled the PMU virtualization. >> + */ >> + if (has_pmu_cap && !cpu->enable_pmu) { >> + return; >> + } > > Could we only check "cpu->enable_pmu" at the beginning of this function? > then if pmu is already disabled, we don't need to initialize the pmu info. I don't think so. There is a case: - cpu->enable_pmu = false. (That is, "-cpu host,-pmu"). - But for KVM prior v5.18 that KVM_CAP_PMU_CAPABILITY doesn't exist. There is no way to disable vPMU. To determine based on only "!cpu->enable_pmu" doesn't work. It works only when "!cpu->enable_pmu" and KVM_CAP_PMU_CAPABILITY exists. We may still need a static global variable here to indicate where "kvm.enable_pmu=N" (as discussed in PATCH 07). > >> + if (IS_INTEL_CPU(env)) { > > Zhaoxin also supports architectural PerfMon in 0xa. > > I'm not sure if this check should also involve Zhaoxin CPU, so cc > zhaoxin guys for double check. Sure for both here and below 'ditto'. Thank you very much! Dongli Zhang