Hi Eric, On Thu, Oct 29, 2026 at 10:20:19AM +0100, Eric Auger wrote: > The 2 callers of kvm_arch_init_vcpu(), namely kvm_rebind_vcpus() > and kvm_init_vcpu() are passed an Error handle. So it is a pity > not using it in kvm_arch_init_vcpu(). Also, in the future, the > error handle could be passed to other functions called inside. > > Signed-off-by: Eric Auger <[email protected]> > --- > include/system/kvm.h | 2 +- > accel/kvm/kvm-all.c | 15 +++++++-------- > target/arm/kvm.c | 26 +++++++++++++------------- > target/i386/kvm/kvm.c | 22 ++++++++++++---------- > target/loongarch/kvm/kvm.c | 27 +++++++++------------------ > target/ppc/kvm.c | 10 +++++++--- > target/riscv/kvm/kvm-cpu.c | 6 +++++- > target/s390x/kvm/kvm.c | 2 +- > 8 files changed, 55 insertions(+), 55 deletions(-) > > diff --git a/include/system/kvm.h b/include/system/kvm.h > index d29624034c..26d55cc699 100644 > --- a/include/system/kvm.h > +++ b/include/system/kvm.h > @@ -358,7 +358,7 @@ int kvm_arch_get_default_type(MachineState *ms); > int kvm_arch_init(MachineState *ms, KVMState *s); > > int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp); > -int kvm_arch_init_vcpu(CPUState *cpu); > +int kvm_arch_init_vcpu(CPUState *cpu, Error **errp); > int kvm_arch_destroy_vcpu(CPUState *cpu); > > #ifdef TARGET_KVM_HAVE_RESET_PARKED_VCPU > diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c > index db8fba53f3..ddc82f9775 100644 > --- a/accel/kvm/kvm-all.c > +++ b/accel/kvm/kvm-all.c > @@ -504,11 +504,11 @@ static int kvm_rebind_vcpus(Error **errp) > } > } > > - ret = kvm_arch_init_vcpu(cpu); > + ret = kvm_arch_init_vcpu(cpu, errp); > if (ret < 0) { > - error_setg_errno(errp, -ret, > - "kvm_init_vcpu: kvm_arch_init_vcpu failed > (%lu)", > - vcpu_id); > + error_prepend(errp, > + "kvm_init_vcpu: kvm_arch_init_vcpu failed (%lu)", > + vcpu_id); > } > > close(cpu->kvm_vcpu_stats_fd); > @@ -751,11 +751,10 @@ int kvm_init_vcpu(CPUState *cpu, Error **errp) > } > } > > - ret = kvm_arch_init_vcpu(cpu); > + ret = kvm_arch_init_vcpu(cpu, errp); > if (ret < 0) { > - error_setg_errno(errp, -ret, > - "kvm_init_vcpu: kvm_arch_init_vcpu failed (%lu)", > - kvm_arch_vcpu_id(cpu)); > + error_prepend(errp, "kvm_init_vcpu: kvm_arch_init_vcpu failed (%lu)", > + kvm_arch_vcpu_id(cpu)); > } > cpu->kvm_vcpu_stats_fd = kvm_vcpu_ioctl(cpu, KVM_GET_STATS_FD, NULL); > > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index d454346037..2d37c2bfb4 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -2015,17 +2015,16 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error > **errp) > return 0; > } > > -int kvm_arch_init_vcpu(CPUState *cs) > +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) > { > int ret; > uint64_t mpidr; > ARMCPU *cpu = ARM_CPU(cs); > CPUARMState *env = &cpu->env; > - Error *local_err = NULL; > uint64_t psciver; > > if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { > - error_report("KVM is not supported for this guest CPU type"); > + error_setg(errp, "KVM is not supported for this guest CPU type"); > return -EINVAL; > } > > @@ -2071,16 +2070,19 @@ int kvm_arch_init_vcpu(CPUState *cs) > /* Do KVM_ARM_VCPU_INIT ioctl */ > ret = kvm_arm_vcpu_init(cpu); > if (ret) { > + error_setg_errno(errp, -ret, "failed kvm_arm_vcpu_init"); > return ret; > } > > if (cpu_isar_feature(aa64_sve, cpu)) { > ret = kvm_arm_sve_set_vls(cpu); > if (ret) { > + error_setg_errno(errp, -ret, "failed kvm_arm_sve_set_vls"); > return ret; > } > ret = kvm_arm_vcpu_finalize(cpu, KVM_ARM_VCPU_SVE); > if (ret) { > + error_setg_errno(errp, -ret, "failed kvm_arm_vcpu_finalize"); > return ret; > } > } > @@ -2089,11 +2091,12 @@ int kvm_arch_init_vcpu(CPUState *cs) > psciver = cpu->psci_version; > ret = kvm_set_one_reg(cs, KVM_REG_ARM_PSCI_VERSION, &psciver); > if (ret) { > - error_report("KVM in this kernel does not support PSCI version > %d.%d", > - (int) PSCI_VERSION_MAJOR(psciver), > - (int) PSCI_VERSION_MINOR(psciver)); > - error_printf("Consider setting the kvm-psci-version property on > the " > - "migration source.\n"); > + error_setg_errno(errp, -ret, > + "KVM in this kernel does not support PSCI > version %d.%d", > + (int) PSCI_VERSION_MAJOR(psciver), > + (int) PSCI_VERSION_MINOR(psciver)); > + error_append_hint(errp, "Consider setting the kvm-psci-version > property " > + "on the migration source.\n"); > return ret; > } > } > @@ -2115,16 +2118,13 @@ int kvm_arch_init_vcpu(CPUState *cs) > */ > ret = kvm_get_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MPIDR), &mpidr); > if (ret) { > + error_setg_errno(errp, -ret, "failed retrieving MPIDR value"); > return ret; > } > SET_IDREG(&cpu->isar, MPIDR, mpidr); > cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK; > > - ret = kvm_arm_init_cpreg_list(cpu, &local_err); > - if (ret < 0) { > - error_report_err(local_err); > - } > - return ret; > + return kvm_arm_init_cpreg_list(cpu, errp); > } > > int kvm_arch_destroy_vcpu(CPUState *cs) > diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c > index da922f72d7..474322b073 100644 > --- a/target/i386/kvm/kvm.c > +++ b/target/i386/kvm/kvm.c > @@ -2218,7 +2218,7 @@ static void kvm_init_pmu_info(struct kvm_cpuid2 *cpuid, > X86CPU *cpu) > } > } > > -int kvm_arch_init_vcpu(CPUState *cs) > +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) > { > struct { > struct kvm_cpuid2 cpuid; > @@ -2240,12 +2240,12 @@ int kvm_arch_init_vcpu(CPUState *cs) > int kvm_base = KVM_CPUID_SIGNATURE; > int max_nested_state_len; > int r; > - Error *local_err = NULL; > > if (current_machine->cgs) { > r = x86_confidential_guest_check_features( > X86_CONFIDENTIAL_GUEST(current_machine->cgs), cs); > if (r < 0) { > + error_setg(errp, "failed x86_confidential_guest_check_features > (%d)", r); > return r; > } > } > @@ -2258,6 +2258,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > > r = kvm_arch_set_tsc_khz(cs); > if (r < 0) { > + error_setg(errp, "failed setting tsc_khz (%d)", r); > return r; > } > > @@ -2285,14 +2286,14 @@ int kvm_arch_init_vcpu(CPUState *cs) > * can still proceed and check/expand Hyper-V enlightenments here so > legacy > * behavior is preserved. > */ > - if (!kvm_hyperv_expand_features(cpu, &local_err)) { > - error_report_err(local_err); > + if (!kvm_hyperv_expand_features(cpu, errp)) { > return -ENOSYS; > } > > if (hyperv_enabled(cpu)) { > r = hyperv_init_vcpu(cpu); > if (r) { > + error_setg_errno(errp, -r, "failed hyperv_init_vcpu"); > return r; > } > > @@ -2371,6 +2372,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > > r = kvm_xen_init_vcpu(cs); > if (r) { > + error_setg_errno(errp, -r, "failed kvm_xen_init_vcpu"); > return r; > } > > @@ -2419,12 +2421,12 @@ int kvm_arch_init_vcpu(CPUState *cs) > > ret = kvm_get_mce_cap_supported(cs->kvm_state, &mcg_cap, &banks); > if (ret < 0) { > - fprintf(stderr, "kvm_get_mce_cap_supported: %s", strerror(-ret)); > + error_setg_errno(errp, -ret, "failed kvm_get_mce_cap_supported"); > return ret; > } > > if (banks < (env->mcg_cap & MCG_CAP_BANKS_MASK)) { > - error_report("kvm: Unsupported MCE bank count (QEMU = %d, KVM = > %d)", > + error_setg(errp, "kvm: Unsupported MCE bank count (QEMU = %d, > KVM = %d)", > (int)(env->mcg_cap & MCG_CAP_BANKS_MASK), banks); > return -ENOTSUP; > } > @@ -2432,7 +2434,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > unsupported_caps = env->mcg_cap & ~(mcg_cap | MCG_CAP_BANKS_MASK); > if (unsupported_caps) { > if (unsupported_caps & MCG_LMCE_P) { > - error_report("kvm: LMCE not supported"); > + error_setg(errp, "kvm: LMCE not supported"); > return -ENOTSUP; > } > warn_report("Unsupported MCG_CAP bits: 0x%" PRIx64, > @@ -2442,7 +2444,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > env->mcg_cap &= mcg_cap | MCG_CAP_BANKS_MASK; > ret = kvm_vcpu_ioctl(cs, KVM_X86_SETUP_MCE, &env->mcg_cap); > if (ret < 0) { > - fprintf(stderr, "KVM_X86_SETUP_MCE: %s", strerror(-ret)); > + error_setg_errno(errp, -ret, "failed KVM_X86_SETUP_MCE"); > return ret; > } > } > @@ -2470,9 +2472,8 @@ int kvm_arch_init_vcpu(CPUState *cs) > error_setg(&invtsc_mig_blocker, > "State blocked by non-migratable CPU device" > " (invtsc flag)"); > - r = migrate_add_blocker(&invtsc_mig_blocker, &local_err); > + r = migrate_add_blocker(&invtsc_mig_blocker, errp); > if (r < 0) { > - error_report_err(local_err); > return r; > } > } > @@ -2501,6 +2502,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > cpuid_data.cpuid.padding = 0; > r = kvm_vcpu_ioctl(cs, KVM_SET_CPUID2, &cpuid_data); > if (r) { > + error_setg_errno(errp, -r, "failed KVM_SET_CPUID2"); > goto fail; > } > kvm_init_xsave(env); > diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c > index 7ca95181a1..db39267375 100644 > --- a/target/loongarch/kvm/kvm.c > +++ b/target/loongarch/kvm/kvm.c > @@ -1320,11 +1320,10 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error > **errp) > return 0; > } > > -int kvm_arch_init_vcpu(CPUState *cs) > +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) > { > uint64_t val; > int ret; > - Error *local_err = NULL; > LoongArchCPU *cpu = LOONGARCH_CPU(cs); > > cpu->vmsentry = qemu_add_vm_change_state_handler( > @@ -1334,51 +1333,43 @@ int kvm_arch_init_vcpu(CPUState *cs) > brk_insn = val; > } > > - ret = kvm_cpu_check_lsx(cs, &local_err); > + ret = kvm_cpu_check_lsx(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_lasx(cs, &local_err); > + ret = kvm_cpu_check_lasx(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_lbt(cs, &local_err); > + ret = kvm_cpu_check_lbt(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_pmu(cs, &local_err); > + ret = kvm_cpu_check_pmu(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_pv_features(cs, &local_err); > + ret = kvm_cpu_check_pv_features(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_ptw(cs, &local_err); > + ret = kvm_cpu_check_ptw(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_msgint(cs, &local_err); > + ret = kvm_cpu_check_msgint(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > - ret = kvm_cpu_check_misc_v1_1(cs, &local_err); > + ret = kvm_cpu_check_misc_v1_1(cs, errp); > if (ret < 0) { > - error_report_err(local_err); > return ret; > } > > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c > index 8e89a6c665..5d72cbd9fc 100644 > --- a/target/ppc/kvm.c > +++ b/target/ppc/kvm.c > @@ -484,7 +484,7 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp) > return 0; > } > > -int kvm_arch_init_vcpu(CPUState *cs) > +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) > { > PowerPCCPU *cpu = POWERPC_CPU(cs); > CPUPPCState *cenv = &cpu->env; > @@ -493,9 +493,10 @@ int kvm_arch_init_vcpu(CPUState *cs) > /* Synchronize sregs with kvm */ > ret = kvm_arch_sync_sregs(cpu); > if (ret) { > + error_setg_errno(errp, -ret, "Register sync failed"), > if (ret == -EINVAL) { > - error_report("Register sync failed... If you're using kvm-hv.ko," > - " only \"-cpu host\" is possible"); > + error_append_hint(errp, "If you're using kvm-hv.ko," > + " only \"-cpu host\" is possible\n"); > } > return ret; > } > @@ -504,6 +505,9 @@ int kvm_arch_init_vcpu(CPUState *cs) > case POWERPC_MMU_BOOKE206: > /* This target supports access to KVM's guest TLB */ > ret = kvm_booke206_tlb_init(cpu); > + if (ret < 0) { > + error_setg_errno(errp, -ret, "failed kvm_booke206_tlb_init"), > + } > break; > case POWERPC_MMU_2_07: > if (!cap_htm && !kvmppc_is_pr(cs->kvm_state)) { > diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c > index 5a82a63b82..523b515f2a 100644 > --- a/target/riscv/kvm/kvm-cpu.c > +++ b/target/riscv/kvm/kvm-cpu.c > @@ -1605,7 +1605,7 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error > **errp) > return 0; > } > > -int kvm_arch_init_vcpu(CPUState *cs) > +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) > { > int ret = 0; > RISCVCPU *cpu = RISCV_CPU(cs); > @@ -1615,6 +1615,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > if (!object_dynamic_cast(OBJECT(cpu), TYPE_RISCV_CPU_HOST)) { > ret = kvm_vcpu_set_machine_ids(cpu, cs); > if (ret != 0) { > + error_setg_errno(errp, -ret, "failed setting machine id"); > return ret; > } > } > @@ -1623,6 +1624,9 @@ int kvm_arch_init_vcpu(CPUState *cs) > kvm_riscv_update_cpu_cfg_isa_ext(cpu, cs); > > ret = kvm_vcpu_enable_sbi_dbcn(cpu, cs); > + if (ret < 0) { > + error_setg_errno(errp, -ret, "failed kvm_vcpu_enable_sbi_dbcn"); > + } > > return ret; > } > diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c > index dc67e84886..76dd1e67c0 100644 > --- a/target/s390x/kvm/kvm.c > +++ b/target/s390x/kvm/kvm.c > @@ -403,7 +403,7 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp) > return 0; > } > > -int kvm_arch_init_vcpu(CPUState *cs) > +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) > { > unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus; > S390CPU *cpu = S390_CPU(cs); > -- > 2.53.0 > >
Reviewed-by: Gustavo Romero <[email protected]> Cheers, Gustavo
