On Mon, Mar 25, 2019 at 12:51:57AM +0800, Fei Li wrote: > From: Fei Li <f...@suse.com> > > The callers of qemu_init_vcpu() already passed the **errp to handle > errors. In view of this, add a new Error parameter to qemu_init_vcpu() > and all qemu_X_start_vcpu() functions called by qemu_init_vcpu() to > propagate the error and let the further callers check it. > > Besides, make qemu_init_vcpu() return a Boolean value to let its > callers know whether it succeeds. > > Cc: Paolo Bonzini <pbonz...@redhat.com> > Signed-off-by: Fei Li <f...@suse.com> > Reviewed-by: Fam Zheng <f...@redhat.com> > Reviewed-by: Juan Quintela <quint...@redhat.com> > Reviewed-by: Markus Armbruster <arm...@redhat.com>
ppc parts Acked-by: David Gibson <da...@gibson.dropbear.id.au> > --- > accel/tcg/user-exec-stub.c | 3 +- > cpus.c | 74 > +++++++++++++++++++++++------------------ > include/qom/cpu.h | 2 +- > target/alpha/cpu.c | 4 ++- > target/arm/cpu.c | 4 ++- > target/cris/cpu.c | 4 ++- > target/hppa/cpu.c | 4 ++- > target/i386/cpu.c | 4 ++- > target/lm32/cpu.c | 4 ++- > target/m68k/cpu.c | 4 ++- > target/microblaze/cpu.c | 4 ++- > target/mips/cpu.c | 4 ++- > target/moxie/cpu.c | 4 ++- > target/nios2/cpu.c | 4 ++- > target/openrisc/cpu.c | 4 ++- > target/ppc/translate_init.inc.c | 4 ++- > target/riscv/cpu.c | 4 ++- > target/s390x/cpu.c | 4 ++- > target/sh4/cpu.c | 4 ++- > target/sparc/cpu.c | 4 ++- > target/tilegx/cpu.c | 4 ++- > target/tricore/cpu.c | 4 ++- > target/unicore32/cpu.c | 4 ++- > target/xtensa/cpu.c | 4 ++- > 24 files changed, 108 insertions(+), 55 deletions(-) > > diff --git a/accel/tcg/user-exec-stub.c b/accel/tcg/user-exec-stub.c > index a32b4496af..f8c38a375c 100644 > --- a/accel/tcg/user-exec-stub.c > +++ b/accel/tcg/user-exec-stub.c > @@ -10,8 +10,9 @@ void cpu_resume(CPUState *cpu) > { > } > > -void qemu_init_vcpu(CPUState *cpu) > +bool qemu_init_vcpu(CPUState *cpu, Error **errp) > { > + return true; > } > > /* User mode emulation does not support record/replay yet. */ > diff --git a/cpus.c b/cpus.c > index 2c70c06da8..fe58940407 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -1932,7 +1932,7 @@ void cpu_remove_sync(CPUState *cpu) > /* For temporary buffers for forming a name */ > #define VCPU_THREAD_NAME_SIZE 16 > > -static void qemu_tcg_init_vcpu(CPUState *cpu) > +static void qemu_tcg_init_vcpu(CPUState *cpu, Error **errp) > { > char thread_name[VCPU_THREAD_NAME_SIZE]; > static QemuCond *single_tcg_halt_cond; > @@ -1962,17 +1962,20 @@ static void qemu_tcg_init_vcpu(CPUState *cpu) > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG", > cpu->cpu_index); > > - /* TODO: let the callers handle the error instead of abort() > here */ > - qemu_thread_create(cpu->thread, thread_name, > qemu_tcg_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + if (qemu_thread_create(cpu->thread, thread_name, > + qemu_tcg_cpu_thread_fn, cpu, > + QEMU_THREAD_JOINABLE, errp) < 0) { > + return; > + } > > } else { > /* share a single thread for all cpus with TCG */ > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG"); > - /* TODO: let the callers handle the error instead of abort() > here */ > - qemu_thread_create(cpu->thread, thread_name, > - qemu_tcg_rr_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + if (qemu_thread_create(cpu->thread, thread_name, > + qemu_tcg_rr_cpu_thread_fn, cpu, > + QEMU_THREAD_JOINABLE, errp) < 0) { > + return; > + } > > single_tcg_halt_cond = cpu->halt_cond; > single_tcg_cpu_thread = cpu->thread; > @@ -1990,7 +1993,7 @@ static void qemu_tcg_init_vcpu(CPUState *cpu) > } > } > > -static void qemu_hax_start_vcpu(CPUState *cpu) > +static void qemu_hax_start_vcpu(CPUState *cpu, Error **errp) > { > char thread_name[VCPU_THREAD_NAME_SIZE]; > > @@ -2000,15 +2003,16 @@ static void qemu_hax_start_vcpu(CPUState *cpu) > > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX", > cpu->cpu_index); > - /* TODO: let the further caller handle the error instead of abort() here > */ > - qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + if (qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, > + cpu, QEMU_THREAD_JOINABLE, errp) < 0) { > + return; > + } > #ifdef _WIN32 > cpu->hThread = qemu_thread_get_handle(cpu->thread); > #endif > } > > -static void qemu_kvm_start_vcpu(CPUState *cpu) > +static void qemu_kvm_start_vcpu(CPUState *cpu, Error **errp) > { > char thread_name[VCPU_THREAD_NAME_SIZE]; > > @@ -2017,12 +2021,11 @@ static void qemu_kvm_start_vcpu(CPUState *cpu) > qemu_cond_init(cpu->halt_cond); > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM", > cpu->cpu_index); > - /* TODO: let the further caller handle the error instead of abort() here > */ > qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + cpu, QEMU_THREAD_JOINABLE, errp); > } > > -static void qemu_hvf_start_vcpu(CPUState *cpu) > +static void qemu_hvf_start_vcpu(CPUState *cpu, Error **errp) > { > char thread_name[VCPU_THREAD_NAME_SIZE]; > > @@ -2036,12 +2039,11 @@ static void qemu_hvf_start_vcpu(CPUState *cpu) > > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF", > cpu->cpu_index); > - /* TODO: let the further caller handle the error instead of abort() here > */ > qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + cpu, QEMU_THREAD_JOINABLE, errp); > } > > -static void qemu_whpx_start_vcpu(CPUState *cpu) > +static void qemu_whpx_start_vcpu(CPUState *cpu, Error **errp) > { > char thread_name[VCPU_THREAD_NAME_SIZE]; > > @@ -2050,15 +2052,16 @@ static void qemu_whpx_start_vcpu(CPUState *cpu) > qemu_cond_init(cpu->halt_cond); > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX", > cpu->cpu_index); > - /* TODO: let the further caller handle the error instead of abort() here > */ > - qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + if (qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, > + cpu, QEMU_THREAD_JOINABLE, errp) < 0) { > + return; > + } > #ifdef _WIN32 > cpu->hThread = qemu_thread_get_handle(cpu->thread); > #endif > } > > -static void qemu_dummy_start_vcpu(CPUState *cpu) > +static void qemu_dummy_start_vcpu(CPUState *cpu, Error **errp) > { > char thread_name[VCPU_THREAD_NAME_SIZE]; > > @@ -2067,16 +2070,16 @@ static void qemu_dummy_start_vcpu(CPUState *cpu) > qemu_cond_init(cpu->halt_cond); > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY", > cpu->cpu_index); > - /* TODO: let the further caller handle the error instead of abort() here > */ > qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE, &error_abort); > + cpu, QEMU_THREAD_JOINABLE, errp); > } > > -void qemu_init_vcpu(CPUState *cpu) > +bool qemu_init_vcpu(CPUState *cpu, Error **errp) > { > cpu->nr_cores = smp_cores; > cpu->nr_threads = smp_threads; > cpu->stopped = true; > + Error *local_err = NULL; > > if (!cpu->as) { > /* If the target cpu hasn't set up any address spaces itself, > @@ -2087,22 +2090,29 @@ void qemu_init_vcpu(CPUState *cpu) > } > > if (kvm_enabled()) { > - qemu_kvm_start_vcpu(cpu); > + qemu_kvm_start_vcpu(cpu, &local_err); > } else if (hax_enabled()) { > - qemu_hax_start_vcpu(cpu); > + qemu_hax_start_vcpu(cpu, &local_err); > } else if (hvf_enabled()) { > - qemu_hvf_start_vcpu(cpu); > + qemu_hvf_start_vcpu(cpu, &local_err); > } else if (tcg_enabled()) { > - qemu_tcg_init_vcpu(cpu); > + qemu_tcg_init_vcpu(cpu, &local_err); > } else if (whpx_enabled()) { > - qemu_whpx_start_vcpu(cpu); > + qemu_whpx_start_vcpu(cpu, &local_err); > } else { > - qemu_dummy_start_vcpu(cpu); > + qemu_dummy_start_vcpu(cpu, &local_err); > + } > + > + if (local_err) { > + error_propagate(errp, local_err); > + return false; > } > > while (!cpu->created) { > qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); > } > + > + return true; > } > > void cpu_stop_current(void) > diff --git a/include/qom/cpu.h b/include/qom/cpu.h > index 1d6099e5d4..a6fa9aabbd 100644 > --- a/include/qom/cpu.h > +++ b/include/qom/cpu.h > @@ -1026,7 +1026,7 @@ void end_exclusive(void); > * > * Initializes a vCPU. > */ > -void qemu_init_vcpu(CPUState *cpu); > +bool qemu_init_vcpu(CPUState *cpu, Error **errp); > > #define SSTEP_ENABLE 0x1 /* Enable simulated HW single stepping */ > #define SSTEP_NOIRQ 0x2 /* Do not use IRQ while single stepping */ > diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c > index 1fd95d6c0f..7d24ee1f31 100644 > --- a/target/alpha/cpu.c > +++ b/target/alpha/cpu.c > @@ -66,7 +66,9 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > acc->parent_realize(dev, errp); > } > diff --git a/target/arm/cpu.c b/target/arm/cpu.c > index 96f0ff0ec7..b48a17a7e3 100644 > --- a/target/arm/cpu.c > +++ b/target/arm/cpu.c > @@ -1201,7 +1201,9 @@ static void arm_cpu_realizefn(DeviceState *dev, Error > **errp) > } > #endif > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > cpu_reset(cs); > > acc->parent_realize(dev, errp); > diff --git a/target/cris/cpu.c b/target/cris/cpu.c > index a23aba2688..ec92d69781 100644 > --- a/target/cris/cpu.c > +++ b/target/cris/cpu.c > @@ -140,7 +140,9 @@ static void cris_cpu_realizefn(DeviceState *dev, Error > **errp) > } > > cpu_reset(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > ccc->parent_realize(dev, errp); > } > diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c > index 00bf444620..08f600ced9 100644 > --- a/target/hppa/cpu.c > +++ b/target/hppa/cpu.c > @@ -98,7 +98,9 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > acc->parent_realize(dev, errp); > > #ifndef CONFIG_USER_ONLY > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > index d6bb57d210..a56142abc7 100644 > --- a/target/i386/cpu.c > +++ b/target/i386/cpu.c > @@ -5330,7 +5330,9 @@ static void x86_cpu_realizefn(DeviceState *dev, Error > **errp) > } > #endif > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > /* > * Most Intel and certain AMD CPUs support hyperthreading. Even though > QEMU > diff --git a/target/lm32/cpu.c b/target/lm32/cpu.c > index b7499cb627..d50b1e4a43 100644 > --- a/target/lm32/cpu.c > +++ b/target/lm32/cpu.c > @@ -139,7 +139,9 @@ static void lm32_cpu_realizefn(DeviceState *dev, Error > **errp) > > cpu_reset(cs); > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > lcc->parent_realize(dev, errp); > } > diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c > index 582e3a73b3..4ab53f2d58 100644 > --- a/target/m68k/cpu.c > +++ b/target/m68k/cpu.c > @@ -231,7 +231,9 @@ static void m68k_cpu_realizefn(DeviceState *dev, Error > **errp) > m68k_cpu_init_gdb(cpu); > > cpu_reset(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > mcc->parent_realize(dev, errp); > } > diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c > index 5596cd5485..310e3d8fd5 100644 > --- a/target/microblaze/cpu.c > +++ b/target/microblaze/cpu.c > @@ -161,7 +161,9 @@ static void mb_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > env->pvr.regs[0] = PVR0_USE_EXC_MASK \ > | PVR0_USE_ICACHE_MASK \ > diff --git a/target/mips/cpu.c b/target/mips/cpu.c > index e217fb3e36..1e5aa69c57 100644 > --- a/target/mips/cpu.c > +++ b/target/mips/cpu.c > @@ -145,7 +145,9 @@ static void mips_cpu_realizefn(DeviceState *dev, Error > **errp) > cpu_mips_realize_env(&cpu->env); > > cpu_reset(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > mcc->parent_realize(dev, errp); > } > diff --git a/target/moxie/cpu.c b/target/moxie/cpu.c > index 46434e65ba..5d55fcf313 100644 > --- a/target/moxie/cpu.c > +++ b/target/moxie/cpu.c > @@ -66,7 +66,9 @@ static void moxie_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > cpu_reset(cs); > > mcc->parent_realize(dev, errp); > diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c > index fbfaa2ce26..5c7b4b486e 100644 > --- a/target/nios2/cpu.c > +++ b/target/nios2/cpu.c > @@ -94,7 +94,9 @@ static void nios2_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > cpu_reset(cs); > > ncc->parent_realize(dev, errp); > diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c > index 541b2a66c7..f8ec7deb38 100644 > --- a/target/openrisc/cpu.c > +++ b/target/openrisc/cpu.c > @@ -83,7 +83,9 @@ static void openrisc_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > cpu_reset(cs); > > occ->parent_realize(dev, errp); > diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c > index 0bd555eb19..a100eacde0 100644 > --- a/target/ppc/translate_init.inc.c > +++ b/target/ppc/translate_init.inc.c > @@ -9795,7 +9795,9 @@ static void ppc_cpu_realize(DeviceState *dev, Error > **errp) > gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg, > pcc->gdb_num_sprs, "power-spr.xml", 0); > #endif > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + goto unrealize; > + } > > pcc->parent_realize(dev, errp); > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index d61bce6d55..12d18d5ca5 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -307,7 +307,9 @@ static void riscv_cpu_realize(DeviceState *dev, Error > **errp) > > riscv_cpu_register_gdb_regs_for_features(cs); > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > cpu_reset(cs); > > mcc->parent_realize(dev, errp); > diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c > index 698dd9cb82..9959f96b03 100644 > --- a/target/s390x/cpu.c > +++ b/target/s390x/cpu.c > @@ -219,7 +219,9 @@ static void s390_cpu_realizefn(DeviceState *dev, Error > **errp) > qemu_register_reset(s390_cpu_machine_reset_cb, cpu); > #endif > s390_cpu_gdb_init(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > /* > * KVM requires the initial CPU reset ioctl to be executed on the target > diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c > index b9f393b7c7..d32ef2e1cb 100644 > --- a/target/sh4/cpu.c > +++ b/target/sh4/cpu.c > @@ -196,7 +196,9 @@ static void superh_cpu_realizefn(DeviceState *dev, Error > **errp) > } > > cpu_reset(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > scc->parent_realize(dev, errp); > } > diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c > index 4a4445bdf5..a511c90dab 100644 > --- a/target/sparc/cpu.c > +++ b/target/sparc/cpu.c > @@ -772,7 +772,9 @@ static void sparc_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > scc->parent_realize(dev, errp); > } > diff --git a/target/tilegx/cpu.c b/target/tilegx/cpu.c > index bfe9be59b5..234148fabd 100644 > --- a/target/tilegx/cpu.c > +++ b/target/tilegx/cpu.c > @@ -92,7 +92,9 @@ static void tilegx_cpu_realizefn(DeviceState *dev, Error > **errp) > } > > cpu_reset(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > tcc->parent_realize(dev, errp); > } > diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c > index e8d37e4040..67e3eb03d9 100644 > --- a/target/tricore/cpu.c > +++ b/target/tricore/cpu.c > @@ -96,7 +96,9 @@ static void tricore_cpu_realizefn(DeviceState *dev, Error > **errp) > set_feature(env, TRICORE_FEATURE_13); > } > cpu_reset(cs); > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > tcc->parent_realize(dev, errp); > } > diff --git a/target/unicore32/cpu.c b/target/unicore32/cpu.c > index 2b49d1ca40..0c737c3187 100644 > --- a/target/unicore32/cpu.c > +++ b/target/unicore32/cpu.c > @@ -96,7 +96,9 @@ static void uc32_cpu_realizefn(DeviceState *dev, Error > **errp) > return; > } > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > ucc->parent_realize(dev, errp); > } > diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c > index a54dbe4260..d2351c9b20 100644 > --- a/target/xtensa/cpu.c > +++ b/target/xtensa/cpu.c > @@ -131,7 +131,9 @@ static void xtensa_cpu_realizefn(DeviceState *dev, Error > **errp) > > cs->gdb_num_regs = xcc->config->gdb_regmap.num_regs; > > - qemu_init_vcpu(cs); > + if (!qemu_init_vcpu(cs, errp)) { > + return; > + } > > xcc->parent_realize(dev, errp); > } -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature