* [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check @ 2018-11-01 10:17 Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails Fei Li ` (10 more replies) 0 siblings, 11 replies; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela Hi, This idea comes from BiteSizedTasks, and this patch series implement the error checking of qemu_thread_create: make qemu_thread_create return a flag to indicate if it succeeded rather than failing with an error; make all callers check it. The first and the third patch fixes some segmentation faults occured during the debugging. The second patch paves the way for the last patch as that patch is too long. The last patch modifies the qemu_thread_create() and makes it return a bool to all direct callers to indicate if it succeeds. The middle five fix some migration issues. Please help to review, thanks. :) v7: - Split the previous multifd-migration into two patches: the src and the dst. For the dst, only dump the error instead of quitting. - Safely do the cleanup for postcopy_ram_enable_notify(). - Split the previous migration-error-handling patch into two patches. v6: - Add a new migration-multifd related patch. BTW, delete the previous vnc related patch as it has been upstreamed. - Use error_setg_errno() to set the errno when qemu_thread_create() fails for both Linux and Windows implementation. - Optimize the first patch, less codes are needed v5: - Remove `errno = err` in qemu_thread_create() for Linux, and change `return errno` to `return -1` in qemu_signal_init() to indicate the error in case qemu_thread_create() fails. - Delete the v4-added qemu_cond/mutex_destroy() in iothread_complete() as the destroy() will be done by its callers' object_unref(). v4: - Separate the migration compression patch from this series - Add one more error handling patch related with migration - Add more cleaning up code for touched functions v3: - Add two migration related patches to fix the segmentaion fault - Extract the segmentation fault fix from v2's last patch to be a separate patch - Add cleaning up code for touched functions - Update some error messages v2: - Pass errp straightly instead of using a local_err & error_propagate - Return a bool: false/true to indicate if one function succeeds - Merge v1's last two patches into one to avoid the compile error - Fix one omitted error in patch1 and update some error messages Fei Li (9): Fix segmentation fault when qemu_signal_init fails qemu_init_vcpu: add a new Error parameter to propagate qemu_thread_join: fix segmentation fault migration: fix some segmentation faults when using multifd migration: fix the multifd code when sending less channels migration: fix the multifd code when receiving less channels migration: remove unused &local_err parameter in migrate_set_error migration: add more error handling for postcopy_ram_enable_notify qemu_thread_create: propagate the error to callers to handle accel/tcg/user-exec-stub.c | 3 +- cpus.c | 79 ++++++++++++++++++++++++-------------- dump.c | 6 ++- hw/misc/edu.c | 6 ++- hw/ppc/spapr_hcall.c | 10 ++++- hw/rdma/rdma_backend.c | 4 +- hw/usb/ccid-card-emulated.c | 15 ++++++-- include/qemu/thread.h | 4 +- include/qom/cpu.h | 2 +- io/task.c | 3 +- iothread.c | 16 +++++--- migration/channel.c | 11 +++--- migration/migration.c | 68 +++++++++++++++++++++------------ migration/migration.h | 2 +- migration/postcopy-ram.c | 15 +++++++- migration/ram.c | 84 ++++++++++++++++++++++++++++++----------- migration/ram.h | 4 +- migration/savevm.c | 12 ++++-- 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 +- tests/atomic_add-bench.c | 3 +- tests/iothread.c | 2 +- tests/qht-bench.c | 3 +- tests/rcutorture.c | 3 +- tests/test-aio.c | 2 +- tests/test-rcu-list.c | 3 +- ui/vnc-jobs.c | 17 ++++++--- ui/vnc-jobs.h | 2 +- ui/vnc.c | 4 +- util/compatfd.c | 12 +++++- util/main-loop.c | 8 ++-- util/oslib-posix.c | 17 +++++++-- util/qemu-thread-posix.c | 27 +++++++++---- util/qemu-thread-win32.c | 18 ++++++--- util/rcu.c | 3 +- util/thread-pool.c | 4 +- 55 files changed, 388 insertions(+), 168 deletions(-) -- 2.13.7 ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-05 13:32 ` Juan Quintela 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 2/9] qemu_init_vcpu: add a new Error parameter to propagate Fei Li ` (9 subsequent siblings) 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela When qemu_signal_init() fails in qemu_init_main_loop(), we return without setting an error. Its callers crash then when they try to report the error with error_report_err(). To avoid such segmentation fault, add a new Error parameter to make the call trace to propagate the err to the final caller. Cc: Markus Armbruster <armbru@redhat.com> Cc: Fam Zheng <famz@redhat.com> Signed-off-by: Fei Li <fli@suse.com> Reviewed-by: Fam Zheng <famz@redhat.com> --- util/main-loop.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/main-loop.c b/util/main-loop.c index affe0403c5..443cb4cfe8 100644 --- a/util/main-loop.c +++ b/util/main-loop.c @@ -71,7 +71,7 @@ static void sigfd_handler(void *opaque) } } -static int qemu_signal_init(void) +static int qemu_signal_init(Error **errp) { int sigfd; sigset_t set; @@ -96,7 +96,7 @@ static int qemu_signal_init(void) sigdelset(&set, SIG_IPI); sigfd = qemu_signalfd(&set); if (sigfd == -1) { - fprintf(stderr, "failed to create signalfd\n"); + error_setg_errno(errp, errno, "failed to create signalfd"); return -errno; } @@ -109,7 +109,7 @@ static int qemu_signal_init(void) #else /* _WIN32 */ -static int qemu_signal_init(void) +static int qemu_signal_init(Error **errp) { return 0; } @@ -148,7 +148,7 @@ int qemu_init_main_loop(Error **errp) init_clocks(qemu_timer_notify_cb); - ret = qemu_signal_init(); + ret = qemu_signal_init(errp); if (ret) { return ret; } -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails Fei Li @ 2018-11-05 13:32 ` Juan Quintela 2018-11-06 5:08 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Juan Quintela @ 2018-11-05 13:32 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, peterx Fei Li <fli@suse.com> wrote: > When qemu_signal_init() fails in qemu_init_main_loop(), we return > without setting an error. Its callers crash then when they try to > report the error with error_report_err(). > > To avoid such segmentation fault, add a new Error parameter to make > the call trace to propagate the err to the final caller. Hi I agree that there is a bug that exist here. But I think that the patch is not 100% correct. What is the warrantee that when we call qemu_signal_init() errp is not *already* assigned. I think that we need to use here the same code that in the call to aio_context_new() ... i.e. intsead of this > init_clocks(qemu_timer_notify_cb); > > - ret = qemu_signal_init(); > + ret = qemu_signal_init(errp); > if (ret) { > return ret; > } init_clocks(qemu_timer_notify_cb); ret = qemu_signal_init(); ret = qemu_signal_init(&local_error); if (ret) { error_propagate(errp, local_error); return ret; } This way it works correctly if errp is NULL, errp is already assigned, etc, etc, Or I am missing something? Later, Juan. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails 2018-11-05 13:32 ` Juan Quintela @ 2018-11-06 5:08 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-06 5:08 UTC (permalink / raw) To: quintela; +Cc: peterx, famz, qemu-devel, dgilbert, armbru Hi, On 11/05/2018 09:32 PM, Juan Quintela wrote: > Fei Li <fli@suse.com> wrote: >> When qemu_signal_init() fails in qemu_init_main_loop(), we return >> without setting an error. Its callers crash then when they try to >> report the error with error_report_err(). >> >> To avoid such segmentation fault, add a new Error parameter to make >> the call trace to propagate the err to the final caller. > Hi > > I agree that there is a bug that exist here. But I think that the patch > is not 100% correct. What is the warrantee that when we call > qemu_signal_init() errp is not *already* assigned. > > I think that we need to use here the same code that in the call to > aio_context_new() ... > > i.e. > > > intsead of this > >> init_clocks(qemu_timer_notify_cb); >> >> - ret = qemu_signal_init(); >> + ret = qemu_signal_init(errp); >> if (ret) { >> return ret; >> } > init_clocks(qemu_timer_notify_cb); > > ret = qemu_signal_init(); > ret = qemu_signal_init(&local_error); > if (ret) { > error_propagate(errp, local_error); > return ret; > } > > This way it works correctly if errp is NULL, errp is already assigned, > etc, etc, > > Or I am missing something? > > Later, Juan. We have discussed this in the first round of this patch series, just as Daniel and Fam said, we only need the local_err & error_propagate() when functions like object_new_with_propv() returns void, in that way we need the &local_err to check whether that function succeeds. But in qemu_signal_init, we have the "if (ret) {...}" to judge whether it succeeds. For more details, the following threads can be referred: 09/04/2018 07:26 PM Re: [Qemu-devel] [PATCH 1/5] Fix segmentation fault when qemu_signal_init fails BTW, if qemu_signalfd() fails, we use an "error_setg_errno()" to handle: - for NULL errp, we just set the error message to errp; - for not-NULL errp, besides the error_setv() we have the error_handle_fatal(errp, err). If the passed errp is &error_fatal/&error_abort, qemu will exit(1) right here. Have a nice day, thanks :) Fei ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 2/9] qemu_init_vcpu: add a new Error parameter to propagate 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-05 13:34 ` Juan Quintela 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 3/9] qemu_thread_join: fix segmentation fault Fei Li ` (8 subsequent siblings) 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela This patch is to pave the way for a later patch as it is too long: "qemu_thread_create: propagate the error to callers to handle." The callers of qemu_init_vcpu() already passed the **errp to handle errors. In view of this, add a new Error parameter to all the 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. Signed-off-by: Fei Li <fli@suse.com> Reviewed-by: Fam Zheng <famz@redhat.com> --- accel/tcg/user-exec-stub.c | 3 ++- cpus.c | 34 +++++++++++++++++++++------------- 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, 87 insertions(+), 36 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 3978f63d8f..ed71618e1f 100644 --- a/cpus.c +++ b/cpus.c @@ -1919,7 +1919,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; @@ -1975,7 +1975,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]; @@ -1992,7 +1992,7 @@ static void qemu_hax_start_vcpu(CPUState *cpu) #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]; @@ -2005,7 +2005,7 @@ static void qemu_kvm_start_vcpu(CPUState *cpu) cpu, QEMU_THREAD_JOINABLE); } -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]; @@ -2023,7 +2023,7 @@ static void qemu_hvf_start_vcpu(CPUState *cpu) cpu, QEMU_THREAD_JOINABLE); } -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]; @@ -2039,7 +2039,7 @@ static void qemu_whpx_start_vcpu(CPUState *cpu) #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]; @@ -2052,11 +2052,12 @@ static void qemu_dummy_start_vcpu(CPUState *cpu) QEMU_THREAD_JOINABLE); } -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, @@ -2067,22 +2068,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 def0c64308..442ac80d27 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -1012,7 +1012,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 a953897fcc..bf3c34516d 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 8f16e96b6c..85a96554fb 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -1036,7 +1036,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 1469a1be01..81fd4a365c 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5112,7 +5112,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 9b546a2c18..3906c864a3 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 8d67eb6727..8581a6d922 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 fb7cb5c507..a6dcdb9df9 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 ee9432eb15..a4c392eb21 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -9694,7 +9694,9 @@ static void ppc_cpu_realize(DeviceState *dev, Error **errp) 32, "power-vsx.xml", 0); } - 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 a025a0a3ba..9829fd9bc4 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -305,7 +305,9 @@ static void riscv_cpu_realize(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/s390x/cpu.c b/target/s390x/cpu.c index 18ba7f85a5..2a3eac9761 100644 --- a/target/s390x/cpu.c +++ b/target/s390x/cpu.c @@ -222,7 +222,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 0f090ece54..9c22f6a7df 100644 --- a/target/sparc/cpu.c +++ b/target/sparc/cpu.c @@ -773,7 +773,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 2edaef1aef..5482d6ea3f 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); } -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 2/9] qemu_init_vcpu: add a new Error parameter to propagate 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 2/9] qemu_init_vcpu: add a new Error parameter to propagate Fei Li @ 2018-11-05 13:34 ` Juan Quintela 0 siblings, 0 replies; 32+ messages in thread From: Juan Quintela @ 2018-11-05 13:34 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, peterx Fei Li <fli@suse.com> wrote: > This patch is to pave the way for a later patch as it is too long: > "qemu_thread_create: propagate the error to callers to handle." > > The callers of qemu_init_vcpu() already passed the **errp to handle > errors. In view of this, add a new Error parameter to all the > 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. > > Signed-off-by: Fei Li <fli@suse.com> > Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 3/9] qemu_thread_join: fix segmentation fault 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 2/9] qemu_init_vcpu: add a new Error parameter to propagate Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd Fei Li ` (7 subsequent siblings) 10 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela To avoid the segmentation fault in qemu_thread_join(), just directly return when the QemuThread *thread failed to be created in either qemu-thread-posix.c or qemu-thread-win32.c. Signed-off-by: Fei Li <fli@suse.com> Reviewed-by: Fam Zheng <famz@redhat.com> --- util/qemu-thread-posix.c | 3 +++ util/qemu-thread-win32.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index dfa66ff2fb..289af4fab5 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -562,6 +562,9 @@ void *qemu_thread_join(QemuThread *thread) int err; void *ret; + if (!thread->thread) { + return NULL; + } err = pthread_join(thread->thread, &ret); if (err) { error_exit(err, __func__); diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c index 4a363ca675..1a27e1cf6f 100644 --- a/util/qemu-thread-win32.c +++ b/util/qemu-thread-win32.c @@ -366,7 +366,7 @@ void *qemu_thread_join(QemuThread *thread) HANDLE handle; data = thread->data; - if (data->mode == QEMU_THREAD_DETACHED) { + if (data == NULL || data->mode == QEMU_THREAD_DETACHED) { return NULL; } -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (2 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 3/9] qemu_thread_join: fix segmentation fault Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-02 2:31 ` Peter Xu 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels Fei Li ` (6 subsequent siblings) 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela When multifd is used during migration, a segmentaion fault will occur in the source when multifd_save_cleanup() is called again if the multifd_send_state has been freed in earlier error handling. This can happen when migrate_fd_connect() fails and multifd_fd_cleanup() is called, and then multifd_new_send_channel_async() fails and multifd_save_cleanup() is called again. If the QIOChannel *c of multifd_recv_state->params[i] (p->c) is not initialized, there is no need to close the channel. Or else a segmentation fault will occur in multifd_recv_terminate_threads() when multifd_recv_initial_packet() fails. Signed-off-by: Fei Li <fli@suse.com> --- migration/ram.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 7e7deec4d8..4db3b3e8f4 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -907,6 +907,11 @@ static void multifd_send_terminate_threads(Error *err) } } + /* in case multifd_send_state has been freed earlier */ + if (!multifd_send_state) { + return; + } + for (i = 0; i < migrate_multifd_channels(); i++) { MultiFDSendParams *p = &multifd_send_state->params[i]; @@ -922,7 +927,7 @@ int multifd_save_cleanup(Error **errp) int i; int ret = 0; - if (!migrate_use_multifd()) { + if (!migrate_use_multifd() || !multifd_send_state) { return 0; } multifd_send_terminate_threads(NULL); @@ -960,7 +965,7 @@ static void multifd_send_sync_main(void) { int i; - if (!migrate_use_multifd()) { + if (!migrate_use_multifd() || !multifd_send_state) { return; } if (multifd_send_state->pages->used) { @@ -1070,6 +1075,10 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); Error *local_err = NULL; + if (!multifd_send_state) { + return; + } + if (qio_task_propagate_error(task, &local_err)) { if (multifd_save_cleanup(&local_err) != 0) { migrate_set_error(migrate_get_current(), local_err); @@ -1131,7 +1140,7 @@ struct { uint64_t packet_num; } *multifd_recv_state; -static void multifd_recv_terminate_threads(Error *err) +static void multifd_recv_terminate_threads(Error *err, bool channel) { int i; @@ -1145,6 +1154,11 @@ static void multifd_recv_terminate_threads(Error *err) } } + /* in case p->c is not initialized */ + if (!channel) { + return; + } + for (i = 0; i < migrate_multifd_channels(); i++) { MultiFDRecvParams *p = &multifd_recv_state->params[i]; @@ -1166,7 +1180,7 @@ int multifd_load_cleanup(Error **errp) if (!migrate_use_multifd()) { return 0; } - multifd_recv_terminate_threads(NULL); + multifd_recv_terminate_threads(NULL, true); for (i = 0; i < migrate_multifd_channels(); i++) { MultiFDRecvParams *p = &multifd_recv_state->params[i]; @@ -1269,7 +1283,7 @@ static void *multifd_recv_thread(void *opaque) } if (local_err) { - multifd_recv_terminate_threads(local_err); + multifd_recv_terminate_threads(local_err, true); } qemu_mutex_lock(&p->mutex); p->running = false; @@ -1331,7 +1345,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) id = multifd_recv_initial_packet(ioc, &local_err); if (id < 0) { - multifd_recv_terminate_threads(local_err); + multifd_recv_terminate_threads(local_err, false); return false; } @@ -1339,7 +1353,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) if (p->c != NULL) { error_setg(&local_err, "multifd: received id '%d' already setup'", id); - multifd_recv_terminate_threads(local_err); + multifd_recv_terminate_threads(local_err, true); return false; } p->c = ioc; -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd Fei Li @ 2018-11-02 2:31 ` Peter Xu 2018-11-02 6:03 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Peter Xu @ 2018-11-02 2:31 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On Thu, Nov 01, 2018 at 06:17:10PM +0800, Fei Li wrote: > When multifd is used during migration, a segmentaion fault will > occur in the source when multifd_save_cleanup() is called again if > the multifd_send_state has been freed in earlier error handling. This > can happen when migrate_fd_connect() fails and multifd_fd_cleanup() > is called, and then multifd_new_send_channel_async() fails and > multifd_save_cleanup() is called again. > > If the QIOChannel *c of multifd_recv_state->params[i] (p->c) is not > initialized, there is no need to close the channel. Or else a > segmentation fault will occur in multifd_recv_terminate_threads() > when multifd_recv_initial_packet() fails. It's a bit odd to me when I see that multifd_send_thread() calls multifd_send_terminate_threads(). Is that the reason that you encountered the problem? Instead of checking all these null pointers, IMHO we should just let multifd_send_terminate_threads() be called only in the main thread... > > Signed-off-by: Fei Li <fli@suse.com> > --- > migration/ram.c | 28 +++++++++++++++++++++------- > 1 file changed, 21 insertions(+), 7 deletions(-) > > diff --git a/migration/ram.c b/migration/ram.c > index 7e7deec4d8..4db3b3e8f4 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -907,6 +907,11 @@ static void multifd_send_terminate_threads(Error *err) > } > } > > + /* in case multifd_send_state has been freed earlier */ > + if (!multifd_send_state) { > + return; > + } > + > for (i = 0; i < migrate_multifd_channels(); i++) { > MultiFDSendParams *p = &multifd_send_state->params[i]; > > @@ -922,7 +927,7 @@ int multifd_save_cleanup(Error **errp) > int i; > int ret = 0; > > - if (!migrate_use_multifd()) { > + if (!migrate_use_multifd() || !multifd_send_state) { > return 0; > } > multifd_send_terminate_threads(NULL); > @@ -960,7 +965,7 @@ static void multifd_send_sync_main(void) > { > int i; > > - if (!migrate_use_multifd()) { > + if (!migrate_use_multifd() || !multifd_send_state) { > return; > } > if (multifd_send_state->pages->used) { > @@ -1070,6 +1075,10 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); > Error *local_err = NULL; > > + if (!multifd_send_state) { > + return; > + } > + > if (qio_task_propagate_error(task, &local_err)) { > if (multifd_save_cleanup(&local_err) != 0) { > migrate_set_error(migrate_get_current(), local_err); > @@ -1131,7 +1140,7 @@ struct { > uint64_t packet_num; > } *multifd_recv_state; > > -static void multifd_recv_terminate_threads(Error *err) > +static void multifd_recv_terminate_threads(Error *err, bool channel) > { > int i; > > @@ -1145,6 +1154,11 @@ static void multifd_recv_terminate_threads(Error *err) > } > } > > + /* in case p->c is not initialized */ > + if (!channel) { > + return; > + } > + > for (i = 0; i < migrate_multifd_channels(); i++) { > MultiFDRecvParams *p = &multifd_recv_state->params[i]; > > @@ -1166,7 +1180,7 @@ int multifd_load_cleanup(Error **errp) > if (!migrate_use_multifd()) { > return 0; > } > - multifd_recv_terminate_threads(NULL); > + multifd_recv_terminate_threads(NULL, true); > for (i = 0; i < migrate_multifd_channels(); i++) { > MultiFDRecvParams *p = &multifd_recv_state->params[i]; > > @@ -1269,7 +1283,7 @@ static void *multifd_recv_thread(void *opaque) > } > > if (local_err) { > - multifd_recv_terminate_threads(local_err); > + multifd_recv_terminate_threads(local_err, true); > } > qemu_mutex_lock(&p->mutex); > p->running = false; > @@ -1331,7 +1345,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) > > id = multifd_recv_initial_packet(ioc, &local_err); > if (id < 0) { > - multifd_recv_terminate_threads(local_err); > + multifd_recv_terminate_threads(local_err, false); > return false; > } > > @@ -1339,7 +1353,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) > if (p->c != NULL) { > error_setg(&local_err, "multifd: received id '%d' already setup'", > id); > - multifd_recv_terminate_threads(local_err); > + multifd_recv_terminate_threads(local_err, true); > return false; > } > p->c = ioc; > -- > 2.13.7 > Regards, -- Peter Xu ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd 2018-11-02 2:31 ` Peter Xu @ 2018-11-02 6:03 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-02 6:03 UTC (permalink / raw) To: Peter Xu; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On 11/02/2018 10:31 AM, Peter Xu wrote: > On Thu, Nov 01, 2018 at 06:17:10PM +0800, Fei Li wrote: >> When multifd is used during migration, a segmentaion fault will >> occur in the source when multifd_save_cleanup() is called again if >> the multifd_send_state has been freed in earlier error handling. This >> can happen when migrate_fd_connect() fails and multifd_fd_cleanup() >> is called, and then multifd_new_send_channel_async() fails and >> multifd_save_cleanup() is called again. >> >> If the QIOChannel *c of multifd_recv_state->params[i] (p->c) is not >> initialized, there is no need to close the channel. Or else a >> segmentation fault will occur in multifd_recv_terminate_threads() >> when multifd_recv_initial_packet() fails. > It's a bit odd to me when I see that multifd_send_thread() calls > multifd_send_terminate_threads(). Is that the reason that you > encountered the problem? Yes, this is one of the reason. Actually this problem almost does not occur before this patch series, but as this patch series is trying to make qemu_thread_create() be more robust, I find this problem during the debugging. ;) The second situation is when using multifd (in this way multifd_new_send_channel_asyn()[1] is called several times) and once one channel fails in [1], the later channels will encounter the segmentation fault problem when enters [1] again. And the third is after applying the last patch, I mean after multifd_save_setup=> socket_send_channel_create(multifd_new_send_channel_async, p) successfully, but then qemu_thread_create(migration_thread) fails, I assume here we need to do some migration cleanup, like migrate_fd_cleanup() or something similar like the vm_start() in migration_iteration_finish()? The fourth is when multifd_new_send_channel_async()[1] fails and multifd_save_cleanup() is called, then multifd_send_sync_main <= qemu_savevm_state_setup <= migration_thread[2] is called. (BTW, I find that sometimes [2] is called earlier than [1], but sometimes later the first channel) > Instead of checking all these null pointers, IMHO we should just let > multifd_send_terminate_threads() be called only in the main thread... Ok, from your reply in patch5/9, I know we should offer better isolation and just let the main thread handle these cleanup.:) >> Signed-off-by: Fei Li <fli@suse.com> >> --- >> migration/ram.c | 28 +++++++++++++++++++++------- >> 1 file changed, 21 insertions(+), 7 deletions(-) >> >> diff --git a/migration/ram.c b/migration/ram.c >> index 7e7deec4d8..4db3b3e8f4 100644 >> --- a/migration/ram.c >> +++ b/migration/ram.c >> @@ -907,6 +907,11 @@ static void multifd_send_terminate_threads(Error *err) >> } >> } >> >> + /* in case multifd_send_state has been freed earlier */ >> + if (!multifd_send_state) { >> + return; >> + } >> + >> for (i = 0; i < migrate_multifd_channels(); i++) { >> MultiFDSendParams *p = &multifd_send_state->params[i]; The above one is the first case. >> >> @@ -922,7 +927,7 @@ int multifd_save_cleanup(Error **errp) >> int i; >> int ret = 0; >> >> - if (!migrate_use_multifd()) { >> + if (!migrate_use_multifd() || !multifd_send_state) { >> return 0; >> } >> multifd_send_terminate_threads(NULL); The above one is the third case. >> @@ -960,7 +965,7 @@ static void multifd_send_sync_main(void) >> { >> int i; >> >> - if (!migrate_use_multifd()) { >> + if (!migrate_use_multifd() || !multifd_send_state) { >> return; >> } >> if (multifd_send_state->pages->used) { The above one is the fourth case. >> @@ -1070,6 +1075,10 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >> QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); >> Error *local_err = NULL; >> >> + if (!multifd_send_state) { >> + return; >> + } >> + >> if (qio_task_propagate_error(task, &local_err)) { >> if (multifd_save_cleanup(&local_err) != 0) { >> migrate_set_error(migrate_get_current(), local_err); The above one is the second case. >> @@ -1131,7 +1140,7 @@ struct { >> uint64_t packet_num; >> } *multifd_recv_state; Below is to fix the second paragraph (p->c) in the commit message. :) >> >> -static void multifd_recv_terminate_threads(Error *err) >> +static void multifd_recv_terminate_threads(Error *err, bool channel) >> { >> int i; >> >> @@ -1145,6 +1154,11 @@ static void multifd_recv_terminate_threads(Error *err) >> } >> } >> >> + /* in case p->c is not initialized */ >> + if (!channel) { >> + return; >> + } >> + >> for (i = 0; i < migrate_multifd_channels(); i++) { >> MultiFDRecvParams *p = &multifd_recv_state->params[i]; >> >> @@ -1166,7 +1180,7 @@ int multifd_load_cleanup(Error **errp) >> if (!migrate_use_multifd()) { >> return 0; >> } >> - multifd_recv_terminate_threads(NULL); >> + multifd_recv_terminate_threads(NULL, true); >> for (i = 0; i < migrate_multifd_channels(); i++) { >> MultiFDRecvParams *p = &multifd_recv_state->params[i]; >> >> @@ -1269,7 +1283,7 @@ static void *multifd_recv_thread(void *opaque) >> } >> >> if (local_err) { >> - multifd_recv_terminate_threads(local_err); >> + multifd_recv_terminate_threads(local_err, true); >> } >> qemu_mutex_lock(&p->mutex); >> p->running = false; >> @@ -1331,7 +1345,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) >> >> id = multifd_recv_initial_packet(ioc, &local_err); >> if (id < 0) { >> - multifd_recv_terminate_threads(local_err); >> + multifd_recv_terminate_threads(local_err, false); >> return false; >> } >> >> @@ -1339,7 +1353,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) >> if (p->c != NULL) { >> error_setg(&local_err, "multifd: received id '%d' already setup'", >> id); >> - multifd_recv_terminate_threads(local_err); >> + multifd_recv_terminate_threads(local_err, true); >> return false; >> } >> p->c = ioc; >> -- >> 2.13.7 >> > Regards, > Have a nice day, thanks for the comment. :) Fei ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (3 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-02 2:37 ` Peter Xu 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving " Fei Li ` (5 subsequent siblings) 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela Set the migration state to "failed" instead of "setup" when failing to send packet via some channel. Cc: Peter Xu <peterx@redhat.com> Signed-off-by: Fei Li <fli@suse.com> --- migration/ram.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index 4db3b3e8f4..c84d164fc8 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1072,6 +1072,7 @@ out: static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) { MultiFDSendParams *p = opaque; + MigrationState *s = migrate_get_current(); QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); Error *local_err = NULL; @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) if (multifd_save_cleanup(&local_err) != 0) { migrate_set_error(migrate_get_current(), local_err); } + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); } else { p->c = QIO_CHANNEL(sioc); qio_channel_set_delay(p->c, false); -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels Fei Li @ 2018-11-02 2:37 ` Peter Xu 2018-11-02 3:00 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Peter Xu @ 2018-11-02 2:37 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: > Set the migration state to "failed" instead of "setup" when failing > to send packet via some channel. Could you please provide more information in the commit message? E.g., what will happen if without this patch? Will it crash the source or stall the source migration or others? Otherwise it's a bit hard for me to understand what's this patch for. Normally I would prefer to not touch global states in feature specific code path, but I'd like to know the problem more first... Thanks, > > Cc: Peter Xu <peterx@redhat.com> > Signed-off-by: Fei Li <fli@suse.com> > --- > migration/ram.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/migration/ram.c b/migration/ram.c > index 4db3b3e8f4..c84d164fc8 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -1072,6 +1072,7 @@ out: > static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > { > MultiFDSendParams *p = opaque; > + MigrationState *s = migrate_get_current(); > QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); > Error *local_err = NULL; > > @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > if (multifd_save_cleanup(&local_err) != 0) { > migrate_set_error(migrate_get_current(), local_err); > } > + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); > } else { > p->c = QIO_CHANNEL(sioc); > qio_channel_set_delay(p->c, false); > -- > 2.13.7 > Regards, -- Peter Xu ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-02 2:37 ` Peter Xu @ 2018-11-02 3:00 ` Fei Li 2018-11-02 3:32 ` Peter Xu 0 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-02 3:00 UTC (permalink / raw) To: Peter Xu; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On 11/02/2018 10:37 AM, Peter Xu wrote: > On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: >> Set the migration state to "failed" instead of "setup" when failing >> to send packet via some channel. > Could you please provide more information in the commit message? > E.g., what will happen if without this patch? Will it crash the > source or stall the source migration or others? Otherwise it's a bit > hard for me to understand what's this patch for. Sorry for the inadequate description , I was intended to say that when failing to do the live migration using multifd, e.g. sending less channels, the src status displays "setup" when running `info migrate`. I assume we should tell users that the "Migration status" is "failed" now (and along with the failure reason). The current src status when failed inmultifd_new_send_channel_async(): (qemu) migrate_set_capability x-multifd on (qemu) migrate_set_parameter x-multifd-channels 4 (qemu) migrate -d tcp:192.168.190.98:4444 (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async due to ... (qemu) info migrate globals: store-global-state: on only-migratable: off send-configuration: on send-section-footer: on decompress-error-check: on capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: off compress: off events: off postcopy-ram: off x-colo: off release-ram: off block: off return-path: off pause-before-switchover: off x-multifd: on dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off Migration status: setup total time: 0 milliseconds > > Normally I would prefer to not touch global states in feature specific > code path, but I'd like to know the problem more first... > > Thanks, > >> Cc: Peter Xu <peterx@redhat.com> >> Signed-off-by: Fei Li <fli@suse.com> >> --- >> migration/ram.c | 2 ++ >> 1 file changed, 2 insertions(+) >> >> diff --git a/migration/ram.c b/migration/ram.c >> index 4db3b3e8f4..c84d164fc8 100644 >> --- a/migration/ram.c >> +++ b/migration/ram.c >> @@ -1072,6 +1072,7 @@ out: >> static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >> { >> MultiFDSendParams *p = opaque; >> + MigrationState *s = migrate_get_current(); >> QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); >> Error *local_err = NULL; >> >> @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >> if (multifd_save_cleanup(&local_err) != 0) { >> migrate_set_error(migrate_get_current(), local_err); >> } >> + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); >> } else { >> p->c = QIO_CHANNEL(sioc); >> qio_channel_set_delay(p->c, false); >> -- >> 2.13.7 >> > Regards, > ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-02 3:00 ` Fei Li @ 2018-11-02 3:32 ` Peter Xu 2018-11-02 7:13 ` Fei Li 2018-11-02 16:33 ` Dr. David Alan Gilbert 0 siblings, 2 replies; 32+ messages in thread From: Peter Xu @ 2018-11-02 3:32 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On Fri, Nov 02, 2018 at 11:00:24AM +0800, Fei Li wrote: > > > On 11/02/2018 10:37 AM, Peter Xu wrote: > > On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: > > > Set the migration state to "failed" instead of "setup" when failing > > > to send packet via some channel. > > Could you please provide more information in the commit message? > > E.g., what will happen if without this patch? Will it crash the > > source or stall the source migration or others? Otherwise it's a bit > > hard for me to understand what's this patch for. > Sorry for the inadequate description , I was intended to say that when > failing > to do the live migration using multifd, e.g. sending less channels, the src > status displays "setup" when running `info migrate`. I assume we should tell > users that the "Migration status" is "failed" now (and along with the > failure reason). > > The current src status when failed inmultifd_new_send_channel_async(): > > > (qemu) migrate_set_capability x-multifd on > (qemu) migrate_set_parameter x-multifd-channels 4 > (qemu) migrate -d tcp:192.168.190.98:4444 > (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async due to > ... > (qemu) info migrate > globals: > store-global-state: on > only-migratable: off > send-configuration: on > send-section-footer: on > decompress-error-check: on > capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: > off compress: off events: off postcopy-ram: off x-colo: off release-ram: off > block: off return-path: off pause-before-switchover: off x-multifd: on > dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off > Migration status: setup > total time: 0 milliseconds Thanks for the information. I had a quick look. For now we do this: multifd_save_setup (without waiting for channels to be ready) create thread migration_thread (in thread) ram_save_setup multifd_send_sync_main (wait for the channels) The thing is that we didn't get the notification when one of the multifd channel is failed. IMHO instead of setting the global migration state in a per-channel function, we should just report the error upwards, then the main thread should decide how to change the state machine of the migration. And we have set it in migrate_set_error() after all so the main thread should be able to know somehow (though IMHO I'll even prefer to have a per-channel variable to keep the state of the channel, then the per-channel functions won't touch any globals which offers better isolation). I'm not sure how Juan thinks about it, but I'd prefer some work to provide such isolation and also some mechanism to allow the main thread to detect the per-channel errors not only during setup phase but also during the migration (e.g., when network is suddenly down). Then we don't touch any globals (e.g., we shouldn't call migrate_get_current in any per-channel function like multifd_new_send_channel_async). > > > > > Normally I would prefer to not touch global states in feature specific > > code path, but I'd like to know the problem more first... > > > > Thanks, > > > > > Cc: Peter Xu <peterx@redhat.com> > > > Signed-off-by: Fei Li <fli@suse.com> > > > --- > > > migration/ram.c | 2 ++ > > > 1 file changed, 2 insertions(+) > > > > > > diff --git a/migration/ram.c b/migration/ram.c > > > index 4db3b3e8f4..c84d164fc8 100644 > > > --- a/migration/ram.c > > > +++ b/migration/ram.c > > > @@ -1072,6 +1072,7 @@ out: > > > static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > > > { > > > MultiFDSendParams *p = opaque; > > > + MigrationState *s = migrate_get_current(); > > > QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); > > > Error *local_err = NULL; > > > @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > > > if (multifd_save_cleanup(&local_err) != 0) { > > > migrate_set_error(migrate_get_current(), local_err); > > > } > > > + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); > > > } else { > > > p->c = QIO_CHANNEL(sioc); > > > qio_channel_set_delay(p->c, false); > > > -- > > > 2.13.7 > > > > > Regards, > > > Regards, -- Peter Xu ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-02 3:32 ` Peter Xu @ 2018-11-02 7:13 ` Fei Li 2018-11-02 7:32 ` Peter Xu 2018-11-02 16:33 ` Dr. David Alan Gilbert 1 sibling, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-02 7:13 UTC (permalink / raw) To: Peter Xu; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On 11/02/2018 11:32 AM, Peter Xu wrote: > On Fri, Nov 02, 2018 at 11:00:24AM +0800, Fei Li wrote: >> >> On 11/02/2018 10:37 AM, Peter Xu wrote: >>> On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: >>>> Set the migration state to "failed" instead of "setup" when failing >>>> to send packet via some channel. >>> Could you please provide more information in the commit message? >>> E.g., what will happen if without this patch? Will it crash the >>> source or stall the source migration or others? Otherwise it's a bit >>> hard for me to understand what's this patch for. >> Sorry for the inadequate description , I was intended to say that when >> failing >> to do the live migration using multifd, e.g. sending less channels, the src >> status displays "setup" when running `info migrate`. I assume we should tell >> users that the "Migration status" is "failed" now (and along with the >> failure reason). >> >> The current src status when failed inmultifd_new_send_channel_async(): >> >> >> (qemu) migrate_set_capability x-multifd on >> (qemu) migrate_set_parameter x-multifd-channels 4 >> (qemu) migrate -d tcp:192.168.190.98:4444 >> (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async due to >> ... >> (qemu) info migrate >> globals: >> store-global-state: on >> only-migratable: off >> send-configuration: on >> send-section-footer: on >> decompress-error-check: on >> capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: >> off compress: off events: off postcopy-ram: off x-colo: off release-ram: off >> block: off return-path: off pause-before-switchover: off x-multifd: on >> dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off >> Migration status: setup >> total time: 0 milliseconds > Thanks for the information. > > I had a quick look. For now we do this: > > multifd_save_setup (without waiting for channels to be ready) > create thread migration_thread > (in thread) > ram_save_setup > multifd_send_sync_main (wait for the channels) > > The thing is that we didn't get the notification when one of the > multifd channel is failed. IMHO instead of setting the global > migration state in a per-channel function, we should just report the > error upwards, then the main thread should decide how to change the > state machine of the migration. Thanks for the detail explanation, do agree with reporting and letting the main thread handle this. :) But one thing to note is that during my previous debugging, I remember sometimes the main thread: migration_thread() is called earlier than the first channel is ready in multifd_new_send_channel_async(). Thus we should be careful about where/when to check the state of the channel. > And we have set it in migrate_set_error() after all so the main thread > should be able to know somehow But in our current code, the main thread has not utilized the s->error to know whether the migration state, right? As I checked the code, the s->error is only used - in qmp query: copy s->error to info->error_desc when detecting the migrate status is failed; - in migrate_fd_cleanup() when migrate_fd_connect() fails: print the error Or the s->error is just used in this way? > (though IMHO I'll even prefer to have a > per-channel variable to keep the state of the channel, then the > per-channel functions won't touch any globals which offers better > isolation). > > I'm not sure how Juan thinks about it, but I'd prefer some work to > provide such isolation and also some mechanism to allow the main > thread to detect the per-channel errors not only during setup phase > but also during the migration (e.g., when network is suddenly down). > Then we don't touch any globals (e.g., we shouldn't call > migrate_get_current in any per-channel function like > multifd_new_send_channel_async). Ok, wait for Juan's comment. :) Have a nice day, and thanks again for the detail explanation. Fei >>> Normally I would prefer to not touch global states in feature specific >>> code path, but I'd like to know the problem more first... >>> >>> Thanks, >>> >>>> Cc: Peter Xu <peterx@redhat.com> >>>> Signed-off-by: Fei Li <fli@suse.com> >>>> --- >>>> migration/ram.c | 2 ++ >>>> 1 file changed, 2 insertions(+) >>>> >>>> diff --git a/migration/ram.c b/migration/ram.c >>>> index 4db3b3e8f4..c84d164fc8 100644 >>>> --- a/migration/ram.c >>>> +++ b/migration/ram.c >>>> @@ -1072,6 +1072,7 @@ out: >>>> static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >>>> { >>>> MultiFDSendParams *p = opaque; >>>> + MigrationState *s = migrate_get_current(); >>>> QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); >>>> Error *local_err = NULL; >>>> @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >>>> if (multifd_save_cleanup(&local_err) != 0) { >>>> migrate_set_error(migrate_get_current(), local_err); >>>> } >>>> + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); >>>> } else { >>>> p->c = QIO_CHANNEL(sioc); >>>> qio_channel_set_delay(p->c, false); >>>> -- >>>> 2.13.7 >>>> >>> Regards, >>> > Regards, > ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-02 7:13 ` Fei Li @ 2018-11-02 7:32 ` Peter Xu 0 siblings, 0 replies; 32+ messages in thread From: Peter Xu @ 2018-11-02 7:32 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On Fri, Nov 02, 2018 at 03:13:05PM +0800, Fei Li wrote: > > > On 11/02/2018 11:32 AM, Peter Xu wrote: > > On Fri, Nov 02, 2018 at 11:00:24AM +0800, Fei Li wrote: > > > > > > On 11/02/2018 10:37 AM, Peter Xu wrote: > > > > On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: > > > > > Set the migration state to "failed" instead of "setup" when failing > > > > > to send packet via some channel. > > > > Could you please provide more information in the commit message? > > > > E.g., what will happen if without this patch? Will it crash the > > > > source or stall the source migration or others? Otherwise it's a bit > > > > hard for me to understand what's this patch for. > > > Sorry for the inadequate description , I was intended to say that when > > > failing > > > to do the live migration using multifd, e.g. sending less channels, the src > > > status displays "setup" when running `info migrate`. I assume we should tell > > > users that the "Migration status" is "failed" now (and along with the > > > failure reason). > > > > > > The current src status when failed inmultifd_new_send_channel_async(): > > > > > > > > > (qemu) migrate_set_capability x-multifd on > > > (qemu) migrate_set_parameter x-multifd-channels 4 > > > (qemu) migrate -d tcp:192.168.190.98:4444 > > > (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async due to > > > ... > > > (qemu) info migrate > > > globals: > > > store-global-state: on > > > only-migratable: off > > > send-configuration: on > > > send-section-footer: on > > > decompress-error-check: on > > > capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: > > > off compress: off events: off postcopy-ram: off x-colo: off release-ram: off > > > block: off return-path: off pause-before-switchover: off x-multifd: on > > > dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off > > > Migration status: setup > > > total time: 0 milliseconds > > Thanks for the information. > > > > I had a quick look. For now we do this: > > > > multifd_save_setup (without waiting for channels to be ready) > > create thread migration_thread > > (in thread) > > ram_save_setup > > multifd_send_sync_main (wait for the channels) [1] > > > > The thing is that we didn't get the notification when one of the > > multifd channel is failed. IMHO instead of setting the global > > migration state in a per-channel function, we should just report the > > error upwards, then the main thread should decide how to change the > > state machine of the migration. > Thanks for the detail explanation, do agree with reporting and letting > the main thread handle this. :) > But one thing to note is that during my previous debugging, I remember > sometimes the main thread: migration_thread() is called earlier than > the first channel is ready in multifd_new_send_channel_async(). Thus > we should be careful about where/when to check the state of the channel. Yeah, I guess that's exactly the stack I described at [1] above. So my preference here would be that: in multifd_save_setup() we don't continue until we know that the sockets are ready. After all AFAIU currently we'll depend on all the channels when migrate, so we can't really do anything if without all the channels ready. That'll simplify the error handling of the case you've encountered during SETUP. > > And we have set it in migrate_set_error() after all so the main thread > > should be able to know somehow > But in our current code, the main thread has not utilized the s->error > to know whether the migration state, right? As I checked the code, > the s->error is only used > - in qmp query: copy s->error to info->error_desc when detecting the migrate > status is failed; > - in migrate_fd_cleanup() when migrate_fd_connect() fails: print the error > Or the s->error is just used in this way? Hmm, _maybe_ we can introduce MultiFDSendParams.err then we can put per-thread error there. > > (though IMHO I'll even prefer to have a > > per-channel variable to keep the state of the channel, then the > > per-channel functions won't touch any globals which offers better > > isolation). > > > > I'm not sure how Juan thinks about it, but I'd prefer some work to > > provide such isolation and also some mechanism to allow the main > > thread to detect the per-channel errors not only during setup phase > > but also during the migration (e.g., when network is suddenly down). > > Then we don't touch any globals (e.g., we shouldn't call > > migrate_get_current in any per-channel function like > > multifd_new_send_channel_async). > Ok, wait for Juan's comment. :) Yes. Regards, -- Peter Xu ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-02 3:32 ` Peter Xu 2018-11-02 7:13 ` Fei Li @ 2018-11-02 16:33 ` Dr. David Alan Gilbert 2018-11-12 4:43 ` Fei Li 1 sibling, 1 reply; 32+ messages in thread From: Dr. David Alan Gilbert @ 2018-11-02 16:33 UTC (permalink / raw) To: Peter Xu; +Cc: Fei Li, qemu-devel, armbru, famz, quintela * Peter Xu (peterx@redhat.com) wrote: > On Fri, Nov 02, 2018 at 11:00:24AM +0800, Fei Li wrote: > > > > > > On 11/02/2018 10:37 AM, Peter Xu wrote: > > > On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: > > > > Set the migration state to "failed" instead of "setup" when failing > > > > to send packet via some channel. > > > Could you please provide more information in the commit message? > > > E.g., what will happen if without this patch? Will it crash the > > > source or stall the source migration or others? Otherwise it's a bit > > > hard for me to understand what's this patch for. > > Sorry for the inadequate description , I was intended to say that when > > failing > > to do the live migration using multifd, e.g. sending less channels, the src > > status displays "setup" when running `info migrate`. I assume we should tell > > users that the "Migration status" is "failed" now (and along with the > > failure reason). > > > > The current src status when failed inmultifd_new_send_channel_async(): > > > > > > (qemu) migrate_set_capability x-multifd on > > (qemu) migrate_set_parameter x-multifd-channels 4 > > (qemu) migrate -d tcp:192.168.190.98:4444 > > (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async due to > > ... > > (qemu) info migrate > > globals: > > store-global-state: on > > only-migratable: off > > send-configuration: on > > send-section-footer: on > > decompress-error-check: on > > capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: > > off compress: off events: off postcopy-ram: off x-colo: off release-ram: off > > block: off return-path: off pause-before-switchover: off x-multifd: on > > dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off > > Migration status: setup > > total time: 0 milliseconds > > Thanks for the information. > > I had a quick look. For now we do this: > > multifd_save_setup (without waiting for channels to be ready) > create thread migration_thread > (in thread) > ram_save_setup > multifd_send_sync_main (wait for the channels) > > The thing is that we didn't get the notification when one of the > multifd channel is failed. IMHO instead of setting the global > migration state in a per-channel function, we should just report the > error upwards, then the main thread should decide how to change the > state machine of the migration. Best to wait for Juan on that; I've got vague memories that reporting errors among the threads was a bit tricky. Dave > And we have set it in migrate_set_error() after all so the main thread > should be able to know somehow (though IMHO I'll even prefer to have a > per-channel variable to keep the state of the channel, then the > per-channel functions won't touch any globals which offers better > isolation). > > I'm not sure how Juan thinks about it, but I'd prefer some work to > provide such isolation and also some mechanism to allow the main > thread to detect the per-channel errors not only during setup phase > but also during the migration (e.g., when network is suddenly down). > Then we don't touch any globals (e.g., we shouldn't call > migrate_get_current in any per-channel function like > multifd_new_send_channel_async). > > > > > > > > > Normally I would prefer to not touch global states in feature specific > > > code path, but I'd like to know the problem more first... > > > > > > Thanks, > > > > > > > Cc: Peter Xu <peterx@redhat.com> > > > > Signed-off-by: Fei Li <fli@suse.com> > > > > --- > > > > migration/ram.c | 2 ++ > > > > 1 file changed, 2 insertions(+) > > > > > > > > diff --git a/migration/ram.c b/migration/ram.c > > > > index 4db3b3e8f4..c84d164fc8 100644 > > > > --- a/migration/ram.c > > > > +++ b/migration/ram.c > > > > @@ -1072,6 +1072,7 @@ out: > > > > static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > > > > { > > > > MultiFDSendParams *p = opaque; > > > > + MigrationState *s = migrate_get_current(); > > > > QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); > > > > Error *local_err = NULL; > > > > @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) > > > > if (multifd_save_cleanup(&local_err) != 0) { > > > > migrate_set_error(migrate_get_current(), local_err); > > > > } > > > > + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); > > > > } else { > > > > p->c = QIO_CHANNEL(sioc); > > > > qio_channel_set_delay(p->c, false); > > > > -- > > > > 2.13.7 > > > > > > > Regards, > > > > > > > Regards, > > -- > Peter Xu -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-02 16:33 ` Dr. David Alan Gilbert @ 2018-11-12 4:43 ` Fei Li 2018-12-04 7:32 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-12 4:43 UTC (permalink / raw) To: Juan Quintela; +Cc: Peter Xu, Dr. David Alan Gilbert, famz, qemu-devel, armbru Hi Juan, Kindly ping, as this multifd migration topic needs your suggestions. :) Have a nice day, thanks Fei On 11/03/2018 12:33 AM, Dr. David Alan Gilbert wrote: > * Peter Xu (peterx@redhat.com) wrote: >> On Fri, Nov 02, 2018 at 11:00:24AM +0800, Fei Li wrote: >>> >>> On 11/02/2018 10:37 AM, Peter Xu wrote: >>>> On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: >>>>> Set the migration state to "failed" instead of "setup" when failing >>>>> to send packet via some channel. >>>> Could you please provide more information in the commit message? >>>> E.g., what will happen if without this patch? Will it crash the >>>> source or stall the source migration or others? Otherwise it's a bit >>>> hard for me to understand what's this patch for. >>> Sorry for the inadequate description , I was intended to say that when >>> failing >>> to do the live migration using multifd, e.g. sending less channels, the src >>> status displays "setup" when running `info migrate`. I assume we should tell >>> users that the "Migration status" is "failed" now (and along with the >>> failure reason). >>> >>> The current src status when failed inmultifd_new_send_channel_async(): >>> >>> >>> (qemu) migrate_set_capability x-multifd on >>> (qemu) migrate_set_parameter x-multifd-channels 4 >>> (qemu) migrate -d tcp:192.168.190.98:4444 >>> (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async due to >>> ... >>> (qemu) info migrate >>> globals: >>> store-global-state: on >>> only-migratable: off >>> send-configuration: on >>> send-section-footer: on >>> decompress-error-check: on >>> capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: >>> off compress: off events: off postcopy-ram: off x-colo: off release-ram: off >>> block: off return-path: off pause-before-switchover: off x-multifd: on >>> dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off >>> Migration status: setup >>> total time: 0 milliseconds >> Thanks for the information. >> >> I had a quick look. For now we do this: >> >> multifd_save_setup (without waiting for channels to be ready) >> create thread migration_thread >> (in thread) >> ram_save_setup >> multifd_send_sync_main (wait for the channels) >> >> The thing is that we didn't get the notification when one of the >> multifd channel is failed. IMHO instead of setting the global >> migration state in a per-channel function, we should just report the >> error upwards, then the main thread should decide how to change the >> state machine of the migration. > Best to wait for Juan on that; I've got vague memories that reporting > errors among the threads was a bit tricky. > > Dave > >> And we have set it in migrate_set_error() after all so the main thread >> should be able to know somehow (though IMHO I'll even prefer to have a >> per-channel variable to keep the state of the channel, then the >> per-channel functions won't touch any globals which offers better >> isolation). >> >> I'm not sure how Juan thinks about it, but I'd prefer some work to >> provide such isolation and also some mechanism to allow the main >> thread to detect the per-channel errors not only during setup phase >> but also during the migration (e.g., when network is suddenly down). >> Then we don't touch any globals (e.g., we shouldn't call >> migrate_get_current in any per-channel function like >> multifd_new_send_channel_async). >> >>>> Normally I would prefer to not touch global states in feature specific >>>> code path, but I'd like to know the problem more first... >>>> >>>> Thanks, >>>> >>>>> Cc: Peter Xu <peterx@redhat.com> >>>>> Signed-off-by: Fei Li <fli@suse.com> >>>>> --- >>>>> migration/ram.c | 2 ++ >>>>> 1 file changed, 2 insertions(+) >>>>> >>>>> diff --git a/migration/ram.c b/migration/ram.c >>>>> index 4db3b3e8f4..c84d164fc8 100644 >>>>> --- a/migration/ram.c >>>>> +++ b/migration/ram.c >>>>> @@ -1072,6 +1072,7 @@ out: >>>>> static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >>>>> { >>>>> MultiFDSendParams *p = opaque; >>>>> + MigrationState *s = migrate_get_current(); >>>>> QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); >>>>> Error *local_err = NULL; >>>>> @@ -1083,6 +1084,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >>>>> if (multifd_save_cleanup(&local_err) != 0) { >>>>> migrate_set_error(migrate_get_current(), local_err); >>>>> } >>>>> + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); >>>>> } else { >>>>> p->c = QIO_CHANNEL(sioc); >>>>> qio_channel_set_delay(p->c, false); >>>>> -- >>>>> 2.13.7 >>>>> >>>> Regards, >>>> >> Regards, >> >> -- >> Peter Xu > -- > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK > > > ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels 2018-11-12 4:43 ` Fei Li @ 2018-12-04 7:32 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-12-04 7:32 UTC (permalink / raw) To: Juan Quintela; +Cc: Peter Xu, Dr. David Alan Gilbert, famz, qemu-devel, armbru Hi Juan, Kindly ping again. :) Have a nice day, thanks Fei On 11/12/2018 12:43 PM, Fei Li wrote: > Hi Juan, > > Kindly ping, as this multifd migration topic needs your suggestions. :) > > Have a nice day, thanks > Fei > > On 11/03/2018 12:33 AM, Dr. David Alan Gilbert wrote: >> * Peter Xu (peterx@redhat.com) wrote: >>> On Fri, Nov 02, 2018 at 11:00:24AM +0800, Fei Li wrote: >>>> >>>> On 11/02/2018 10:37 AM, Peter Xu wrote: >>>>> On Thu, Nov 01, 2018 at 06:17:11PM +0800, Fei Li wrote: >>>>>> Set the migration state to "failed" instead of "setup" when failing >>>>>> to send packet via some channel. >>>>> Could you please provide more information in the commit message? >>>>> E.g., what will happen if without this patch? Will it crash the >>>>> source or stall the source migration or others? Otherwise it's a bit >>>>> hard for me to understand what's this patch for. >>>> Sorry for the inadequate description , I was intended to say that when >>>> failing >>>> to do the live migration using multifd, e.g. sending less channels, >>>> the src >>>> status displays "setup" when running `info migrate`. I assume we >>>> should tell >>>> users that the "Migration status" is "failed" now (and along with the >>>> failure reason). >>>> >>>> The current src status when failed >>>> inmultifd_new_send_channel_async(): >>>> >>>> >>>> (qemu) migrate_set_capability x-multifd on >>>> (qemu) migrate_set_parameter x-multifd-channels 4 >>>> (qemu) migrate -d tcp:192.168.190.98:4444 >>>> (qemu) qemu-system-x86_64: failed in multifd_new_send_channel_async >>>> due to >>>> ... >>>> (qemu) info migrate >>>> globals: >>>> store-global-state: on >>>> only-migratable: off >>>> send-configuration: on >>>> send-section-footer: on >>>> decompress-error-check: on >>>> capabilities: xbzrle: off rdma-pin-all: off auto-converge: off >>>> zero-blocks: >>>> off compress: off events: off postcopy-ram: off x-colo: off >>>> release-ram: off >>>> block: off return-path: off pause-before-switchover: off x-multifd: on >>>> dirty-bitmaps: off postcopy-blocktime: off late-block-activate: off >>>> Migration status: setup >>>> total time: 0 milliseconds >>> Thanks for the information. >>> >>> I had a quick look. For now we do this: >>> >>> multifd_save_setup (without waiting for channels to be ready) >>> create thread migration_thread >>> (in thread) >>> ram_save_setup >>> multifd_send_sync_main (wait for the channels) >>> >>> The thing is that we didn't get the notification when one of the >>> multifd channel is failed. IMHO instead of setting the global >>> migration state in a per-channel function, we should just report the >>> error upwards, then the main thread should decide how to change the >>> state machine of the migration. >> Best to wait for Juan on that; I've got vague memories that reporting >> errors among the threads was a bit tricky. >> >> Dave >> >>> And we have set it in migrate_set_error() after all so the main thread >>> should be able to know somehow (though IMHO I'll even prefer to have a >>> per-channel variable to keep the state of the channel, then the >>> per-channel functions won't touch any globals which offers better >>> isolation). >>> >>> I'm not sure how Juan thinks about it, but I'd prefer some work to >>> provide such isolation and also some mechanism to allow the main >>> thread to detect the per-channel errors not only during setup phase >>> but also during the migration (e.g., when network is suddenly down). >>> Then we don't touch any globals (e.g., we shouldn't call >>> migrate_get_current in any per-channel function like >>> multifd_new_send_channel_async). >>> >>>>> Normally I would prefer to not touch global states in feature >>>>> specific >>>>> code path, but I'd like to know the problem more first... >>>>> >>>>> Thanks, >>>>> >>>>>> Cc: Peter Xu <peterx@redhat.com> >>>>>> Signed-off-by: Fei Li <fli@suse.com> >>>>>> --- >>>>>> migration/ram.c | 2 ++ >>>>>> 1 file changed, 2 insertions(+) >>>>>> >>>>>> diff --git a/migration/ram.c b/migration/ram.c >>>>>> index 4db3b3e8f4..c84d164fc8 100644 >>>>>> --- a/migration/ram.c >>>>>> +++ b/migration/ram.c >>>>>> @@ -1072,6 +1072,7 @@ out: >>>>>> static void multifd_new_send_channel_async(QIOTask *task, >>>>>> gpointer opaque) >>>>>> { >>>>>> MultiFDSendParams *p = opaque; >>>>>> + MigrationState *s = migrate_get_current(); >>>>>> QIOChannel *sioc = QIO_CHANNEL(qio_task_get_source(task)); >>>>>> Error *local_err = NULL; >>>>>> @@ -1083,6 +1084,7 @@ static void >>>>>> multifd_new_send_channel_async(QIOTask *task, gpointer opaque) >>>>>> if (multifd_save_cleanup(&local_err) != 0) { >>>>>> migrate_set_error(migrate_get_current(), local_err); >>>>>> } >>>>>> + migrate_set_state(&s->state, s->state, >>>>>> MIGRATION_STATUS_FAILED); >>>>>> } else { >>>>>> p->c = QIO_CHANNEL(sioc); >>>>>> qio_channel_set_delay(p->c, false); >>>>>> -- >>>>>> 2.13.7 >>>>>> >>>>> Regards, >>>>> >>> Regards, >>> >>> -- >>> Peter Xu >> -- >> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK >> >> >> > ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving less channels 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (4 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-02 2:46 ` Peter Xu 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error Fei Li ` (4 subsequent siblings) 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela In our current code, when multifd is used during migration, if there is an error before the destination receives all new channels, the source keeps running, however the destination does not exit but keeps waiting until the source is killed deliberately. Fix this by dumping the specific error and let users decide whether to quit from the destination side when failing to receive packet via some channel. Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> Cc: Peter Xu <peterx@redhat.com> Signed-off-by: Fei Li <fli@suse.com> --- migration/channel.c | 11 ++++++----- migration/migration.c | 9 +++++++-- migration/migration.h | 2 +- migration/ram.c | 6 +++++- migration/ram.h | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/migration/channel.c b/migration/channel.c index 33e0e9b82f..20e4c8e2dc 100644 --- a/migration/channel.c +++ b/migration/channel.c @@ -30,6 +30,7 @@ void migration_channel_process_incoming(QIOChannel *ioc) { MigrationState *s = migrate_get_current(); + Error *local_err = NULL; trace_migration_set_incoming_channel( ioc, object_get_typename(OBJECT(ioc))); @@ -38,13 +39,13 @@ void migration_channel_process_incoming(QIOChannel *ioc) *s->parameters.tls_creds && !object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_TLS)) { - Error *local_err = NULL; migration_tls_channel_process_incoming(s, ioc, &local_err); - if (local_err) { - error_report_err(local_err); - } } else { - migration_ioc_process_incoming(ioc); + migration_ioc_process_incoming(ioc, &local_err); + } + + if (local_err) { + error_report_err(local_err); } } diff --git a/migration/migration.c b/migration/migration.c index 8b36e7f184..87dfc7374f 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -541,7 +541,7 @@ void migration_fd_process_incoming(QEMUFile *f) migration_incoming_process(); } -void migration_ioc_process_incoming(QIOChannel *ioc) +void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp) { MigrationIncomingState *mis = migration_incoming_get_current(); bool start_migration; @@ -563,9 +563,14 @@ void migration_ioc_process_incoming(QIOChannel *ioc) */ start_migration = !migrate_use_multifd(); } else { + Error *local_err = NULL; /* Multiple connections */ assert(migrate_use_multifd()); - start_migration = multifd_recv_new_channel(ioc); + start_migration = multifd_recv_new_channel(ioc, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } } if (start_migration) { diff --git a/migration/migration.h b/migration/migration.h index f7813f8261..7df4d426d0 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -229,7 +229,7 @@ struct MigrationState void migrate_set_state(int *state, int old_state, int new_state); void migration_fd_process_incoming(QEMUFile *f); -void migration_ioc_process_incoming(QIOChannel *ioc); +void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp); void migration_incoming_process(void); bool migration_has_all_channels(void); diff --git a/migration/ram.c b/migration/ram.c index c84d164fc8..5008a9ab02 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1339,7 +1339,7 @@ bool multifd_recv_all_channels_created(void) } /* Return true if multifd is ready for the migration, otherwise false */ -bool multifd_recv_new_channel(QIOChannel *ioc) +bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp) { MultiFDRecvParams *p; Error *local_err = NULL; @@ -1347,6 +1347,9 @@ bool multifd_recv_new_channel(QIOChannel *ioc) id = multifd_recv_initial_packet(ioc, &local_err); if (id < 0) { + error_propagate_prepend(errp, local_err, + "failed to receive packet via multifd channel %x: ", + multifd_recv_state->count); multifd_recv_terminate_threads(local_err, false); return false; } @@ -1356,6 +1359,7 @@ bool multifd_recv_new_channel(QIOChannel *ioc) error_setg(&local_err, "multifd: received id '%d' already setup'", id); multifd_recv_terminate_threads(local_err, true); + error_propagate(errp, local_err); return false; } p->c = ioc; diff --git a/migration/ram.h b/migration/ram.h index 83ff1bc11a..046d3074be 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -47,7 +47,7 @@ int multifd_save_cleanup(Error **errp); int multifd_load_setup(void); int multifd_load_cleanup(Error **errp); bool multifd_recv_all_channels_created(void); -bool multifd_recv_new_channel(QIOChannel *ioc); +bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp); uint64_t ram_pagesize_summary(void); int ram_save_queue_pages(const char *rbname, ram_addr_t start, ram_addr_t len); -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving less channels 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving " Fei Li @ 2018-11-02 2:46 ` Peter Xu 2018-11-06 5:29 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Peter Xu @ 2018-11-02 2:46 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, quintela On Thu, Nov 01, 2018 at 06:17:12PM +0800, Fei Li wrote: [...] > @@ -1339,7 +1339,7 @@ bool multifd_recv_all_channels_created(void) > } > > /* Return true if multifd is ready for the migration, otherwise false */ > -bool multifd_recv_new_channel(QIOChannel *ioc) > +bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp) > { > MultiFDRecvParams *p; > Error *local_err = NULL; > @@ -1347,6 +1347,9 @@ bool multifd_recv_new_channel(QIOChannel *ioc) > > id = multifd_recv_initial_packet(ioc, &local_err); > if (id < 0) { > + error_propagate_prepend(errp, local_err, > + "failed to receive packet via multifd channel %x: ", I'd use either %d or 0x%x, and some indent issue. Otherwise looks good to me. Thanks, -- Peter Xu ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving less channels 2018-11-02 2:46 ` Peter Xu @ 2018-11-06 5:29 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-06 5:29 UTC (permalink / raw) To: Peter Xu; +Cc: quintela, famz, qemu-devel, dgilbert, armbru On 11/02/2018 10:46 AM, Peter Xu wrote: > On Thu, Nov 01, 2018 at 06:17:12PM +0800, Fei Li wrote: > > [...] > >> @@ -1339,7 +1339,7 @@ bool multifd_recv_all_channels_created(void) >> } >> >> /* Return true if multifd is ready for the migration, otherwise false */ >> -bool multifd_recv_new_channel(QIOChannel *ioc) >> +bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp) >> { >> MultiFDRecvParams *p; >> Error *local_err = NULL; >> @@ -1347,6 +1347,9 @@ bool multifd_recv_new_channel(QIOChannel *ioc) >> >> id = multifd_recv_initial_packet(ioc, &local_err); >> if (id < 0) { >> + error_propagate_prepend(errp, local_err, >> + "failed to receive packet via multifd channel %x: ", > I'd use either %d or 0x%x, and some indent issue. > > Otherwise looks good to me. Thanks, > Thanks, fixed as: id = multifd_recv_initial_packet(ioc, &local_err); if (id < 0) { + error_propagate_prepend(errp, local_err, + "failed to receive packet" + " via multifd channel %d: ", + multifd_recv_state->count); Have a nice day :) Fei ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (5 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving " Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-05 13:59 ` Juan Quintela 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 8/9] migration: add more error handling for postcopy_ram_enable_notify Fei Li ` (3 subsequent siblings) 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela Always call migrate_set_error() to set the error state without relying on whether multifd_save_cleanup() succeeds. As the passed &local_err is never used in multifd_save_cleanup(), remove it. Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Fei Li <fli@suse.com> --- migration/migration.c | 5 +---- migration/ram.c | 7 +++---- migration/ram.h | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 87dfc7374f..3b8b7ab4f9 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1377,7 +1377,6 @@ static void migrate_fd_cleanup(void *opaque) qemu_savevm_state_cleanup(); if (s->to_dst_file) { - Error *local_err = NULL; QEMUFile *tmp; trace_migrate_fd_cleanup(); @@ -1388,9 +1387,7 @@ static void migrate_fd_cleanup(void *opaque) } qemu_mutex_lock_iothread(); - if (multifd_save_cleanup(&local_err) != 0) { - error_report_err(local_err); - } + multifd_save_cleanup(); qemu_mutex_lock(&s->qemu_file_lock); tmp = s->to_dst_file; s->to_dst_file = NULL; diff --git a/migration/ram.c b/migration/ram.c index 5008a9ab02..cea255d9b9 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -922,7 +922,7 @@ static void multifd_send_terminate_threads(Error *err) } } -int multifd_save_cleanup(Error **errp) +int multifd_save_cleanup(void) { int i; int ret = 0; @@ -1081,10 +1081,9 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) } if (qio_task_propagate_error(task, &local_err)) { - if (multifd_save_cleanup(&local_err) != 0) { - migrate_set_error(migrate_get_current(), local_err); - } + migrate_set_error(migrate_get_current(), local_err); migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); + multifd_save_cleanup(); } else { p->c = QIO_CHANNEL(sioc); qio_channel_set_delay(p->c, false); diff --git a/migration/ram.h b/migration/ram.h index 046d3074be..0d1215209e 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -43,7 +43,7 @@ uint64_t ram_bytes_remaining(void); uint64_t ram_bytes_total(void); int multifd_save_setup(void); -int multifd_save_cleanup(Error **errp); +int multifd_save_cleanup(void); int multifd_load_setup(void); int multifd_load_cleanup(Error **errp); bool multifd_recv_all_channels_created(void); -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error Fei Li @ 2018-11-05 13:59 ` Juan Quintela 2018-11-06 4:51 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Juan Quintela @ 2018-11-05 13:59 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, peterx Fei Li <fli@suse.com> wrote: > Always call migrate_set_error() to set the error state without relying > on whether multifd_save_cleanup() succeeds. As the passed &local_err > is never used in multifd_save_cleanup(), remove it. Error is not used, you are right. But then just change the prototype to: void multifd_save_cleanup(void); ?? With that change, Reviewed-by: Juan Quintela <quintela@redhat.com> ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error 2018-11-05 13:59 ` Juan Quintela @ 2018-11-06 4:51 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-06 4:51 UTC (permalink / raw) To: quintela; +Cc: peterx, famz, qemu-devel, dgilbert, armbru On 11/05/2018 09:59 PM, Juan Quintela wrote: > Fei Li <fli@suse.com> wrote: >> Always call migrate_set_error() to set the error state without relying >> on whether multifd_save_cleanup() succeeds. As the passed &local_err >> is never used in multifd_save_cleanup(), remove it. > Error is not used, you are right. > > But then just change the prototype to: > > void multifd_save_cleanup(void); > > ?? > > With that change, > > Reviewed-by: Juan Quintela <quintela@redhat.com> Thanks for the review! Have changed that function to be void, besides, correct the previous erroneous function name in the patch title: s/migratr_set_error/multifd_save_cleanup/g. ^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 8/9] migration: add more error handling for postcopy_ram_enable_notify 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (6 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle Fei Li ` (2 subsequent siblings) 10 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela Call postcopy_ram_incoming_cleanup() to do the cleanup when postcopy_ram_enable_notify fails. Besides, report the error message when qemu_ram_foreach_migratable_block() fails. Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Fei Li <fli@suse.com> --- migration/postcopy-ram.c | 1 + migration/savevm.c | 1 + 2 files changed, 2 insertions(+) diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index e5c02a32c5..fa09dba534 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -1117,6 +1117,7 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis) /* Mark so that we get notified of accesses to unwritten areas */ if (qemu_ram_foreach_migratable_block(ram_block_enable_notify, mis)) { + error_report("ram_block_enable_notify failed"); return -1; } diff --git a/migration/savevm.c b/migration/savevm.c index 9992af4db4..f2644586de 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1725,6 +1725,7 @@ static int loadvm_postcopy_handle_listen(MigrationIncomingState *mis) */ if (migrate_postcopy_ram()) { if (postcopy_ram_enable_notify(mis)) { + postcopy_ram_incoming_cleanup(mis); return -1; } } -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (7 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 8/9] migration: add more error handling for postcopy_ram_enable_notify Fei Li @ 2018-11-01 10:17 ` Fei Li 2018-11-05 13:53 ` Juan Quintela 2018-11-03 18:09 ` [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check no-reply 2018-11-05 18:19 ` no-reply 10 siblings, 1 reply; 32+ messages in thread From: Fei Li @ 2018-11-01 10:17 UTC (permalink / raw) To: qemu-devel; +Cc: armbru, dgilbert, famz, peterx, quintela Make qemu_thread_create() return a Boolean to indicate if it succeeds rather than failing with an error. And add an Error parameter to hold the error message and let the callers handle it. Signed-off-by: Fei Li <fli@suse.com> --- cpus.c | 45 ++++++++++++++++++++++++------------- dump.c | 6 +++-- hw/misc/edu.c | 6 +++-- hw/ppc/spapr_hcall.c | 10 +++++++-- hw/rdma/rdma_backend.c | 4 +++- hw/usb/ccid-card-emulated.c | 15 +++++++++---- include/qemu/thread.h | 4 ++-- io/task.c | 3 ++- iothread.c | 16 +++++++++----- migration/migration.c | 54 +++++++++++++++++++++++++++++---------------- migration/postcopy-ram.c | 14 ++++++++++-- migration/ram.c | 41 +++++++++++++++++++++++++--------- migration/savevm.c | 11 ++++++--- tests/atomic_add-bench.c | 3 ++- tests/iothread.c | 2 +- tests/qht-bench.c | 3 ++- tests/rcutorture.c | 3 ++- tests/test-aio.c | 2 +- tests/test-rcu-list.c | 3 ++- ui/vnc-jobs.c | 17 +++++++++----- ui/vnc-jobs.h | 2 +- ui/vnc.c | 4 +++- util/compatfd.c | 12 ++++++++-- util/oslib-posix.c | 17 ++++++++++---- util/qemu-thread-posix.c | 24 +++++++++++++------- util/qemu-thread-win32.c | 16 ++++++++++---- util/rcu.c | 3 ++- util/thread-pool.c | 4 +++- 28 files changed, 243 insertions(+), 101 deletions(-) diff --git a/cpus.c b/cpus.c index ed71618e1f..0510f90e06 100644 --- a/cpus.c +++ b/cpus.c @@ -1949,15 +1949,20 @@ static void qemu_tcg_init_vcpu(CPUState *cpu, Error **errp) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, + qemu_tcg_cpu_thread_fn, cpu, + QEMU_THREAD_JOINABLE, errp)) { + return; + } } else { /* share a single thread for all cpus with TCG */ snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG"); - qemu_thread_create(cpu->thread, thread_name, - qemu_tcg_rr_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, + qemu_tcg_rr_cpu_thread_fn, cpu, + QEMU_THREAD_JOINABLE, errp)) { + return; + } single_tcg_halt_cond = cpu->halt_cond; single_tcg_cpu_thread = cpu->thread; @@ -1985,8 +1990,10 @@ static void qemu_hax_start_vcpu(CPUState *cpu, Error **errp) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp)) { + return; + } #ifdef _WIN32 cpu->hThread = qemu_thread_get_handle(cpu->thread); #endif @@ -2001,8 +2008,10 @@ static void qemu_kvm_start_vcpu(CPUState *cpu, Error **errp) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp)) { + /* keep 'if' here in case there is further error handling logic */ + } } static void qemu_hvf_start_vcpu(CPUState *cpu, Error **errp) @@ -2019,8 +2028,10 @@ static void qemu_hvf_start_vcpu(CPUState *cpu, Error **errp) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp)) { + /* keep 'if' here in case there is further error handling logic */ + } } static void qemu_whpx_start_vcpu(CPUState *cpu, Error **errp) @@ -2032,8 +2043,10 @@ static void qemu_whpx_start_vcpu(CPUState *cpu, Error **errp) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp)) { + return; + } #ifdef _WIN32 cpu->hThread = qemu_thread_get_handle(cpu->thread); #endif @@ -2048,8 +2061,10 @@ static void qemu_dummy_start_vcpu(CPUState *cpu, Error **errp) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu, - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp)) { + /* keep 'if' here in case there is further error handling logic */ + } } bool qemu_init_vcpu(CPUState *cpu, Error **errp) diff --git a/dump.c b/dump.c index 4ec94c5e25..1f003aff9a 100644 --- a/dump.c +++ b/dump.c @@ -2020,8 +2020,10 @@ void qmp_dump_guest_memory(bool paging, const char *file, if (detach_p) { /* detached dump */ s->detached = true; - qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread, - s, QEMU_THREAD_DETACHED); + if (!qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread, + s, QEMU_THREAD_DETACHED, errp)) { + /* keep 'if' here in case there is further error handling logic */ + } } else { /* sync dump */ dump_process(s, errp); diff --git a/hw/misc/edu.c b/hw/misc/edu.c index cdcf550dd7..6684c60a96 100644 --- a/hw/misc/edu.c +++ b/hw/misc/edu.c @@ -355,8 +355,10 @@ static void pci_edu_realize(PCIDevice *pdev, Error **errp) qemu_mutex_init(&edu->thr_mutex); qemu_cond_init(&edu->thr_cond); - qemu_thread_create(&edu->thread, "edu", edu_fact_thread, - edu, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&edu->thread, "edu", edu_fact_thread, + edu, QEMU_THREAD_JOINABLE, errp)) { + return; + } memory_region_init_io(&edu->mmio, OBJECT(edu), &edu_mmio_ops, edu, "edu-mmio", 1 * MiB); diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index ae913d070f..7c16ade04a 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -478,6 +478,7 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, sPAPRPendingHPT *pending = spapr->pending_hpt; uint64_t current_ram_size; int rc; + Error *local_err = NULL; if (spapr->resize_hpt == SPAPR_RESIZE_HPT_DISABLED) { return H_AUTHORITY; @@ -538,8 +539,13 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, pending->shift = shift; pending->ret = H_HARDWARE; - qemu_thread_create(&pending->thread, "sPAPR HPT prepare", - hpt_prepare_thread, pending, QEMU_THREAD_DETACHED); + if (!qemu_thread_create(&pending->thread, "sPAPR HPT prepare", + hpt_prepare_thread, pending, + QEMU_THREAD_DETACHED, &local_err)) { + error_reportf_err(local_err, "failed to create hpt_prepare_thread: "); + g_free(pending); + return H_RESOURCE; + } spapr->pending_hpt = pending; diff --git a/hw/rdma/rdma_backend.c b/hw/rdma/rdma_backend.c index d7a4bbd91f..53a2bd0d85 100644 --- a/hw/rdma/rdma_backend.c +++ b/hw/rdma/rdma_backend.c @@ -164,8 +164,10 @@ static void start_comp_thread(RdmaBackendDev *backend_dev) snprintf(thread_name, sizeof(thread_name), "rdma_comp_%s", ibv_get_device_name(backend_dev->ib_dev)); backend_dev->comp_thread.run = true; + /* FIXME: let the further caller handle the error instead of abort() here */ qemu_thread_create(&backend_dev->comp_thread.thread, thread_name, - comp_handler_thread, backend_dev, QEMU_THREAD_DETACHED); + comp_handler_thread, backend_dev, + QEMU_THREAD_DETACHED, &error_abort); } void rdma_backend_register_comp_handler(void (*handler)(int status, diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c index 25976ed84f..5ffd448944 100644 --- a/hw/usb/ccid-card-emulated.c +++ b/hw/usb/ccid-card-emulated.c @@ -544,10 +544,17 @@ static void emulated_realize(CCIDCardState *base, Error **errp) error_setg(errp, "%s: failed to initialize vcard", TYPE_EMULATED_CCID); goto out2; } - qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread, - card, QEMU_THREAD_JOINABLE); - qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread, - card, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread, + card, QEMU_THREAD_JOINABLE, errp)) { + error_report("failed to create event_thread"); + goto out2; + } + if (!qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", + handle_apdu_thread, card, + QEMU_THREAD_JOINABLE, errp)) { + error_report("failed to create handle_apdu_thread"); + goto out2; + } out2: clean_event_notifier(card); diff --git a/include/qemu/thread.h b/include/qemu/thread.h index b2661b6672..c230eb5d5b 100644 --- a/include/qemu/thread.h +++ b/include/qemu/thread.h @@ -152,9 +152,9 @@ void qemu_event_reset(QemuEvent *ev); void qemu_event_wait(QemuEvent *ev); void qemu_event_destroy(QemuEvent *ev); -void qemu_thread_create(QemuThread *thread, const char *name, +bool qemu_thread_create(QemuThread *thread, const char *name, void *(*start_routine)(void *), - void *arg, int mode); + void *arg, int mode, Error **errp); void *qemu_thread_join(QemuThread *thread); void qemu_thread_get_self(QemuThread *thread); bool qemu_thread_is_self(QemuThread *thread); diff --git a/io/task.c b/io/task.c index 2886a2c1bc..6d3a18ab80 100644 --- a/io/task.c +++ b/io/task.c @@ -149,7 +149,8 @@ void qio_task_run_in_thread(QIOTask *task, "io-task-worker", qio_task_thread_worker, data, - QEMU_THREAD_DETACHED); + QEMU_THREAD_DETACHED, + &error_abort); } diff --git a/iothread.c b/iothread.c index 2fb1cdf55d..7335dacf0b 100644 --- a/iothread.c +++ b/iothread.c @@ -164,9 +164,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp) &local_error); if (local_error) { error_propagate(errp, local_error); - aio_context_unref(iothread->ctx); - iothread->ctx = NULL; - return; + goto fail; } qemu_mutex_init(&iothread->init_done_lock); @@ -178,8 +176,12 @@ static void iothread_complete(UserCreatable *obj, Error **errp) */ name = object_get_canonical_path_component(OBJECT(obj)); thread_name = g_strdup_printf("IO %s", name); - qemu_thread_create(&iothread->thread, thread_name, iothread_run, - iothread, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&iothread->thread, thread_name, iothread_run, + iothread, QEMU_THREAD_JOINABLE, errp)) { + g_free(thread_name); + g_free(name); + goto fail; + } g_free(thread_name); g_free(name); @@ -190,6 +192,10 @@ static void iothread_complete(UserCreatable *obj, Error **errp) &iothread->init_done_lock); } qemu_mutex_unlock(&iothread->init_done_lock); + return; +fail: + aio_context_unref(iothread->ctx); + iothread->ctx = NULL; } typedef struct { diff --git a/migration/migration.c b/migration/migration.c index 3b8b7ab4f9..d8f530d598 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -438,19 +438,22 @@ static void process_incoming_migration_co(void *opaque) /* Make sure all file formats flush their mutable metadata */ bdrv_invalidate_cache_all(&local_err); if (local_err) { - migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_FAILED); error_report_err(local_err); - exit(EXIT_FAILURE); + goto fail; } if (colo_init_ram_cache() < 0) { error_report("Init ram cache failed"); - exit(EXIT_FAILURE); + goto fail; } - qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming", - colo_process_incoming_thread, mis, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming", + colo_process_incoming_thread, mis, + QEMU_THREAD_JOINABLE, &local_err)) { + error_reportf_err(local_err, "failed to create " + "colo_process_incoming_thread: "); + goto fail; + } mis->have_colo_incoming_thread = true; qemu_coroutine_yield(); @@ -461,20 +464,22 @@ static void process_incoming_migration_co(void *opaque) } if (ret < 0) { - Error *local_err = NULL; - - migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_FAILED); error_report("load of migration failed: %s", strerror(-ret)); - qemu_fclose(mis->from_src_file); - if (multifd_load_cleanup(&local_err) != 0) { - error_report_err(local_err); - } - exit(EXIT_FAILURE); + goto fail; } mis->bh = qemu_bh_new(process_incoming_migration_bh, mis); qemu_bh_schedule(mis->bh); mis->migration_incoming_co = NULL; + return; +fail: + local_err = NULL; + migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + qemu_fclose(mis->from_src_file); + if (multifd_load_cleanup(&local_err) != 0) { + error_report_err(local_err); + } + exit(EXIT_FAILURE); } static void migration_incoming_setup(QEMUFile *f) @@ -2336,6 +2341,7 @@ out: static int open_return_path_on_source(MigrationState *ms, bool create_thread) { + Error *local_err = NULL; ms->rp_state.from_dst_file = qemu_file_get_return_path(ms->to_dst_file); if (!ms->rp_state.from_dst_file) { @@ -2349,8 +2355,13 @@ static int open_return_path_on_source(MigrationState *ms, return 0; } - qemu_thread_create(&ms->rp_state.rp_thread, "return path", - source_return_path_thread, ms, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&ms->rp_state.rp_thread, "return path", + source_return_path_thread, ms, + QEMU_THREAD_JOINABLE, &local_err)) { + error_reportf_err(local_err, + "failed to create source_return_path_thread: "); + return -1; + } trace_open_return_path_on_source_continue(); @@ -3180,8 +3191,13 @@ void migrate_fd_connect(MigrationState *s, Error *error_in) migrate_fd_cleanup(s); return; } - qemu_thread_create(&s->thread, "live_migration", migration_thread, s, - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&s->thread, "live_migration", migration_thread, + s, QEMU_THREAD_JOINABLE, &error_in)) { + error_reportf_err(error_in, "failed to create migration_thread: "); + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); + migrate_fd_cleanup(s); + return; + } s->migration_thread_running = true; } diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index fa09dba534..80bfa9c4a2 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -1083,6 +1083,8 @@ retry: int postcopy_ram_enable_notify(MigrationIncomingState *mis) { + Error *local_err = NULL; + /* Open the fd for the kernel to give us userfaults */ mis->userfault_fd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); if (mis->userfault_fd == -1) { @@ -1109,8 +1111,16 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis) } qemu_sem_init(&mis->fault_thread_sem, 0); - qemu_thread_create(&mis->fault_thread, "postcopy/fault", - postcopy_ram_fault_thread, mis, QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&mis->fault_thread, "postcopy/fault", + postcopy_ram_fault_thread, mis, + QEMU_THREAD_JOINABLE, &local_err)) { + error_reportf_err(local_err, + "failed to create postcopy_ram_fault_thread: "); + close(mis->userfault_event_fd); + close(mis->userfault_fd); + qemu_sem_destroy(&mis->fault_thread_sem); + return -1; + } qemu_sem_wait(&mis->fault_thread_sem); qemu_sem_destroy(&mis->fault_thread_sem); mis->have_fault_thread = true; diff --git a/migration/ram.c b/migration/ram.c index cea255d9b9..1e960f42a6 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -473,6 +473,7 @@ static void compress_threads_save_cleanup(void) static int compress_threads_save_setup(void) { int i, thread_count; + Error *local_err = NULL; if (!migrate_use_compression()) { return 0; @@ -502,9 +503,12 @@ static int compress_threads_save_setup(void) comp_param[i].quit = false; qemu_mutex_init(&comp_param[i].mutex); qemu_cond_init(&comp_param[i].cond); - qemu_thread_create(compress_threads + i, "compress", - do_data_compress, comp_param + i, - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(compress_threads + i, "compress", + do_data_compress, comp_param + i, + QEMU_THREAD_JOINABLE, &local_err)) { + error_reportf_err(local_err, "failed to create do_data_compress: "); + goto exit; + } } return 0; @@ -1088,8 +1092,15 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque) p->c = QIO_CHANNEL(sioc); qio_channel_set_delay(p->c, false); p->running = true; - qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, + QEMU_THREAD_JOINABLE, &local_err)) { + migrate_set_error(migrate_get_current(), local_err); + error_reportf_err(local_err, + "failed to create multifd_send_thread: "); + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); + multifd_save_cleanup(); + return; + } atomic_inc(&multifd_send_state->count); } @@ -1367,8 +1378,13 @@ bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp) p->num_packets = 1; p->running = true; - qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&p->thread, p->name, multifd_recv_thread, + p, QEMU_THREAD_JOINABLE, &local_err)) { + error_propagate_prepend(errp, local_err, + "failed to create multifd_recv_thread: "); + multifd_recv_terminate_threads(local_err, true); + return false; + } atomic_inc(&multifd_recv_state->count); return multifd_recv_state->count == migrate_multifd_channels(); } @@ -3633,6 +3649,7 @@ static void compress_threads_load_cleanup(void) static int compress_threads_load_setup(QEMUFile *f) { int i, thread_count; + Error *local_err = NULL; if (!migrate_use_compression()) { return 0; @@ -3654,9 +3671,13 @@ static int compress_threads_load_setup(QEMUFile *f) qemu_cond_init(&decomp_param[i].cond); decomp_param[i].done = true; decomp_param[i].quit = false; - qemu_thread_create(decompress_threads + i, "decompress", - do_data_decompress, decomp_param + i, - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(decompress_threads + i, "decompress", + do_data_decompress, decomp_param + i, + QEMU_THREAD_JOINABLE, &local_err)) { + error_reportf_err(local_err, + "failed to create do_data_decompress: "); + goto exit; + } } return 0; exit: diff --git a/migration/savevm.c b/migration/savevm.c index f2644586de..68d39250c7 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1743,9 +1743,14 @@ static int loadvm_postcopy_handle_listen(MigrationIncomingState *mis) mis->have_listen_thread = true; /* Start up the listening thread and wait for it to signal ready */ qemu_sem_init(&mis->listen_thread_sem, 0); - qemu_thread_create(&mis->listen_thread, "postcopy/listen", - postcopy_ram_listen_thread, NULL, - QEMU_THREAD_DETACHED); + if (!qemu_thread_create(&mis->listen_thread, "postcopy/listen", + postcopy_ram_listen_thread, NULL, + QEMU_THREAD_DETACHED, &local_err)) { + error_reportf_err(local_err, + "failed to create postcopy_ram_listen_thread: "); + qemu_sem_destroy(&mis->listen_thread_sem); + return -1; + } qemu_sem_wait(&mis->listen_thread_sem); qemu_sem_destroy(&mis->listen_thread_sem); diff --git a/tests/atomic_add-bench.c b/tests/atomic_add-bench.c index 2f6c72f63a..338b9563e3 100644 --- a/tests/atomic_add-bench.c +++ b/tests/atomic_add-bench.c @@ -2,6 +2,7 @@ #include "qemu/thread.h" #include "qemu/host-utils.h" #include "qemu/processor.h" +#include "qapi/error.h" struct thread_info { uint64_t r; @@ -110,7 +111,7 @@ static void create_threads(void) info->r = (i + 1) ^ time(NULL); qemu_thread_create(&threads[i], NULL, thread_func, info, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); } } diff --git a/tests/iothread.c b/tests/iothread.c index 777d9eea46..f4ad992e61 100644 --- a/tests/iothread.c +++ b/tests/iothread.c @@ -73,7 +73,7 @@ IOThread *iothread_new(void) qemu_mutex_init(&iothread->init_done_lock); qemu_cond_init(&iothread->init_done_cond); qemu_thread_create(&iothread->thread, NULL, iothread_run, - iothread, QEMU_THREAD_JOINABLE); + iothread, QEMU_THREAD_JOINABLE, &error_abort); /* Wait for initialization to complete */ qemu_mutex_lock(&iothread->init_done_lock); diff --git a/tests/qht-bench.c b/tests/qht-bench.c index 2089e2bed1..71df567ea2 100644 --- a/tests/qht-bench.c +++ b/tests/qht-bench.c @@ -9,6 +9,7 @@ #include "qemu/atomic.h" #include "qemu/qht.h" #include "qemu/rcu.h" +#include "qapi/error.h" #include "exec/tb-hash-xx.h" struct thread_stats { @@ -247,7 +248,7 @@ th_create_n(QemuThread **threads, struct thread_info **infos, const char *name, prepare_thread_info(&info[i], offset + i); info[i].func = func; qemu_thread_create(&th[i], name, thread_func, &info[i], - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); } } diff --git a/tests/rcutorture.c b/tests/rcutorture.c index 49311c82ea..0e799ff256 100644 --- a/tests/rcutorture.c +++ b/tests/rcutorture.c @@ -64,6 +64,7 @@ #include "qemu/atomic.h" #include "qemu/rcu.h" #include "qemu/thread.h" +#include "qapi/error.h" long long n_reads = 0LL; long n_updates = 0L; @@ -90,7 +91,7 @@ static void create_thread(void *(*func)(void *)) exit(-1); } qemu_thread_create(&threads[n_threads], "test", func, &data[n_threads], - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); n_threads++; } diff --git a/tests/test-aio.c b/tests/test-aio.c index 86fb73b3d5..b3ac261724 100644 --- a/tests/test-aio.c +++ b/tests/test-aio.c @@ -154,7 +154,7 @@ static void test_acquire(void) qemu_thread_create(&thread, "test_acquire_thread", test_acquire_thread, - &data, QEMU_THREAD_JOINABLE); + &data, QEMU_THREAD_JOINABLE, &error_abort); /* Block in aio_poll(), let other thread kick us and acquire context */ aio_context_acquire(ctx); diff --git a/tests/test-rcu-list.c b/tests/test-rcu-list.c index 2e6f70bd59..0f7da81291 100644 --- a/tests/test-rcu-list.c +++ b/tests/test-rcu-list.c @@ -25,6 +25,7 @@ #include "qemu/rcu.h" #include "qemu/thread.h" #include "qemu/rcu_queue.h" +#include "qapi/error.h" /* * Test variables. @@ -68,7 +69,7 @@ static void create_thread(void *(*func)(void *)) exit(-1); } qemu_thread_create(&threads[n_threads], "test", func, &data[n_threads], - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); n_threads++; } diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c index 929391f85d..35a652d1fd 100644 --- a/ui/vnc-jobs.c +++ b/ui/vnc-jobs.c @@ -31,6 +31,7 @@ #include "vnc-jobs.h" #include "qemu/sockets.h" #include "qemu/main-loop.h" +#include "qapi/error.h" #include "block/aio.h" /* @@ -331,15 +332,21 @@ static bool vnc_worker_thread_running(void) return queue; /* Check global queue */ } -void vnc_start_worker_thread(void) +bool vnc_start_worker_thread(Error **errp) { VncJobQueue *q; - if (vnc_worker_thread_running()) - return ; + if (vnc_worker_thread_running()) { + goto out; + } q = vnc_queue_init(); - qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, q, - QEMU_THREAD_DETACHED); + if (!qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, + q, QEMU_THREAD_DETACHED, errp)) { + vnc_queue_clear(q); + return false; + } queue = q; /* Set global queue */ +out: + return true; } diff --git a/ui/vnc-jobs.h b/ui/vnc-jobs.h index 59f66bcc35..14640593db 100644 --- a/ui/vnc-jobs.h +++ b/ui/vnc-jobs.h @@ -37,7 +37,7 @@ void vnc_job_push(VncJob *job); void vnc_jobs_join(VncState *vs); void vnc_jobs_consume_buffer(VncState *vs); -void vnc_start_worker_thread(void); +bool vnc_start_worker_thread(Error **errp); /* Locks */ static inline int vnc_trylock_display(VncDisplay *vd) diff --git a/ui/vnc.c b/ui/vnc.c index 0c1b477425..0ffe9e6a5d 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -3236,7 +3236,9 @@ void vnc_display_init(const char *id, Error **errp) vd->connections_limit = 32; qemu_mutex_init(&vd->mutex); - vnc_start_worker_thread(); + if (!vnc_start_worker_thread(errp)) { + return; + } vd->dcl.ops = &dcl_ops; register_displaychangelistener(&vd->dcl); diff --git a/util/compatfd.c b/util/compatfd.c index 980bd33e52..886aa249f9 100644 --- a/util/compatfd.c +++ b/util/compatfd.c @@ -16,6 +16,7 @@ #include "qemu/osdep.h" #include "qemu-common.h" #include "qemu/thread.h" +#include "qapi/error.h" #include <sys/syscall.h> @@ -70,6 +71,7 @@ static int qemu_signalfd_compat(const sigset_t *mask) struct sigfd_compat_info *info; QemuThread thread; int fds[2]; + Error *local_err = NULL; info = malloc(sizeof(*info)); if (info == NULL) { @@ -88,8 +90,14 @@ static int qemu_signalfd_compat(const sigset_t *mask) memcpy(&info->mask, mask, sizeof(*mask)); info->fd = fds[1]; - qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, info, - QEMU_THREAD_DETACHED); + if (!qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, + info, QEMU_THREAD_DETACHED, &local_err)) { + error_reportf_err(local_err, "failed to create sigwait_compat: "); + close(fds[0]); + close(fds[1]); + free(info); + return -1; + } return fds[0]; } diff --git a/util/oslib-posix.c b/util/oslib-posix.c index fbd0dc8c57..c05ed9d020 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -437,9 +437,12 @@ static bool touch_all_pages(char *area, size_t hpagesize, size_t numpages, size_t size_per_thread; char *addr = area; int i = 0; + int started_thread = 0; + Error *local_err = NULL; memset_thread_failed = false; memset_num_threads = get_memset_num_threads(smp_cpus); + started_thread = memset_num_threads; memset_thread = g_new0(MemsetThread, memset_num_threads); numpages_per_thread = (numpages / memset_num_threads); size_per_thread = (hpagesize * numpages_per_thread); @@ -448,13 +451,19 @@ static bool touch_all_pages(char *area, size_t hpagesize, size_t numpages, memset_thread[i].numpages = (i == (memset_num_threads - 1)) ? numpages : numpages_per_thread; memset_thread[i].hpagesize = hpagesize; - qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", - do_touch_pages, &memset_thread[i], - QEMU_THREAD_JOINABLE); + if (!qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", + do_touch_pages, &memset_thread[i], + QEMU_THREAD_JOINABLE, &local_err)) { + error_reportf_err(local_err, "failed to create do_touch_pages: "); + memset_thread_failed = true; + started_thread = i; + goto out; + } addr += size_per_thread; numpages -= numpages_per_thread; } - for (i = 0; i < memset_num_threads; i++) { +out: + for (i = 0; i < started_thread; i++) { qemu_thread_join(&memset_thread[i].pgthread); } g_free(memset_thread); diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index 289af4fab5..f2246dac02 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -15,6 +15,7 @@ #include "qemu/atomic.h" #include "qemu/notify.h" #include "qemu-thread-common.h" +#include "qapi/error.h" static bool name_threads; @@ -504,9 +505,9 @@ static void *qemu_thread_start(void *args) return start_routine(arg); } -void qemu_thread_create(QemuThread *thread, const char *name, - void *(*start_routine)(void*), - void *arg, int mode) +bool qemu_thread_create(QemuThread *thread, const char *name, + void *(*start_routine)(void *), + void *arg, int mode, Error **errp) { sigset_t set, oldset; int err; @@ -515,7 +516,9 @@ void qemu_thread_create(QemuThread *thread, const char *name, err = pthread_attr_init(&attr); if (err) { - error_exit(err, __func__); + error_setg_errno(errp, -err, "pthread_attr_init failed: %s", + strerror(err)); + return false; } if (mode == QEMU_THREAD_DETACHED) { @@ -530,16 +533,21 @@ void qemu_thread_create(QemuThread *thread, const char *name, qemu_thread_args->name = g_strdup(name); qemu_thread_args->start_routine = start_routine; qemu_thread_args->arg = arg; - err = pthread_create(&thread->thread, &attr, qemu_thread_start, qemu_thread_args); - - if (err) - error_exit(err, __func__); + if (err) { + error_setg_errno(errp, -err, "pthread_create failed: %s", + strerror(err)); + pthread_attr_destroy(&attr); + g_free(qemu_thread_args->name); + g_free(qemu_thread_args); + return false; + } pthread_sigmask(SIG_SETMASK, &oldset, NULL); pthread_attr_destroy(&attr); + return true; } void qemu_thread_get_self(QemuThread *thread) diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c index 1a27e1cf6f..ca4d5329e3 100644 --- a/util/qemu-thread-win32.c +++ b/util/qemu-thread-win32.c @@ -20,6 +20,7 @@ #include "qemu/thread.h" #include "qemu/notify.h" #include "qemu-thread-common.h" +#include "qapi/error.h" #include <process.h> static bool name_threads; @@ -388,9 +389,9 @@ void *qemu_thread_join(QemuThread *thread) return ret; } -void qemu_thread_create(QemuThread *thread, const char *name, - void *(*start_routine)(void *), - void *arg, int mode) +bool qemu_thread_create(QemuThread *thread, const char *name, + void *(*start_routine)(void *), + void *arg, int mode, Error **errp) { HANDLE hThread; struct QemuThreadData *data; @@ -409,10 +410,17 @@ void qemu_thread_create(QemuThread *thread, const char *name, hThread = (HANDLE) _beginthreadex(NULL, 0, win32_start_routine, data, 0, &thread->tid); if (!hThread) { - error_exit(GetLastError(), __func__); + if (data->mode != QEMU_THREAD_DETACHED) { + DeleteCriticalSection(&data->cs); + } + error_setg_errno(errp, errno, + "failed to create win32_start_routine"); + g_free(data); + return false; } CloseHandle(hThread); thread->data = data; + return true; } void qemu_thread_get_self(QemuThread *thread) diff --git a/util/rcu.c b/util/rcu.c index 5676c22bd1..145dcdb0c6 100644 --- a/util/rcu.c +++ b/util/rcu.c @@ -32,6 +32,7 @@ #include "qemu/atomic.h" #include "qemu/thread.h" #include "qemu/main-loop.h" +#include "qapi/error.h" #if defined(CONFIG_MALLOC_TRIM) #include <malloc.h> #endif @@ -325,7 +326,7 @@ static void rcu_init_complete(void) * must have been quiescent even after forking, just recreate it. */ qemu_thread_create(&thread, "call_rcu", call_rcu_thread, - NULL, QEMU_THREAD_DETACHED); + NULL, QEMU_THREAD_DETACHED, &error_abort); rcu_register_thread(); } diff --git a/util/thread-pool.c b/util/thread-pool.c index 610646d131..ad0f980783 100644 --- a/util/thread-pool.c +++ b/util/thread-pool.c @@ -22,6 +22,7 @@ #include "trace.h" #include "block/thread-pool.h" #include "qemu/main-loop.h" +#include "qapi/error.h" static void do_spawn_thread(ThreadPool *pool); @@ -132,7 +133,8 @@ static void do_spawn_thread(ThreadPool *pool) pool->new_threads--; pool->pending_threads++; - qemu_thread_create(&t, "worker", worker_thread, pool, QEMU_THREAD_DETACHED); + qemu_thread_create(&t, "worker", worker_thread, pool, + QEMU_THREAD_DETACHED, &error_abort); } static void spawn_thread_bh_fn(void *opaque) -- 2.13.7 ^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle Fei Li @ 2018-11-05 13:53 ` Juan Quintela 2018-11-06 7:15 ` Fei Li 0 siblings, 1 reply; 32+ messages in thread From: Juan Quintela @ 2018-11-05 13:53 UTC (permalink / raw) To: Fei Li; +Cc: qemu-devel, armbru, dgilbert, famz, peterx Fei Li <fli@suse.com> wrote: > Make qemu_thread_create() return a Boolean to indicate if it succeeds > rather than failing with an error. And add an Error parameter to hold > the error message and let the callers handle it. Nice work, thanks. > Signed-off-by: Fei Li <fli@suse.com> > --- > cpus.c | 45 ++++++++++++++++++++++++------------- > dump.c | 6 +++-- > hw/misc/edu.c | 6 +++-- > hw/ppc/spapr_hcall.c | 10 +++++++-- > hw/rdma/rdma_backend.c | 4 +++- > hw/usb/ccid-card-emulated.c | 15 +++++++++---- > include/qemu/thread.h | 4 ++-- > io/task.c | 3 ++- > iothread.c | 16 +++++++++----- > migration/migration.c | 54 +++++++++++++++++++++++++++++---------------- > migration/postcopy-ram.c | 14 ++++++++++-- > migration/ram.c | 41 +++++++++++++++++++++++++--------- > migration/savevm.c | 11 ++++++--- > tests/atomic_add-bench.c | 3 ++- > tests/iothread.c | 2 +- > tests/qht-bench.c | 3 ++- > tests/rcutorture.c | 3 ++- > tests/test-aio.c | 2 +- > tests/test-rcu-list.c | 3 ++- > ui/vnc-jobs.c | 17 +++++++++----- > ui/vnc-jobs.h | 2 +- > ui/vnc.c | 4 +++- > util/compatfd.c | 12 ++++++++-- > util/oslib-posix.c | 17 ++++++++++---- > util/qemu-thread-posix.c | 24 +++++++++++++------- > util/qemu-thread-win32.c | 16 ++++++++++---- > util/rcu.c | 3 ++- > util/thread-pool.c | 4 +++- > 28 files changed, 243 insertions(+), 101 deletions(-) > > diff --git a/cpus.c b/cpus.c > index ed71618e1f..0510f90e06 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -1949,15 +1949,20 @@ static void qemu_tcg_init_vcpu(CPUState *cpu, Error **errp) > snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG", > cpu->cpu_index); > > - qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn, > - cpu, QEMU_THREAD_JOINABLE); > + if (!qemu_thread_create(cpu->thread, thread_name, > + qemu_tcg_cpu_thread_fn, cpu, > + QEMU_THREAD_JOINABLE, errp)) { I think that in this cases where you are not handling the error, you should use an exit() here. We can't continue. I am not saying that you need to fix all the places that call qmeu_thread_create() to handle the error gracefully, but in the places where you don't do, you should just exit. I.e. this patch should be split in something that does: - qemu_thread_create(...., errp); + if (!qemu_thread_create(..., errp)) { + error_report_err(errp); + exit(1); + } So, we can fix any caller independtly from here. Otherwise, we are ignoring an important error. What do you think? Later, Juan. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle 2018-11-05 13:53 ` Juan Quintela @ 2018-11-06 7:15 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-06 7:15 UTC (permalink / raw) To: quintela; +Cc: peterx, famz, qemu-devel, dgilbert, armbru On 11/05/2018 09:53 PM, Juan Quintela wrote: > Fei Li <fli@suse.com> wrote: >> Make qemu_thread_create() return a Boolean to indicate if it succeeds >> rather than failing with an error. And add an Error parameter to hold >> the error message and let the callers handle it. > Nice work, thanks. > > >> Signed-off-by: Fei Li <fli@suse.com> >> --- >> cpus.c | 45 ++++++++++++++++++++++++------------- >> dump.c | 6 +++-- >> hw/misc/edu.c | 6 +++-- >> hw/ppc/spapr_hcall.c | 10 +++++++-- >> hw/rdma/rdma_backend.c | 4 +++- >> hw/usb/ccid-card-emulated.c | 15 +++++++++---- >> include/qemu/thread.h | 4 ++-- >> io/task.c | 3 ++- >> iothread.c | 16 +++++++++----- >> migration/migration.c | 54 +++++++++++++++++++++++++++++---------------- >> migration/postcopy-ram.c | 14 ++++++++++-- >> migration/ram.c | 41 +++++++++++++++++++++++++--------- >> migration/savevm.c | 11 ++++++--- >> tests/atomic_add-bench.c | 3 ++- >> tests/iothread.c | 2 +- >> tests/qht-bench.c | 3 ++- >> tests/rcutorture.c | 3 ++- >> tests/test-aio.c | 2 +- >> tests/test-rcu-list.c | 3 ++- >> ui/vnc-jobs.c | 17 +++++++++----- >> ui/vnc-jobs.h | 2 +- >> ui/vnc.c | 4 +++- >> util/compatfd.c | 12 ++++++++-- >> util/oslib-posix.c | 17 ++++++++++---- >> util/qemu-thread-posix.c | 24 +++++++++++++------- >> util/qemu-thread-win32.c | 16 ++++++++++---- >> util/rcu.c | 3 ++- >> util/thread-pool.c | 4 +++- >> 28 files changed, 243 insertions(+), 101 deletions(-) >> >> diff --git a/cpus.c b/cpus.c >> index ed71618e1f..0510f90e06 100644 >> --- a/cpus.c >> +++ b/cpus.c >> @@ -1949,15 +1949,20 @@ static void qemu_tcg_init_vcpu(CPUState *cpu, Error **errp) >> snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG", >> cpu->cpu_index); >> >> - qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn, >> - cpu, QEMU_THREAD_JOINABLE); >> + if (!qemu_thread_create(cpu->thread, thread_name, >> + qemu_tcg_cpu_thread_fn, cpu, >> + QEMU_THREAD_JOINABLE, errp)) { > I think that in this cases where you are not handling the error, you > should use an exit() here. We can't continue. Not sure whether I understand correctly, but we can not use exit() here as there exists more than one caller and different caller has its own handling way. Instead we pass the errp to further callers to let them handle. Take the qemu_xxx_init_vcpu() for example, there are two callers: - the main thread to create vcpu while starting the guest[1]: pc_cpus_init() { pc_new_cpu(, &error_fatal); } - using hmp to hot-plug one cpu: hmp_cpu_add() { Error *err = NULL; qmp_cpu_add(, &err) { pc_hot_add_cpu(cpuid, &local_err) { pc_new_cpu(, &local_err); } } } For the first case, if there's an error, qemu will exit when error_handle_fatal(&error_fatal, ) is called by error_propagate(). For the second case, hmp_handle_error() will handle the error. > I am not saying that you need to fix all the places that call > qmeu_thread_create() to handle the error gracefully, but in the places > where you don't do, you should just exit. > > I.e. this patch should be split in something that does: > > - qemu_thread_create(...., errp); > + if (!qemu_thread_create(..., errp)) { > + error_report_err(errp); > + exit(1); > + } > > So, we can fix any caller independtly from here. > Otherwise, we are ignoring an important error. > > What do you think? > > Later, Juan. BTW, for those fatal errors only has one caller, e.g. qio_task_run_in_thread(), I just pass &error_abort to qemu_thread_create(). :) Have a nice day, thanks Fei [1] (gdb) bt #0 0x000055555584b333 in qemu_init_vcpu (cpu=0x555556927db0, errp=0x7fffffffda40) at /build/gitcode/qemu-build/cpus.c:2071 #1 0x0000555555969861 in x86_cpu_realizefn (dev=0x555556927db0, errp=0x7fffffffda40) at /build/gitcode/qemu-build/target/i386/cpu.c:5115 #2 0x0000555555a9fed6 in device_set_realized (obj=0x555556927db0, value=true, errp=0x7fffffffdc18) at hw/core/qdev.c:826 #3 0x0000555555ce91b1 in property_set_bool (obj=0x555556927db0, v= 0x55555693f380, name=0x555555f4f1a0 "realized", opaque=0x5555569046c0, errp=0x7fffffffdc18) at qom/object.c:1991 #4 0x0000555555ce707d in object_property_set (obj=0x555556927db0, v= 0x55555693f380, name=0x555555f4f1a0 "realized", errp=0x7fffffffdc18) at qom/object.c:1183 #5 0x0000555555cea893 in object_property_set_qobject (obj=0x555556927db0, value=0x5555569439b0, name=0x555555f4f1a0 "realized", errp=0x7fffffffdc18) at qom/qom-qobject.c:27 #6 0x0000555555ce7416 in object_property_set_bool (obj=0x555556927db0, value=true, name=0x555555f4f1a0 "realized", errp=0x7fffffffdc18) at qom/object.c:1249 #7 0x000055555592bb45 in pc_new_cpu (typename=0x555555f4fbcc "qemu64-x86_64-cpu", apic_id=0, errp=0x5555567f3b60 <error_fatal>) at /build/gitcode/qemu-build/hw/i386/pc.c:1112 #8 0x000055555592bdbf in pc_cpus_init (pcms=0x5555568ee1f0) at /build/gitcode/qemu-build/hw/i386/pc.c:1160 #9 0x0000555555930b28 in pc_init1 (machine=0x5555568ee1f0, host_type=0x555555f5056c "i440FX-pcihost", pci_type=0x555555f50565 "i440FX") at /build/gitcode/qemu-build/hw/i386/pc_piix.c:153 #10 0x0000555555931946 in pc_init_v3_0 (machine=0x5555568ee1f0) at /build/gitcode/qemu-build/hw/i386/pc_piix.c:438 #11 0x0000555555aaa036 in machine_run_board_init (machine=0x5555568ee1f0) at hw/core/machine.c:834 #12 0x0000555555a03593 in main (argc=30, argv=0x7fffffffe148, envp=0x7fffffffe240) at vl.c:4503 ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (8 preceding siblings ...) 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle Fei Li @ 2018-11-03 18:09 ` no-reply 2018-11-05 4:57 ` Fei Li 2018-11-05 18:19 ` no-reply 10 siblings, 1 reply; 32+ messages in thread From: no-reply @ 2018-11-03 18:09 UTC (permalink / raw) To: fli; +Cc: famz, qemu-devel, quintela Hi, This series failed docker-quick@centos7 build test. Please find the testing commands and their output below. If you have Docker installed, you can probably reproduce it locally. Type: series Message-id: 20181101101715.9443-1-fli@suse.com Subject: [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check === TEST SCRIPT BEGIN === #!/bin/bash time make docker-test-quick@centos7 SHOW_ENV=1 J=8 === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 Switched to a new branch 'test' 8239f692a6 qemu_thread_create: propagate the error to callers to handle f73c91c32a migration: add more error handling for postcopy_ram_enable_notify 6b8c9d0a7b migration: remove unused &local_err parameter in migrate_set_error adcb648e2e migration: fix the multifd code when receiving less channels ce89d9baf9 migration: fix the multifd code when sending less channels a06e512206 migration: fix some segmentation faults when using multifd 7f516dc786 qemu_thread_join: fix segmentation fault a6f6f24ff3 qemu_init_vcpu: add a new Error parameter to propagate b44013aa26 Fix segmentation fault when qemu_signal_init fails === OUTPUT BEGIN === BUILD centos7 make[1]: Entering directory '/var/tmp/patchew-tester-tmp-6f6bzbwa/src' GEN /var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar Cloning into '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar.vroot'... done. Your branch is up-to-date with 'origin/test'. Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc' Cloning into '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar.vroot/dtc'... Submodule path 'dtc': checked out '88f18909db731a627456f26d779445f84e449536' Submodule 'ui/keycodemapdb' (git://git.qemu.org/keycodemapdb.git) registered for path 'ui/keycodemapdb' Cloning into '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar.vroot/ui/keycodemapdb'... Submodule path 'ui/keycodemapdb': checked out '6b3d716e2b6472eb7189d3220552280ef3d832ce' COPY RUNNER RUN test-quick in qemu:centos7 Packages installed: SDL-devel-1.2.15-14.el7.x86_64 bison-3.0.4-1.el7.x86_64 bzip2-1.0.6-13.el7.x86_64 bzip2-devel-1.0.6-13.el7.x86_64 ccache-3.3.4-1.el7.x86_64 csnappy-devel-0-6.20150729gitd7bc683.el7.x86_64 flex-2.5.37-3.el7.x86_64 gcc-4.8.5-28.el7_5.1.x86_64 gettext-0.19.8.1-2.el7.x86_64 git-1.8.3.1-14.el7_5.x86_64 glib2-devel-2.54.2-2.el7.x86_64 libaio-devel-0.3.109-13.el7.x86_64 libepoxy-devel-1.3.1-2.el7_5.x86_64 libfdt-devel-1.4.6-1.el7.x86_64 lzo-devel-2.06-8.el7.x86_64 make-3.82-23.el7.x86_64 mesa-libEGL-devel-17.2.3-8.20171019.el7.x86_64 mesa-libgbm-devel-17.2.3-8.20171019.el7.x86_64 nettle-devel-2.7.1-8.el7.x86_64 package g++ is not installed package librdmacm-devel is not installed pixman-devel-0.34.0-1.el7.x86_64 spice-glib-devel-0.34-3.el7_5.1.x86_64 spice-server-devel-0.14.0-2.el7_5.4.x86_64 tar-1.26-34.el7.x86_64 vte-devel-0.28.2-10.el7.x86_64 xen-devel-4.6.6-12.el7.x86_64 zlib-devel-1.2.7-17.el7.x86_64 Environment variables: PACKAGES=bison bzip2 bzip2-devel ccache csnappy-devel flex g++ gcc gettext git glib2-devel libaio-devel libepoxy-devel libfdt-devel librdmacm-devel lzo-devel make mesa-libEGL-devel mesa-libgbm-devel nettle-devel pixman-devel SDL-devel spice-glib-devel spice-server-devel tar vte-devel xen-devel zlib-devel HOSTNAME=ec6a074d2e2d MAKEFLAGS= -j8 J=8 CCACHE_DIR=/var/tmp/ccache EXTRA_CONFIGURE_OPTS= V= SHOW_ENV=1 PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ TARGET_LIST= SHLVL=1 HOME=/home/patchew TEST_DIR=/tmp/qemu-test FEATURES= dtc DEBUG= _=/usr/bin/env Configure options: --enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/tmp/qemu-test/install No C++ compiler available; disabling C++ specific optional code Install prefix /tmp/qemu-test/install BIOS directory /tmp/qemu-test/install/share/qemu firmware path /tmp/qemu-test/install/share/qemu-firmware binary directory /tmp/qemu-test/install/bin library directory /tmp/qemu-test/install/lib module directory /tmp/qemu-test/install/lib/qemu libexec directory /tmp/qemu-test/install/libexec include directory /tmp/qemu-test/install/include config directory /tmp/qemu-test/install/etc local state directory /tmp/qemu-test/install/var Manual directory /tmp/qemu-test/install/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /tmp/qemu-test/src GIT binary git GIT submodules C compiler cc Host C compiler cc C++ compiler Objective-C compiler cc ARFLAGS rv CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g QEMU_CFLAGS -I/usr/include/pixman-1 -Werror -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -Wno-missing-braces -I/usr/include/libpng15 -pthread -I/usr/include/spice-server -I/usr/include/cacard -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/spice-1 LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g QEMU_LDFLAGS make make install install python python -B smbd /usr/sbin/smbd module support no host CPU x86_64 host big endian no target list x86_64-softmmu aarch64-softmmu gprof enabled no sparse enabled no strip binaries yes profiler no static build no SDL support yes (1.2.15) GTK support no GTK GL support no VTE support no TLS priority NORMAL GNUTLS support no libgcrypt no nettle yes (2.7.1) libtasn1 no curses support yes virgl support no curl support no mingw32 support no Audio drivers oss Block whitelist (rw) Block whitelist (ro) VirtFS support no Multipath support no VNC support yes VNC SASL support no VNC JPEG support no VNC PNG support yes xen support yes xen ctrl version 40600 pv dom build no brlapi support no bluez support no Documentation no PIE yes vde support no netmap support no Linux AIO support yes ATTR/XATTR support yes Install blobs yes KVM support yes HAX support no HVF support no WHPX support no TCG support yes TCG debug enabled no TCG interpreter no malloc trim support yes RDMA support yes PVRDMA support yes fdt support system membarrier no preadv support yes fdatasync yes madvise yes posix_madvise yes posix_memalign yes libcap-ng support no vhost-net support yes vhost-crypto support yes vhost-scsi support yes vhost-vsock support yes vhost-user support yes Trace backends log spice support yes (0.12.13/0.14.0) rbd support no xfsctl support no smartcard support yes libusb no usb net redir no OpenGL support yes OpenGL dmabufs yes libiscsi support no libnfs support no build guest agent yes QGA VSS support no QGA w32 disk info no QGA MSI support no seccomp support no coroutine backend ucontext coroutine pool yes debug stack usage no mutex debugging no crypto afalg no GlusterFS support no gcov gcov gcov enabled no TPM support yes libssh2 support no TPM passthrough yes TPM emulator yes QOM debugging yes Live block migration yes lzo support yes snappy support no bzip2 support yes NUMA host support no libxml2 no tcmalloc support no jemalloc support no avx2 optimization yes replication support yes VxHS block device no capstone no docker no libpmem support no libudev no WARNING: Use of SDL 1.2 is deprecated and will be removed in WARNING: future releases. Please switch to using SDL 2.0 NOTE: cross-compilers enabled: 'cc' GEN x86_64-softmmu/config-devices.mak.tmp GEN aarch64-softmmu/config-devices.mak.tmp GEN config-host.h GEN qemu-options.def GEN qapi-gen GEN trace/generated-tcg-tracers.h GEN trace/generated-helpers-wrappers.h GEN trace/generated-helpers.h GEN trace/generated-helpers.c GEN module_block.h GEN x86_64-softmmu/config-devices.mak GEN aarch64-softmmu/config-devices.mak GEN ui/input-keymap-atset1-to-qcode.c GEN ui/input-keymap-linux-to-qcode.c GEN ui/input-keymap-qcode-to-atset1.c GEN ui/input-keymap-qcode-to-atset2.c GEN ui/input-keymap-qcode-to-atset3.c GEN ui/input-keymap-qcode-to-linux.c GEN ui/input-keymap-qcode-to-qnum.c GEN ui/input-keymap-qcode-to-sun.c GEN ui/input-keymap-qnum-to-qcode.c GEN ui/input-keymap-usb-to-qcode.c GEN ui/input-keymap-win32-to-qcode.c GEN ui/input-keymap-x11-to-qcode.c GEN ui/input-keymap-xorgevdev-to-qcode.c GEN ui/input-keymap-xorgkbd-to-qcode.c GEN ui/input-keymap-xorgxquartz-to-qcode.c GEN ui/input-keymap-xorgxwin-to-qcode.c GEN ui/input-keymap-osx-to-qcode.c GEN tests/test-qapi-gen GEN trace-root.h GEN accel/kvm/trace.h GEN accel/tcg/trace.h GEN audio/trace.h GEN block/trace.h GEN chardev/trace.h GEN crypto/trace.h GEN hw/9pfs/trace.h GEN hw/acpi/trace.h GEN hw/alpha/trace.h GEN hw/arm/trace.h GEN hw/audio/trace.h GEN hw/block/trace.h GEN hw/block/dataplane/trace.h GEN hw/char/trace.h GEN hw/display/trace.h GEN hw/dma/trace.h GEN hw/hppa/trace.h GEN hw/i2c/trace.h GEN hw/i386/trace.h GEN hw/i386/xen/trace.h GEN hw/ide/trace.h GEN hw/input/trace.h GEN hw/intc/trace.h GEN hw/isa/trace.h GEN hw/mem/trace.h GEN hw/misc/trace.h GEN hw/misc/macio/trace.h GEN hw/net/trace.h GEN hw/nvram/trace.h GEN hw/pci/trace.h GEN hw/pci-host/trace.h GEN hw/ppc/trace.h GEN hw/rdma/trace.h GEN hw/rdma/vmw/trace.h GEN hw/s390x/trace.h GEN hw/scsi/trace.h GEN hw/sd/trace.h GEN hw/sparc/trace.h GEN hw/sparc64/trace.h GEN hw/timer/trace.h GEN hw/tpm/trace.h GEN hw/usb/trace.h GEN hw/vfio/trace.h GEN hw/virtio/trace.h GEN hw/watchdog/trace.h GEN hw/xen/trace.h GEN io/trace.h GEN linux-user/trace.h GEN migration/trace.h GEN nbd/trace.h GEN net/trace.h GEN qapi/trace.h GEN qom/trace.h GEN scsi/trace.h GEN target/arm/trace.h GEN target/i386/trace.h GEN target/mips/trace.h GEN target/ppc/trace.h GEN target/s390x/trace.h GEN target/sparc/trace.h GEN ui/trace.h GEN util/trace.h GEN trace-root.c GEN accel/kvm/trace.c GEN accel/tcg/trace.c GEN audio/trace.c GEN block/trace.c GEN chardev/trace.c GEN crypto/trace.c GEN hw/9pfs/trace.c GEN hw/acpi/trace.c GEN hw/alpha/trace.c GEN hw/arm/trace.c GEN hw/audio/trace.c GEN hw/block/trace.c GEN hw/block/dataplane/trace.c GEN hw/char/trace.c GEN hw/display/trace.c GEN hw/dma/trace.c GEN hw/hppa/trace.c GEN hw/i2c/trace.c GEN hw/i386/trace.c GEN hw/i386/xen/trace.c GEN hw/ide/trace.c GEN hw/input/trace.c GEN hw/intc/trace.c GEN hw/isa/trace.c GEN hw/mem/trace.c GEN hw/misc/trace.c GEN hw/misc/macio/trace.c GEN hw/net/trace.c GEN hw/nvram/trace.c GEN hw/pci/trace.c GEN hw/pci-host/trace.c GEN hw/ppc/trace.c GEN hw/rdma/trace.c GEN hw/rdma/vmw/trace.c GEN hw/s390x/trace.c GEN hw/scsi/trace.c GEN hw/sd/trace.c GEN hw/sparc/trace.c GEN hw/sparc64/trace.c GEN hw/timer/trace.c GEN hw/tpm/trace.c GEN hw/usb/trace.c GEN hw/vfio/trace.c GEN hw/virtio/trace.c GEN hw/watchdog/trace.c GEN hw/xen/trace.c GEN io/trace.c GEN linux-user/trace.c GEN migration/trace.c GEN nbd/trace.c GEN net/trace.c GEN qapi/trace.c GEN qom/trace.c GEN scsi/trace.c GEN target/arm/trace.c GEN target/i386/trace.c GEN target/mips/trace.c GEN target/ppc/trace.c GEN target/s390x/trace.c GEN target/sparc/trace.c GEN ui/trace.c GEN util/trace.c GEN config-all-devices.mak CC tests/qemu-iotests/socket_scm_helper.o GEN qga/qapi-generated/qapi-gen CC qapi/qapi-builtin-types.o CC qapi/qapi-types.o CC qapi/qapi-types-block-core.o CC qapi/qapi-types-block.o CC qapi/qapi-types-char.o CC qapi/qapi-types-common.o CC qapi/qapi-types-crypto.o CC qapi/qapi-types-introspect.o CC qapi/qapi-types-job.o CC qapi/qapi-types-migration.o CC qapi/qapi-types-misc.o CC qapi/qapi-types-net.o CC qapi/qapi-types-rocker.o CC qapi/qapi-types-run-state.o CC qapi/qapi-types-sockets.o CC qapi/qapi-types-tpm.o CC qapi/qapi-types-trace.o CC qapi/qapi-types-transaction.o CC qapi/qapi-types-ui.o CC qapi/qapi-builtin-visit.o CC qapi/qapi-visit.o CC qapi/qapi-visit-block-core.o CC qapi/qapi-visit-block.o CC qapi/qapi-visit-char.o CC qapi/qapi-visit-common.o CC qapi/qapi-visit-crypto.o CC qapi/qapi-visit-introspect.o CC qapi/qapi-visit-job.o CC qapi/qapi-visit-migration.o CC qapi/qapi-visit-misc.o CC qapi/qapi-visit-net.o CC qapi/qapi-visit-rocker.o CC qapi/qapi-visit-run-state.o CC qapi/qapi-visit-sockets.o CC qapi/qapi-visit-tpm.o CC qapi/qapi-visit-trace.o CC qapi/qapi-visit-transaction.o CC qapi/qapi-visit-ui.o CC qapi/qapi-events.o CC qapi/qapi-events-block-core.o CC qapi/qapi-events-block.o CC qapi/qapi-events-char.o CC qapi/qapi-events-common.o CC qapi/qapi-events-crypto.o CC qapi/qapi-events-introspect.o CC qapi/qapi-events-job.o CC qapi/qapi-events-migration.o CC qapi/qapi-events-misc.o CC qapi/qapi-events-net.o CC qapi/qapi-events-rocker.o CC qapi/qapi-events-run-state.o CC qapi/qapi-events-sockets.o CC qapi/qapi-events-tpm.o CC qapi/qapi-events-trace.o CC qapi/qapi-events-transaction.o CC qapi/qapi-events-ui.o CC qapi/qapi-introspect.o CC qapi/qapi-dealloc-visitor.o CC qapi/qapi-visit-core.o CC qapi/qobject-input-visitor.o CC qapi/qobject-output-visitor.o CC qapi/qmp-registry.o CC qapi/qmp-dispatch.o CC qapi/string-input-visitor.o CC qapi/string-output-visitor.o CC qapi/opts-visitor.o CC qapi/qapi-clone-visitor.o CC qapi/qmp-event.o CC qapi/qapi-util.o CC qobject/qnull.o CC qobject/qnum.o CC qobject/qstring.o CC qobject/qdict.o CC qobject/qlist.o CC qobject/qbool.o CC qobject/qlit.o CC qobject/qjson.o CC qobject/qobject.o CC qobject/json-lexer.o CC qobject/json-streamer.o CC qobject/json-parser.o CC qobject/block-qdict.o CC trace/control.o CC trace/qmp.o CC util/osdep.o CC util/cutils.o CC util/unicode.o CC util/qemu-timer-common.o CC util/bufferiszero.o CC util/lockcnt.o CC util/aiocb.o CC util/async.o CC util/aio-wait.o CC util/thread-pool.o CC util/qemu-timer.o CC util/main-loop.o CC util/iohandler.o CC util/aio-posix.o CC util/compatfd.o CC util/event_notifier-posix.o CC util/mmap-alloc.o CC util/oslib-posix.o CC util/qemu-openpty.o CC util/qemu-thread-posix.o CC util/memfd.o CC util/envlist.o CC util/path.o CC util/module.o CC util/host-utils.o CC util/bitmap.o CC util/bitops.o CC util/hbitmap.o CC util/fifo8.o CC util/acl.o CC util/cacheinfo.o CC util/error.o CC util/qemu-error.o CC util/id.o CC util/iov.o CC util/qemu-config.o CC util/qemu-sockets.o CC util/uri.o CC util/notify.o CC util/qemu-option.o CC util/qemu-progress.o CC util/keyval.o CC util/hexdump.o CC util/crc32c.o CC util/uuid.o CC util/throttle.o CC util/getauxval.o CC util/readline.o CC util/rcu.o CC util/qemu-coroutine.o CC util/qemu-coroutine-lock.o CC util/qemu-coroutine-io.o CC util/qemu-coroutine-sleep.o CC util/coroutine-ucontext.o CC util/buffer.o CC util/timed-average.o CC util/base64.o CC util/log.o CC util/pagesize.o CC util/qdist.o CC util/qht.o CC util/qsp.o CC util/range.o CC util/stats64.o CC util/systemd.o CC util/iova-tree.o CC util/vfio-helpers.o CC util/drm.o CC trace-root.o CC accel/kvm/trace.o CC accel/tcg/trace.o CC audio/trace.o CC block/trace.o CC chardev/trace.o CC crypto/trace.o CC hw/9pfs/trace.o CC hw/acpi/trace.o CC hw/alpha/trace.o CC hw/arm/trace.o CC hw/audio/trace.o CC hw/block/trace.o CC hw/block/dataplane/trace.o CC hw/char/trace.o CC hw/display/trace.o CC hw/dma/trace.o CC hw/hppa/trace.o CC hw/i2c/trace.o CC hw/i386/trace.o CC hw/i386/xen/trace.o CC hw/ide/trace.o CC hw/input/trace.o CC hw/intc/trace.o CC hw/isa/trace.o CC hw/mem/trace.o CC hw/misc/trace.o CC hw/misc/macio/trace.o CC hw/net/trace.o CC hw/nvram/trace.o CC hw/pci/trace.o CC hw/pci-host/trace.o CC hw/ppc/trace.o CC hw/rdma/trace.o CC hw/rdma/vmw/trace.o CC hw/s390x/trace.o CC hw/scsi/trace.o CC hw/sd/trace.o CC hw/sparc/trace.o CC hw/sparc64/trace.o CC hw/timer/trace.o CC hw/tpm/trace.o CC hw/usb/trace.o CC hw/vfio/trace.o CC hw/virtio/trace.o CC hw/watchdog/trace.o CC hw/xen/trace.o CC io/trace.o CC linux-user/trace.o CC migration/trace.o CC nbd/trace.o CC net/trace.o CC qapi/trace.o CC qom/trace.o CC scsi/trace.o CC target/arm/trace.o CC target/i386/trace.o CC target/mips/trace.o CC target/ppc/trace.o CC target/s390x/trace.o CC target/sparc/trace.o CC ui/trace.o CC util/trace.o CC crypto/pbkdf-stub.o CC stubs/arch-query-cpu-def.o CC stubs/arch-query-cpu-model-expansion.o CC stubs/arch-query-cpu-model-comparison.o CC stubs/arch-query-cpu-model-baseline.o CC stubs/bdrv-next-monitor-owned.o CC stubs/blk-commit-all.o CC stubs/blockdev-close-all-bdrv-states.o CC stubs/clock-warp.o CC stubs/cpu-get-clock.o CC stubs/cpu-get-icount.o CC stubs/dump.o CC stubs/error-printf.o CC stubs/fdset.o CC stubs/gdbstub.o CC stubs/get-vm-name.o CC stubs/iothread.o CC stubs/iothread-lock.o CC stubs/is-daemonized.o CC stubs/linux-aio.o CC stubs/machine-init-done.o CC stubs/migr-blocker.o CC stubs/change-state-handler.o CC stubs/monitor.o CC stubs/notify-event.o CC stubs/qtest.o CC stubs/replay.o CC stubs/runstate-check.o CC stubs/set-fd-handler.o CC stubs/slirp.o CC stubs/sysbus.o CC stubs/tpm.o CC stubs/trace-control.o CC stubs/uuid.o CC stubs/vm-stop.o CC stubs/vmstate.o CC stubs/qmp_memory_device.o CC stubs/target-monitor-defs.o CC stubs/target-get-monitor-def.o CC stubs/pc_madt_cpu_entry.o CC stubs/vmgenid.o CC stubs/xen-common.o CC stubs/xen-hvm.o CC stubs/pci-host-piix.o CC stubs/ram-block.o CC stubs/ramfb.o CC contrib/ivshmem-client/ivshmem-client.o CC contrib/ivshmem-client/main.o CC contrib/ivshmem-server/ivshmem-server.o CC contrib/ivshmem-server/main.o CC qemu-nbd.o CC block.o CC blockjob.o CC job.o CC qemu-io-cmds.o CC replication.o CC block/raw-format.o CC block/qcow.o CC block/vdi.o CC block/vmdk.o CC block/cloop.o CC block/bochs.o CC block/vpc.o CC block/vvfat.o CC block/dmg.o CC block/qcow2.o CC block/qcow2-refcount.o CC block/qcow2-cluster.o CC block/qcow2-snapshot.o CC block/qcow2-cache.o CC block/qcow2-bitmap.o CC block/qed.o CC block/qed-l2-cache.o CC block/qed-table.o CC block/qed-cluster.o CC block/qed-check.o CC block/vhdx.o CC block/vhdx-endian.o CC block/vhdx-log.o CC block/quorum.o CC block/parallels.o CC block/blkdebug.o CC block/blkverify.o CC block/blkreplay.o CC block/blklogwrites.o CC block/block-backend.o CC block/snapshot.o CC block/qapi.o CC block/file-posix.o CC block/linux-aio.o CC block/null.o CC block/mirror.o CC block/commit.o CC block/io.o CC block/create.o CC block/throttle-groups.o CC block/nvme.o CC block/nbd.o CC block/nbd-client.o CC block/sheepdog.o CC block/accounting.o CC block/dirty-bitmap.o CC block/write-threshold.o CC block/backup.o CC block/replication.o CC block/throttle.o CC block/copy-on-read.o CC block/crypto.o CC nbd/server.o CC nbd/client.o CC nbd/common.o CC scsi/utils.o CC scsi/pr-manager.o CC scsi/pr-manager-helper.o CC block/dmg-bz2.o CC crypto/init.o CC crypto/hash.o CC crypto/hash-nettle.o CC crypto/hmac.o CC crypto/hmac-nettle.o CC crypto/aes.o CC crypto/desrfb.o CC crypto/cipher.o CC crypto/tlscreds.o CC crypto/tlscredsanon.o CC crypto/tlscredspsk.o CC crypto/tlscredsx509.o CC crypto/tlssession.o CC crypto/secret.o CC crypto/random-platform.o CC crypto/pbkdf.o CC crypto/pbkdf-nettle.o CC crypto/ivgen.o CC crypto/ivgen-essiv.o CC crypto/ivgen-plain.o CC crypto/ivgen-plain64.o CC crypto/afsplit.o CC crypto/xts.o CC crypto/block.o CC crypto/block-qcow.o CC crypto/block-luks.o CC io/channel.o CC io/channel-buffer.o CC io/channel-command.o CC io/channel-file.o CC io/channel-socket.o CC io/channel-tls.o CC io/channel-watch.o CC io/channel-websock.o CC io/channel-util.o CC io/dns-resolver.o CC io/net-listener.o CC io/task.o CC qom/object.o CC qom/container.o CC qom/qom-qobject.o CC qom/object_interfaces.o GEN qemu-img-cmds.h CC qemu-io.o CC qemu-edid.o CC hw/display/edid-generate.o CC scsi/qemu-pr-helper.o CC qemu-bridge-helper.o CC blockdev.o CC blockdev-nbd.o CC bootdevice.o CC iothread.o CC job-qmp.o CC qdev-monitor.o CC device-hotplug.o CC os-posix.o CC bt-host.o CC bt-vhci.o CC dma-helpers.o CC vl.o CC tpm.o CC device_tree.o CC qapi/qapi-commands.o CC qapi/qapi-commands-block-core.o CC qapi/qapi-commands-block.o CC qapi/qapi-commands-char.o CC qapi/qapi-commands-common.o CC qapi/qapi-commands-crypto.o CC qapi/qapi-commands-introspect.o CC qapi/qapi-commands-job.o CC qapi/qapi-commands-migration.o CC qapi/qapi-commands-net.o CC qapi/qapi-commands-misc.o CC qapi/qapi-commands-rocker.o CC qapi/qapi-commands-run-state.o CC qapi/qapi-commands-sockets.o CC qapi/qapi-commands-tpm.o CC qapi/qapi-commands-trace.o CC qapi/qapi-commands-transaction.o CC qapi/qapi-commands-ui.o CC qmp.o CC hmp.o CC cpus-common.o CC audio/audio.o CC audio/noaudio.o CC audio/wavaudio.o CC audio/mixeng.o CC audio/spiceaudio.o CC audio/wavcapture.o CC backends/rng.o CC backends/rng-egd.o CC backends/rng-random.o CC backends/tpm.o CC backends/hostmem.o CC backends/hostmem-ram.o CC backends/hostmem-file.o CC backends/cryptodev.o CC backends/cryptodev-builtin.o CC backends/cryptodev-vhost.o CC backends/cryptodev-vhost-user.o CC backends/hostmem-memfd.o CC block/stream.o CC chardev/msmouse.o CC chardev/wctablet.o CC chardev/testdev.o CC chardev/spice.o CC disas/arm.o CC disas/i386.o CC fsdev/qemu-fsdev-dummy.o CC fsdev/qemu-fsdev-opts.o CC fsdev/qemu-fsdev-throttle.o CC hw/acpi/core.o CC hw/acpi/piix4.o CC hw/acpi/pcihp.o CC hw/acpi/ich9.o CC hw/acpi/tco.o CC hw/acpi/cpu_hotplug.o CC hw/acpi/memory_hotplug.o CC hw/acpi/cpu.o CC hw/acpi/nvdimm.o CC hw/acpi/vmgenid.o CC hw/acpi/acpi_interface.o CC hw/acpi/bios-linker-loader.o CC hw/acpi/aml-build.o CC hw/acpi/ipmi.o CC hw/acpi/acpi-stub.o CC hw/acpi/ipmi-stub.o CC hw/audio/sb16.o CC hw/audio/es1370.o CC hw/audio/ac97.o CC hw/audio/fmopl.o CC hw/audio/adlib.o CC hw/audio/gus.o CC hw/audio/gusemu_hal.o CC hw/audio/gusemu_mixer.o CC hw/audio/cs4231a.o CC hw/audio/intel-hda.o CC hw/audio/hda-codec.o CC hw/audio/pcspk.o CC hw/audio/wm8750.o CC hw/audio/pl041.o CC hw/audio/lm4549.o CC hw/audio/marvell_88w8618.o CC hw/audio/soundhw.o CC hw/block/block.o CC hw/block/cdrom.o CC hw/block/hd-geometry.o CC hw/block/fdc.o CC hw/block/m25p80.o CC hw/block/nand.o CC hw/block/pflash_cfi01.o CC hw/block/pflash_cfi02.o CC hw/block/xen_disk.o CC hw/block/ecc.o CC hw/block/onenand.o CC hw/block/nvme.o CC hw/bt/core.o CC hw/bt/l2cap.o CC hw/bt/sdp.o CC hw/bt/hci.o CC hw/bt/hid.o CC hw/bt/hci-csr.o CC hw/char/ipoctal232.o CC hw/char/parallel.o CC hw/char/parallel-isa.o CC hw/char/pl011.o CC hw/char/serial.o CC hw/char/serial-isa.o CC hw/char/serial-pci.o CC hw/char/virtio-console.o CC hw/char/xen_console.o CC hw/char/cadence_uart.o CC hw/char/cmsdk-apb-uart.o CC hw/char/debugcon.o CC hw/char/imx_serial.o CC hw/core/qdev.o CC hw/core/qdev-properties.o CC hw/core/bus.o CC hw/core/reset.o CC hw/core/qdev-fw.o CC hw/core/fw-path-provider.o CC hw/core/irq.o CC hw/core/hotplug.o CC hw/core/nmi.o CC hw/core/stream.o CC hw/core/ptimer.o CC hw/core/sysbus.o CC hw/core/machine.o CC hw/core/loader.o CC hw/core/qdev-properties-system.o CC hw/core/register.o CC hw/core/or-irq.o CC hw/core/split-irq.o CC hw/core/platform-bus.o CC hw/core/generic-loader.o CC hw/core/null-machine.o CC hw/cpu/core.o CC hw/display/ramfb.o CC hw/display/ramfb-standalone.o CC hw/display/ads7846.o CC hw/display/cirrus_vga.o CC hw/display/cirrus_vga_isa.o CC hw/display/pl110.o CC hw/display/sii9022.o CC hw/display/ssd0303.o CC hw/display/ssd0323.o CC hw/display/xenfb.o CC hw/display/vga-pci.o CC hw/display/edid-region.o CC hw/display/vga-isa.o CC hw/display/vmware_vga.o CC hw/display/bochs-display.o CC hw/display/blizzard.o CC hw/display/exynos4210_fimd.o CC hw/display/framebuffer.o CC hw/display/tc6393xb.o CC hw/display/qxl.o CC hw/display/qxl-logger.o CC hw/display/qxl-render.o CC hw/dma/pl080.o CC hw/dma/pl330.o CC hw/dma/i8257.o CC hw/dma/xilinx_axidma.o CC hw/dma/xlnx-zynq-devcfg.o CC hw/dma/xlnx-zdma.o CC hw/gpio/max7310.o CC hw/gpio/pl061.o CC hw/gpio/zaurus.o CC hw/gpio/gpio_key.o CC hw/i2c/core.o CC hw/i2c/smbus.o CC hw/i2c/smbus_eeprom.o CC hw/i2c/versatile_i2c.o CC hw/i2c/i2c-ddc.o CC hw/i2c/smbus_ich9.o CC hw/i2c/pm_smbus.o CC hw/i2c/bitbang_i2c.o CC hw/i2c/exynos4210_i2c.o CC hw/i2c/imx_i2c.o CC hw/i2c/aspeed_i2c.o CC hw/ide/core.o CC hw/ide/atapi.o CC hw/ide/qdev.o CC hw/ide/pci.o CC hw/ide/isa.o CC hw/ide/piix.o CC hw/ide/microdrive.o CC hw/ide/ahci.o CC hw/ide/ich.o CC hw/ide/ahci-allwinner.o CC hw/input/hid.o CC hw/input/lm832x.o CC hw/input/pckbd.o CC hw/input/pl050.o CC hw/input/ps2.o CC hw/input/stellaris_input.o CC hw/input/tsc2005.o CC hw/input/virtio-input.o CC hw/input/virtio-input-hid.o CC hw/input/virtio-input-host.o CC hw/intc/i8259_common.o CC hw/intc/i8259.o CC hw/intc/pl190.o CC hw/intc/xlnx-pmu-iomod-intc.o CC hw/intc/xlnx-zynqmp-ipi.o CC hw/intc/imx_avic.o CC hw/intc/imx_gpcv2.o CC hw/intc/realview_gic.o CC hw/intc/ioapic_common.o CC hw/intc/arm_gic_common.o CC hw/intc/arm_gic.o CC hw/intc/arm_gicv2m.o CC hw/intc/arm_gicv3_common.o CC hw/intc/arm_gicv3.o CC hw/intc/arm_gicv3_dist.o CC hw/intc/arm_gicv3_redist.o CC hw/intc/arm_gicv3_its_common.o CC hw/intc/intc.o CC hw/ipack/ipack.o CC hw/ipack/tpci200.o CC hw/ipmi/ipmi.o CC hw/ipmi/ipmi_bmc_sim.o CC hw/ipmi/ipmi_bmc_extern.o CC hw/ipmi/isa_ipmi_kcs.o CC hw/ipmi/isa_ipmi_bt.o CC hw/isa/isa-bus.o CC hw/isa/isa-superio.o CC hw/isa/apm.o CC hw/mem/pc-dimm.o CC hw/mem/memory-device.o CC hw/mem/nvdimm.o CC hw/misc/applesmc.o CC hw/misc/max111x.o CC hw/misc/tmp105.o CC hw/misc/tmp421.o CC hw/misc/debugexit.o CC hw/misc/sga.o CC hw/misc/pc-testdev.o CC hw/misc/pci-testdev.o CC hw/misc/edu.o CC hw/misc/pca9552.o CC hw/misc/unimp.o CC hw/misc/vmcoreinfo.o CC hw/misc/arm_l2x0.o CC hw/misc/arm_integrator_debug.o CC hw/misc/a9scu.o CC hw/net/xen_nic.o CC hw/misc/arm11scu.o CC hw/net/ne2000.o CC hw/net/eepro100.o CC hw/net/pcnet-pci.o CC hw/net/pcnet.o CC hw/net/e1000.o CC hw/net/e1000x_common.o CC hw/net/net_tx_pkt.o CC hw/net/net_rx_pkt.o CC hw/net/e1000e.o CC hw/net/e1000e_core.o CC hw/net/rtl8139.o CC hw/net/vmxnet3.o CC hw/net/smc91c111.o CC hw/net/lan9118.o CC hw/net/ne2000-isa.o CC hw/net/xgmac.o CC hw/net/xilinx_axienet.o CC hw/net/allwinner_emac.o CC hw/net/imx_fec.o CC hw/net/cadence_gem.o CC hw/net/stellaris_enet.o CC hw/net/ftgmac100.o CC hw/net/rocker/rocker.o CC hw/net/rocker/rocker_fp.o CC hw/net/rocker/rocker_desc.o CC hw/net/rocker/rocker_world.o CC hw/net/rocker/rocker_of_dpa.o CC hw/net/can/can_sja1000.o CC hw/net/can/can_kvaser_pci.o CC hw/net/can/can_pcm3680_pci.o CC hw/net/can/can_mioe3680_pci.o CC hw/nvram/eeprom93xx.o CC hw/nvram/fw_cfg.o CC hw/nvram/chrp_nvram.o CC hw/pci-bridge/pci_bridge_dev.o CC hw/pci-bridge/pcie_root_port.o CC hw/pci-bridge/gen_pcie_root_port.o CC hw/pci-bridge/pcie_pci_bridge.o CC hw/pci-bridge/pci_expander_bridge.o CC hw/pci-bridge/xio3130_upstream.o CC hw/pci-bridge/xio3130_downstream.o CC hw/pci-bridge/ioh3420.o CC hw/pci-bridge/i82801b11.o CC hw/pci-host/pam.o CC hw/pci-host/versatile.o CC hw/pci-host/piix.o CC hw/pci-host/q35.o CC hw/pci-host/gpex.o CC hw/pci-host/designware.o CC hw/pci/pci.o CC hw/pci/pci_bridge.o CC hw/pci/msix.o CC hw/pci/msi.o CC hw/pci/shpc.o CC hw/pci/slotid_cap.o CC hw/pci/pci_host.o CC hw/pci/pcie_host.o CC hw/pci/pcie.o CC hw/pci/pcie_aer.o CC hw/pci/pcie_port.o CC hw/pci/pci-stub.o CC hw/pcmcia/pcmcia.o CC hw/scsi/scsi-disk.o CC hw/scsi/scsi-generic.o CC hw/scsi/scsi-bus.o CC hw/scsi/lsi53c895a.o CC hw/scsi/mptsas.o CC hw/scsi/mptconfig.o CC hw/scsi/mptendian.o CC hw/scsi/megasas.o CC hw/scsi/vmw_pvscsi.o CC hw/scsi/esp.o CC hw/scsi/esp-pci.o CC hw/sd/pl181.o CC hw/sd/ssi-sd.o CC hw/sd/sd.o CC hw/sd/core.o CC hw/sd/sdmmc-internal.o CC hw/sd/sdhci.o CC hw/smbios/smbios.o CC hw/smbios/smbios_type_38.o CC hw/smbios/smbios-stub.o CC hw/smbios/smbios_type_38-stub.o CC hw/ssi/pl022.o CC hw/ssi/ssi.o CC hw/ssi/xilinx_spips.o CC hw/ssi/aspeed_smc.o CC hw/ssi/stm32f2xx_spi.o CC hw/ssi/mss-spi.o CC hw/timer/arm_timer.o CC hw/timer/arm_mptimer.o CC hw/timer/armv7m_systick.o CC hw/timer/a9gtimer.o CC hw/timer/cadence_ttc.o CC hw/timer/ds1338.o CC hw/timer/hpet.o CC hw/timer/i8254_common.o CC hw/timer/i8254.o CC hw/timer/pl031.o CC hw/timer/twl92230.o CC hw/timer/imx_epit.o CC hw/timer/imx_gpt.o CC hw/timer/xlnx-zynqmp-rtc.o CC hw/timer/stm32f2xx_timer.o CC hw/timer/aspeed_timer.o CC hw/timer/cmsdk-apb-timer.o CC hw/timer/cmsdk-apb-dualtimer.o CC hw/timer/mss-timer.o CC hw/tpm/tpm_util.o CC hw/tpm/tpm_tis.o CC hw/tpm/tpm_crb.o CC hw/tpm/tpm_passthrough.o CC hw/tpm/tpm_emulator.o CC hw/usb/core.o CC hw/usb/combined-packet.o CC hw/usb/bus.o CC hw/usb/libhw.o CC hw/usb/desc.o CC hw/usb/desc-msos.o CC hw/usb/hcd-uhci.o CC hw/usb/hcd-ohci.o CC hw/usb/hcd-ehci.o CC hw/usb/hcd-ehci-pci.o CC hw/usb/hcd-ehci-sysbus.o CC hw/usb/hcd-xhci.o CC hw/usb/hcd-xhci-nec.o CC hw/usb/hcd-musb.o CC hw/usb/dev-hub.o CC hw/usb/dev-hid.o CC hw/usb/dev-wacom.o CC hw/usb/dev-storage.o CC hw/usb/dev-uas.o CC hw/usb/dev-audio.o CC hw/usb/dev-serial.o CC hw/usb/dev-network.o CC hw/usb/dev-bluetooth.o CC hw/usb/dev-smartcard-reader.o CC hw/usb/ccid-card-passthru.o CC hw/usb/ccid-card-emulated.o CC hw/usb/dev-mtp.o CC hw/usb/host-stub.o CC hw/virtio/virtio-bus.o CC hw/virtio/virtio-rng.o /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c: In function 'emulated_realize': /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c:549:9: error: implicit declaration of function 'error_report' [-Werror=implicit-function-declaration] error_report("failed to create event_thread"); ^ /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c:549:9: error: nested extern declaration of 'error_report' [-Werror=nested-externs] cc1: all warnings being treated as errors make: *** [hw/usb/ccid-card-emulated.o] Error 1 make: *** Waiting for unfinished jobs.... Traceback (most recent call last): File "./tests/docker/docker.py", line 563, in <module> sys.exit(main()) File "./tests/docker/docker.py", line 560, in main return args.cmdobj.run(args, argv) File "./tests/docker/docker.py", line 306, in run return Docker().run(argv, args.keep, quiet=args.quiet) File "./tests/docker/docker.py", line 274, in run quiet=quiet) File "./tests/docker/docker.py", line 181, in _do_check return subprocess.check_call(self._command + cmd, **kwargs) File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=53298fa0df9311e8a18952540069c830', '-u', '1000', '--security-opt', 'seccomp=unconfined', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2 make[1]: *** [tests/docker/Makefile.include:217: docker-run] Error 1 make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-6f6bzbwa/src' make: *** [tests/docker/Makefile.include:251: docker-run-test-quick@centos7] Error 2 real 2m27.767s user 0m5.117s sys 0m3.918s === OUTPUT END === Test command exited with code: 2 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@redhat.com ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check 2018-11-03 18:09 ` [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check no-reply @ 2018-11-05 4:57 ` Fei Li 0 siblings, 0 replies; 32+ messages in thread From: Fei Li @ 2018-11-05 4:57 UTC (permalink / raw) To: qemu-devel, no-reply; +Cc: famz, quintela, armbru, peterx, dgilbert Sorry that somehow forget the "#include "qemu/error-report.h" for hw/usb/ccid-card-emulated.c Have a nice day, thanks Fei On 11/04/2018 02:09 AM, no-reply@patchew.org wrote: > Hi, > > This series failed docker-quick@centos7 build test. Please find the testing commands and > their output below. If you have Docker installed, you can probably reproduce it > locally. > > Type: series > Message-id: 20181101101715.9443-1-fli@suse.com > Subject: [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check > > === TEST SCRIPT BEGIN === > #!/bin/bash > time make docker-test-quick@centos7 SHOW_ENV=1 J=8 > === TEST SCRIPT END === > > Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 > Switched to a new branch 'test' > 8239f692a6 qemu_thread_create: propagate the error to callers to handle > f73c91c32a migration: add more error handling for postcopy_ram_enable_notify > 6b8c9d0a7b migration: remove unused &local_err parameter in migrate_set_error > adcb648e2e migration: fix the multifd code when receiving less channels > ce89d9baf9 migration: fix the multifd code when sending less channels > a06e512206 migration: fix some segmentation faults when using multifd > 7f516dc786 qemu_thread_join: fix segmentation fault > a6f6f24ff3 qemu_init_vcpu: add a new Error parameter to propagate > b44013aa26 Fix segmentation fault when qemu_signal_init fails > > === OUTPUT BEGIN === > BUILD centos7 > make[1]: Entering directory '/var/tmp/patchew-tester-tmp-6f6bzbwa/src' > GEN /var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar > Cloning into '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar.vroot'... > done. > Your branch is up-to-date with 'origin/test'. > Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc' > Cloning into '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar.vroot/dtc'... > Submodule path 'dtc': checked out '88f18909db731a627456f26d779445f84e449536' > Submodule 'ui/keycodemapdb' (git://git.qemu.org/keycodemapdb.git) registered for path 'ui/keycodemapdb' > Cloning into '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130/qemu.tar.vroot/ui/keycodemapdb'... > Submodule path 'ui/keycodemapdb': checked out '6b3d716e2b6472eb7189d3220552280ef3d832ce' > COPY RUNNER > RUN test-quick in qemu:centos7 > Packages installed: > SDL-devel-1.2.15-14.el7.x86_64 > bison-3.0.4-1.el7.x86_64 > bzip2-1.0.6-13.el7.x86_64 > bzip2-devel-1.0.6-13.el7.x86_64 > ccache-3.3.4-1.el7.x86_64 > csnappy-devel-0-6.20150729gitd7bc683.el7.x86_64 > flex-2.5.37-3.el7.x86_64 > gcc-4.8.5-28.el7_5.1.x86_64 > gettext-0.19.8.1-2.el7.x86_64 > git-1.8.3.1-14.el7_5.x86_64 > glib2-devel-2.54.2-2.el7.x86_64 > libaio-devel-0.3.109-13.el7.x86_64 > libepoxy-devel-1.3.1-2.el7_5.x86_64 > libfdt-devel-1.4.6-1.el7.x86_64 > lzo-devel-2.06-8.el7.x86_64 > make-3.82-23.el7.x86_64 > mesa-libEGL-devel-17.2.3-8.20171019.el7.x86_64 > mesa-libgbm-devel-17.2.3-8.20171019.el7.x86_64 > nettle-devel-2.7.1-8.el7.x86_64 > package g++ is not installed > package librdmacm-devel is not installed > pixman-devel-0.34.0-1.el7.x86_64 > spice-glib-devel-0.34-3.el7_5.1.x86_64 > spice-server-devel-0.14.0-2.el7_5.4.x86_64 > tar-1.26-34.el7.x86_64 > vte-devel-0.28.2-10.el7.x86_64 > xen-devel-4.6.6-12.el7.x86_64 > zlib-devel-1.2.7-17.el7.x86_64 > > Environment variables: > PACKAGES=bison bzip2 bzip2-devel ccache csnappy-devel flex g++ gcc gettext git glib2-devel libaio-devel libepoxy-devel libfdt-devel librdmacm-devel lzo-devel make mesa-libEGL-devel mesa-libgbm-devel nettle-devel pixman-devel SDL-devel spice-glib-devel spice-server-devel tar vte-devel xen-devel zlib-devel > HOSTNAME=ec6a074d2e2d > MAKEFLAGS= -j8 > J=8 > CCACHE_DIR=/var/tmp/ccache > EXTRA_CONFIGURE_OPTS= > V= > SHOW_ENV=1 > PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin > PWD=/ > TARGET_LIST= > SHLVL=1 > HOME=/home/patchew > TEST_DIR=/tmp/qemu-test > FEATURES= dtc > DEBUG= > _=/usr/bin/env > > Configure options: > --enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/tmp/qemu-test/install > No C++ compiler available; disabling C++ specific optional code > Install prefix /tmp/qemu-test/install > BIOS directory /tmp/qemu-test/install/share/qemu > firmware path /tmp/qemu-test/install/share/qemu-firmware > binary directory /tmp/qemu-test/install/bin > library directory /tmp/qemu-test/install/lib > module directory /tmp/qemu-test/install/lib/qemu > libexec directory /tmp/qemu-test/install/libexec > include directory /tmp/qemu-test/install/include > config directory /tmp/qemu-test/install/etc > local state directory /tmp/qemu-test/install/var > Manual directory /tmp/qemu-test/install/share/man > ELF interp prefix /usr/gnemul/qemu-%M > Source path /tmp/qemu-test/src > GIT binary git > GIT submodules > C compiler cc > Host C compiler cc > C++ compiler > Objective-C compiler cc > ARFLAGS rv > CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g > QEMU_CFLAGS -I/usr/include/pixman-1 -Werror -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -Wno-missing-braces -I/usr/include/libpng15 -pthread -I/usr/include/spice-server -I/usr/include/cacard -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/spice-1 > LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g > QEMU_LDFLAGS > make make > install install > python python -B > smbd /usr/sbin/smbd > module support no > host CPU x86_64 > host big endian no > target list x86_64-softmmu aarch64-softmmu > gprof enabled no > sparse enabled no > strip binaries yes > profiler no > static build no > SDL support yes (1.2.15) > GTK support no > GTK GL support no > VTE support no > TLS priority NORMAL > GNUTLS support no > libgcrypt no > nettle yes (2.7.1) > libtasn1 no > curses support yes > virgl support no > curl support no > mingw32 support no > Audio drivers oss > Block whitelist (rw) > Block whitelist (ro) > VirtFS support no > Multipath support no > VNC support yes > VNC SASL support no > VNC JPEG support no > VNC PNG support yes > xen support yes > xen ctrl version 40600 > pv dom build no > brlapi support no > bluez support no > Documentation no > PIE yes > vde support no > netmap support no > Linux AIO support yes > ATTR/XATTR support yes > Install blobs yes > KVM support yes > HAX support no > HVF support no > WHPX support no > TCG support yes > TCG debug enabled no > TCG interpreter no > malloc trim support yes > RDMA support yes > PVRDMA support yes > fdt support system > membarrier no > preadv support yes > fdatasync yes > madvise yes > posix_madvise yes > posix_memalign yes > libcap-ng support no > vhost-net support yes > vhost-crypto support yes > vhost-scsi support yes > vhost-vsock support yes > vhost-user support yes > Trace backends log > spice support yes (0.12.13/0.14.0) > rbd support no > xfsctl support no > smartcard support yes > libusb no > usb net redir no > OpenGL support yes > OpenGL dmabufs yes > libiscsi support no > libnfs support no > build guest agent yes > QGA VSS support no > QGA w32 disk info no > QGA MSI support no > seccomp support no > coroutine backend ucontext > coroutine pool yes > debug stack usage no > mutex debugging no > crypto afalg no > GlusterFS support no > gcov gcov > gcov enabled no > TPM support yes > libssh2 support no > TPM passthrough yes > TPM emulator yes > QOM debugging yes > Live block migration yes > lzo support yes > snappy support no > bzip2 support yes > NUMA host support no > libxml2 no > tcmalloc support no > jemalloc support no > avx2 optimization yes > replication support yes > VxHS block device no > capstone no > docker no > libpmem support no > libudev no > > WARNING: Use of SDL 1.2 is deprecated and will be removed in > WARNING: future releases. Please switch to using SDL 2.0 > > NOTE: cross-compilers enabled: 'cc' > GEN x86_64-softmmu/config-devices.mak.tmp > GEN aarch64-softmmu/config-devices.mak.tmp > GEN config-host.h > GEN qemu-options.def > GEN qapi-gen > GEN trace/generated-tcg-tracers.h > GEN trace/generated-helpers-wrappers.h > GEN trace/generated-helpers.h > GEN trace/generated-helpers.c > GEN module_block.h > GEN x86_64-softmmu/config-devices.mak > GEN aarch64-softmmu/config-devices.mak > GEN ui/input-keymap-atset1-to-qcode.c > GEN ui/input-keymap-linux-to-qcode.c > GEN ui/input-keymap-qcode-to-atset1.c > GEN ui/input-keymap-qcode-to-atset2.c > GEN ui/input-keymap-qcode-to-atset3.c > GEN ui/input-keymap-qcode-to-linux.c > GEN ui/input-keymap-qcode-to-qnum.c > GEN ui/input-keymap-qcode-to-sun.c > GEN ui/input-keymap-qnum-to-qcode.c > GEN ui/input-keymap-usb-to-qcode.c > GEN ui/input-keymap-win32-to-qcode.c > GEN ui/input-keymap-x11-to-qcode.c > GEN ui/input-keymap-xorgevdev-to-qcode.c > GEN ui/input-keymap-xorgkbd-to-qcode.c > GEN ui/input-keymap-xorgxquartz-to-qcode.c > GEN ui/input-keymap-xorgxwin-to-qcode.c > GEN ui/input-keymap-osx-to-qcode.c > GEN tests/test-qapi-gen > GEN trace-root.h > GEN accel/kvm/trace.h > GEN accel/tcg/trace.h > GEN audio/trace.h > GEN block/trace.h > GEN chardev/trace.h > GEN crypto/trace.h > GEN hw/9pfs/trace.h > GEN hw/acpi/trace.h > GEN hw/alpha/trace.h > GEN hw/arm/trace.h > GEN hw/audio/trace.h > GEN hw/block/trace.h > GEN hw/block/dataplane/trace.h > GEN hw/char/trace.h > GEN hw/display/trace.h > GEN hw/dma/trace.h > GEN hw/hppa/trace.h > GEN hw/i2c/trace.h > GEN hw/i386/trace.h > GEN hw/i386/xen/trace.h > GEN hw/ide/trace.h > GEN hw/input/trace.h > GEN hw/intc/trace.h > GEN hw/isa/trace.h > GEN hw/mem/trace.h > GEN hw/misc/trace.h > GEN hw/misc/macio/trace.h > GEN hw/net/trace.h > GEN hw/nvram/trace.h > GEN hw/pci/trace.h > GEN hw/pci-host/trace.h > GEN hw/ppc/trace.h > GEN hw/rdma/trace.h > GEN hw/rdma/vmw/trace.h > GEN hw/s390x/trace.h > GEN hw/scsi/trace.h > GEN hw/sd/trace.h > GEN hw/sparc/trace.h > GEN hw/sparc64/trace.h > GEN hw/timer/trace.h > GEN hw/tpm/trace.h > GEN hw/usb/trace.h > GEN hw/vfio/trace.h > GEN hw/virtio/trace.h > GEN hw/watchdog/trace.h > GEN hw/xen/trace.h > GEN io/trace.h > GEN linux-user/trace.h > GEN migration/trace.h > GEN nbd/trace.h > GEN net/trace.h > GEN qapi/trace.h > GEN qom/trace.h > GEN scsi/trace.h > GEN target/arm/trace.h > GEN target/i386/trace.h > GEN target/mips/trace.h > GEN target/ppc/trace.h > GEN target/s390x/trace.h > GEN target/sparc/trace.h > GEN ui/trace.h > GEN util/trace.h > GEN trace-root.c > GEN accel/kvm/trace.c > GEN accel/tcg/trace.c > GEN audio/trace.c > GEN block/trace.c > GEN chardev/trace.c > GEN crypto/trace.c > GEN hw/9pfs/trace.c > GEN hw/acpi/trace.c > GEN hw/alpha/trace.c > GEN hw/arm/trace.c > GEN hw/audio/trace.c > GEN hw/block/trace.c > GEN hw/block/dataplane/trace.c > GEN hw/char/trace.c > GEN hw/display/trace.c > GEN hw/dma/trace.c > GEN hw/hppa/trace.c > GEN hw/i2c/trace.c > GEN hw/i386/trace.c > GEN hw/i386/xen/trace.c > GEN hw/ide/trace.c > GEN hw/input/trace.c > GEN hw/intc/trace.c > GEN hw/isa/trace.c > GEN hw/mem/trace.c > GEN hw/misc/trace.c > GEN hw/misc/macio/trace.c > GEN hw/net/trace.c > GEN hw/nvram/trace.c > GEN hw/pci/trace.c > GEN hw/pci-host/trace.c > GEN hw/ppc/trace.c > GEN hw/rdma/trace.c > GEN hw/rdma/vmw/trace.c > GEN hw/s390x/trace.c > GEN hw/scsi/trace.c > GEN hw/sd/trace.c > GEN hw/sparc/trace.c > GEN hw/sparc64/trace.c > GEN hw/timer/trace.c > GEN hw/tpm/trace.c > GEN hw/usb/trace.c > GEN hw/vfio/trace.c > GEN hw/virtio/trace.c > GEN hw/watchdog/trace.c > GEN hw/xen/trace.c > GEN io/trace.c > GEN linux-user/trace.c > GEN migration/trace.c > GEN nbd/trace.c > GEN net/trace.c > GEN qapi/trace.c > GEN qom/trace.c > GEN scsi/trace.c > GEN target/arm/trace.c > GEN target/i386/trace.c > GEN target/mips/trace.c > GEN target/ppc/trace.c > GEN target/s390x/trace.c > GEN target/sparc/trace.c > GEN ui/trace.c > GEN util/trace.c > GEN config-all-devices.mak > CC tests/qemu-iotests/socket_scm_helper.o > GEN qga/qapi-generated/qapi-gen > CC qapi/qapi-builtin-types.o > CC qapi/qapi-types.o > CC qapi/qapi-types-block-core.o > CC qapi/qapi-types-block.o > CC qapi/qapi-types-char.o > CC qapi/qapi-types-common.o > CC qapi/qapi-types-crypto.o > CC qapi/qapi-types-introspect.o > CC qapi/qapi-types-job.o > CC qapi/qapi-types-migration.o > CC qapi/qapi-types-misc.o > CC qapi/qapi-types-net.o > CC qapi/qapi-types-rocker.o > CC qapi/qapi-types-run-state.o > CC qapi/qapi-types-sockets.o > CC qapi/qapi-types-tpm.o > CC qapi/qapi-types-trace.o > CC qapi/qapi-types-transaction.o > CC qapi/qapi-types-ui.o > CC qapi/qapi-builtin-visit.o > CC qapi/qapi-visit.o > CC qapi/qapi-visit-block-core.o > CC qapi/qapi-visit-block.o > CC qapi/qapi-visit-char.o > CC qapi/qapi-visit-common.o > CC qapi/qapi-visit-crypto.o > CC qapi/qapi-visit-introspect.o > CC qapi/qapi-visit-job.o > CC qapi/qapi-visit-migration.o > CC qapi/qapi-visit-misc.o > CC qapi/qapi-visit-net.o > CC qapi/qapi-visit-rocker.o > CC qapi/qapi-visit-run-state.o > CC qapi/qapi-visit-sockets.o > CC qapi/qapi-visit-tpm.o > CC qapi/qapi-visit-trace.o > CC qapi/qapi-visit-transaction.o > CC qapi/qapi-visit-ui.o > CC qapi/qapi-events.o > CC qapi/qapi-events-block-core.o > CC qapi/qapi-events-block.o > CC qapi/qapi-events-char.o > CC qapi/qapi-events-common.o > CC qapi/qapi-events-crypto.o > CC qapi/qapi-events-introspect.o > CC qapi/qapi-events-job.o > CC qapi/qapi-events-migration.o > CC qapi/qapi-events-misc.o > CC qapi/qapi-events-net.o > CC qapi/qapi-events-rocker.o > CC qapi/qapi-events-run-state.o > CC qapi/qapi-events-sockets.o > CC qapi/qapi-events-tpm.o > CC qapi/qapi-events-trace.o > CC qapi/qapi-events-transaction.o > CC qapi/qapi-events-ui.o > CC qapi/qapi-introspect.o > CC qapi/qapi-dealloc-visitor.o > CC qapi/qapi-visit-core.o > CC qapi/qobject-input-visitor.o > CC qapi/qobject-output-visitor.o > CC qapi/qmp-registry.o > CC qapi/qmp-dispatch.o > CC qapi/string-input-visitor.o > CC qapi/string-output-visitor.o > CC qapi/opts-visitor.o > CC qapi/qapi-clone-visitor.o > CC qapi/qmp-event.o > CC qapi/qapi-util.o > CC qobject/qnull.o > CC qobject/qnum.o > CC qobject/qstring.o > CC qobject/qdict.o > CC qobject/qlist.o > CC qobject/qbool.o > CC qobject/qlit.o > CC qobject/qjson.o > CC qobject/qobject.o > CC qobject/json-lexer.o > CC qobject/json-streamer.o > CC qobject/json-parser.o > CC qobject/block-qdict.o > CC trace/control.o > CC trace/qmp.o > CC util/osdep.o > CC util/cutils.o > CC util/unicode.o > CC util/qemu-timer-common.o > CC util/bufferiszero.o > CC util/lockcnt.o > CC util/aiocb.o > CC util/async.o > CC util/aio-wait.o > CC util/thread-pool.o > CC util/qemu-timer.o > CC util/main-loop.o > CC util/iohandler.o > CC util/aio-posix.o > CC util/compatfd.o > CC util/event_notifier-posix.o > CC util/mmap-alloc.o > CC util/oslib-posix.o > CC util/qemu-openpty.o > CC util/qemu-thread-posix.o > CC util/memfd.o > CC util/envlist.o > CC util/path.o > CC util/module.o > CC util/host-utils.o > CC util/bitmap.o > CC util/bitops.o > CC util/hbitmap.o > CC util/fifo8.o > CC util/acl.o > CC util/cacheinfo.o > CC util/error.o > CC util/qemu-error.o > CC util/id.o > CC util/iov.o > CC util/qemu-config.o > CC util/qemu-sockets.o > CC util/uri.o > CC util/notify.o > CC util/qemu-option.o > CC util/qemu-progress.o > CC util/keyval.o > CC util/hexdump.o > CC util/crc32c.o > CC util/uuid.o > CC util/throttle.o > CC util/getauxval.o > CC util/readline.o > CC util/rcu.o > CC util/qemu-coroutine.o > CC util/qemu-coroutine-lock.o > CC util/qemu-coroutine-io.o > CC util/qemu-coroutine-sleep.o > CC util/coroutine-ucontext.o > CC util/buffer.o > CC util/timed-average.o > CC util/base64.o > CC util/log.o > CC util/pagesize.o > CC util/qdist.o > CC util/qht.o > CC util/qsp.o > CC util/range.o > CC util/stats64.o > CC util/systemd.o > CC util/iova-tree.o > CC util/vfio-helpers.o > CC util/drm.o > CC trace-root.o > CC accel/kvm/trace.o > CC accel/tcg/trace.o > CC audio/trace.o > CC block/trace.o > CC chardev/trace.o > CC crypto/trace.o > CC hw/9pfs/trace.o > CC hw/acpi/trace.o > CC hw/alpha/trace.o > CC hw/arm/trace.o > CC hw/audio/trace.o > CC hw/block/trace.o > CC hw/block/dataplane/trace.o > CC hw/char/trace.o > CC hw/display/trace.o > CC hw/dma/trace.o > CC hw/hppa/trace.o > CC hw/i2c/trace.o > CC hw/i386/trace.o > CC hw/i386/xen/trace.o > CC hw/ide/trace.o > CC hw/input/trace.o > CC hw/intc/trace.o > CC hw/isa/trace.o > CC hw/mem/trace.o > CC hw/misc/trace.o > CC hw/misc/macio/trace.o > CC hw/net/trace.o > CC hw/nvram/trace.o > CC hw/pci/trace.o > CC hw/pci-host/trace.o > CC hw/ppc/trace.o > CC hw/rdma/trace.o > CC hw/rdma/vmw/trace.o > CC hw/s390x/trace.o > CC hw/scsi/trace.o > CC hw/sd/trace.o > CC hw/sparc/trace.o > CC hw/sparc64/trace.o > CC hw/timer/trace.o > CC hw/tpm/trace.o > CC hw/usb/trace.o > CC hw/vfio/trace.o > CC hw/virtio/trace.o > CC hw/watchdog/trace.o > CC hw/xen/trace.o > CC io/trace.o > CC linux-user/trace.o > CC migration/trace.o > CC nbd/trace.o > CC net/trace.o > CC qapi/trace.o > CC qom/trace.o > CC scsi/trace.o > CC target/arm/trace.o > CC target/i386/trace.o > CC target/mips/trace.o > CC target/ppc/trace.o > CC target/s390x/trace.o > CC target/sparc/trace.o > CC ui/trace.o > CC util/trace.o > CC crypto/pbkdf-stub.o > CC stubs/arch-query-cpu-def.o > CC stubs/arch-query-cpu-model-expansion.o > CC stubs/arch-query-cpu-model-comparison.o > CC stubs/arch-query-cpu-model-baseline.o > CC stubs/bdrv-next-monitor-owned.o > CC stubs/blk-commit-all.o > CC stubs/blockdev-close-all-bdrv-states.o > CC stubs/clock-warp.o > CC stubs/cpu-get-clock.o > CC stubs/cpu-get-icount.o > CC stubs/dump.o > CC stubs/error-printf.o > CC stubs/fdset.o > CC stubs/gdbstub.o > CC stubs/get-vm-name.o > CC stubs/iothread.o > CC stubs/iothread-lock.o > CC stubs/is-daemonized.o > CC stubs/linux-aio.o > CC stubs/machine-init-done.o > CC stubs/migr-blocker.o > CC stubs/change-state-handler.o > CC stubs/monitor.o > CC stubs/notify-event.o > CC stubs/qtest.o > CC stubs/replay.o > CC stubs/runstate-check.o > CC stubs/set-fd-handler.o > CC stubs/slirp.o > CC stubs/sysbus.o > CC stubs/tpm.o > CC stubs/trace-control.o > CC stubs/uuid.o > CC stubs/vm-stop.o > CC stubs/vmstate.o > CC stubs/qmp_memory_device.o > CC stubs/target-monitor-defs.o > CC stubs/target-get-monitor-def.o > CC stubs/pc_madt_cpu_entry.o > CC stubs/vmgenid.o > CC stubs/xen-common.o > CC stubs/xen-hvm.o > CC stubs/pci-host-piix.o > CC stubs/ram-block.o > CC stubs/ramfb.o > CC contrib/ivshmem-client/ivshmem-client.o > CC contrib/ivshmem-client/main.o > CC contrib/ivshmem-server/ivshmem-server.o > CC contrib/ivshmem-server/main.o > CC qemu-nbd.o > CC block.o > CC blockjob.o > CC job.o > CC qemu-io-cmds.o > CC replication.o > CC block/raw-format.o > CC block/qcow.o > CC block/vdi.o > CC block/vmdk.o > CC block/cloop.o > CC block/bochs.o > CC block/vpc.o > CC block/vvfat.o > CC block/dmg.o > CC block/qcow2.o > CC block/qcow2-refcount.o > CC block/qcow2-cluster.o > CC block/qcow2-snapshot.o > CC block/qcow2-cache.o > CC block/qcow2-bitmap.o > CC block/qed.o > CC block/qed-l2-cache.o > CC block/qed-table.o > CC block/qed-cluster.o > CC block/qed-check.o > CC block/vhdx.o > CC block/vhdx-endian.o > CC block/vhdx-log.o > CC block/quorum.o > CC block/parallels.o > CC block/blkdebug.o > CC block/blkverify.o > CC block/blkreplay.o > CC block/blklogwrites.o > CC block/block-backend.o > CC block/snapshot.o > CC block/qapi.o > CC block/file-posix.o > CC block/linux-aio.o > CC block/null.o > CC block/mirror.o > CC block/commit.o > CC block/io.o > CC block/create.o > CC block/throttle-groups.o > CC block/nvme.o > CC block/nbd.o > CC block/nbd-client.o > CC block/sheepdog.o > CC block/accounting.o > CC block/dirty-bitmap.o > CC block/write-threshold.o > CC block/backup.o > CC block/replication.o > CC block/throttle.o > CC block/copy-on-read.o > CC block/crypto.o > CC nbd/server.o > CC nbd/client.o > CC nbd/common.o > CC scsi/utils.o > CC scsi/pr-manager.o > CC scsi/pr-manager-helper.o > CC block/dmg-bz2.o > CC crypto/init.o > CC crypto/hash.o > CC crypto/hash-nettle.o > CC crypto/hmac.o > CC crypto/hmac-nettle.o > CC crypto/aes.o > CC crypto/desrfb.o > CC crypto/cipher.o > CC crypto/tlscreds.o > CC crypto/tlscredsanon.o > CC crypto/tlscredspsk.o > CC crypto/tlscredsx509.o > CC crypto/tlssession.o > CC crypto/secret.o > CC crypto/random-platform.o > CC crypto/pbkdf.o > CC crypto/pbkdf-nettle.o > CC crypto/ivgen.o > CC crypto/ivgen-essiv.o > CC crypto/ivgen-plain.o > CC crypto/ivgen-plain64.o > CC crypto/afsplit.o > CC crypto/xts.o > CC crypto/block.o > CC crypto/block-qcow.o > CC crypto/block-luks.o > CC io/channel.o > CC io/channel-buffer.o > CC io/channel-command.o > CC io/channel-file.o > CC io/channel-socket.o > CC io/channel-tls.o > CC io/channel-watch.o > CC io/channel-websock.o > CC io/channel-util.o > CC io/dns-resolver.o > CC io/net-listener.o > CC io/task.o > CC qom/object.o > CC qom/container.o > CC qom/qom-qobject.o > CC qom/object_interfaces.o > GEN qemu-img-cmds.h > CC qemu-io.o > CC qemu-edid.o > CC hw/display/edid-generate.o > CC scsi/qemu-pr-helper.o > CC qemu-bridge-helper.o > CC blockdev.o > CC blockdev-nbd.o > CC bootdevice.o > CC iothread.o > CC job-qmp.o > CC qdev-monitor.o > CC device-hotplug.o > CC os-posix.o > CC bt-host.o > CC bt-vhci.o > CC dma-helpers.o > CC vl.o > CC tpm.o > CC device_tree.o > CC qapi/qapi-commands.o > CC qapi/qapi-commands-block-core.o > CC qapi/qapi-commands-block.o > CC qapi/qapi-commands-char.o > CC qapi/qapi-commands-common.o > CC qapi/qapi-commands-crypto.o > CC qapi/qapi-commands-introspect.o > CC qapi/qapi-commands-job.o > CC qapi/qapi-commands-migration.o > CC qapi/qapi-commands-net.o > CC qapi/qapi-commands-misc.o > CC qapi/qapi-commands-rocker.o > CC qapi/qapi-commands-run-state.o > CC qapi/qapi-commands-sockets.o > CC qapi/qapi-commands-tpm.o > CC qapi/qapi-commands-trace.o > CC qapi/qapi-commands-transaction.o > CC qapi/qapi-commands-ui.o > CC qmp.o > CC hmp.o > CC cpus-common.o > CC audio/audio.o > CC audio/noaudio.o > CC audio/wavaudio.o > CC audio/mixeng.o > CC audio/spiceaudio.o > CC audio/wavcapture.o > CC backends/rng.o > CC backends/rng-egd.o > CC backends/rng-random.o > CC backends/tpm.o > CC backends/hostmem.o > CC backends/hostmem-ram.o > CC backends/hostmem-file.o > CC backends/cryptodev.o > CC backends/cryptodev-builtin.o > CC backends/cryptodev-vhost.o > CC backends/cryptodev-vhost-user.o > CC backends/hostmem-memfd.o > CC block/stream.o > CC chardev/msmouse.o > CC chardev/wctablet.o > CC chardev/testdev.o > CC chardev/spice.o > CC disas/arm.o > CC disas/i386.o > CC fsdev/qemu-fsdev-dummy.o > CC fsdev/qemu-fsdev-opts.o > CC fsdev/qemu-fsdev-throttle.o > CC hw/acpi/core.o > CC hw/acpi/piix4.o > CC hw/acpi/pcihp.o > CC hw/acpi/ich9.o > CC hw/acpi/tco.o > CC hw/acpi/cpu_hotplug.o > CC hw/acpi/memory_hotplug.o > CC hw/acpi/cpu.o > CC hw/acpi/nvdimm.o > CC hw/acpi/vmgenid.o > CC hw/acpi/acpi_interface.o > CC hw/acpi/bios-linker-loader.o > CC hw/acpi/aml-build.o > CC hw/acpi/ipmi.o > CC hw/acpi/acpi-stub.o > CC hw/acpi/ipmi-stub.o > CC hw/audio/sb16.o > CC hw/audio/es1370.o > CC hw/audio/ac97.o > CC hw/audio/fmopl.o > CC hw/audio/adlib.o > CC hw/audio/gus.o > CC hw/audio/gusemu_hal.o > CC hw/audio/gusemu_mixer.o > CC hw/audio/cs4231a.o > CC hw/audio/intel-hda.o > CC hw/audio/hda-codec.o > CC hw/audio/pcspk.o > CC hw/audio/wm8750.o > CC hw/audio/pl041.o > CC hw/audio/lm4549.o > CC hw/audio/marvell_88w8618.o > CC hw/audio/soundhw.o > CC hw/block/block.o > CC hw/block/cdrom.o > CC hw/block/hd-geometry.o > CC hw/block/fdc.o > CC hw/block/m25p80.o > CC hw/block/nand.o > CC hw/block/pflash_cfi01.o > CC hw/block/pflash_cfi02.o > CC hw/block/xen_disk.o > CC hw/block/ecc.o > CC hw/block/onenand.o > CC hw/block/nvme.o > CC hw/bt/core.o > CC hw/bt/l2cap.o > CC hw/bt/sdp.o > CC hw/bt/hci.o > CC hw/bt/hid.o > CC hw/bt/hci-csr.o > CC hw/char/ipoctal232.o > CC hw/char/parallel.o > CC hw/char/parallel-isa.o > CC hw/char/pl011.o > CC hw/char/serial.o > CC hw/char/serial-isa.o > CC hw/char/serial-pci.o > CC hw/char/virtio-console.o > CC hw/char/xen_console.o > CC hw/char/cadence_uart.o > CC hw/char/cmsdk-apb-uart.o > CC hw/char/debugcon.o > CC hw/char/imx_serial.o > CC hw/core/qdev.o > CC hw/core/qdev-properties.o > CC hw/core/bus.o > CC hw/core/reset.o > CC hw/core/qdev-fw.o > CC hw/core/fw-path-provider.o > CC hw/core/irq.o > CC hw/core/hotplug.o > CC hw/core/nmi.o > CC hw/core/stream.o > CC hw/core/ptimer.o > CC hw/core/sysbus.o > CC hw/core/machine.o > CC hw/core/loader.o > CC hw/core/qdev-properties-system.o > CC hw/core/register.o > CC hw/core/or-irq.o > CC hw/core/split-irq.o > CC hw/core/platform-bus.o > CC hw/core/generic-loader.o > CC hw/core/null-machine.o > CC hw/cpu/core.o > CC hw/display/ramfb.o > CC hw/display/ramfb-standalone.o > CC hw/display/ads7846.o > CC hw/display/cirrus_vga.o > CC hw/display/cirrus_vga_isa.o > CC hw/display/pl110.o > CC hw/display/sii9022.o > CC hw/display/ssd0303.o > CC hw/display/ssd0323.o > CC hw/display/xenfb.o > CC hw/display/vga-pci.o > CC hw/display/edid-region.o > CC hw/display/vga-isa.o > CC hw/display/vmware_vga.o > CC hw/display/bochs-display.o > CC hw/display/blizzard.o > CC hw/display/exynos4210_fimd.o > CC hw/display/framebuffer.o > CC hw/display/tc6393xb.o > CC hw/display/qxl.o > CC hw/display/qxl-logger.o > CC hw/display/qxl-render.o > CC hw/dma/pl080.o > CC hw/dma/pl330.o > CC hw/dma/i8257.o > CC hw/dma/xilinx_axidma.o > CC hw/dma/xlnx-zynq-devcfg.o > CC hw/dma/xlnx-zdma.o > CC hw/gpio/max7310.o > CC hw/gpio/pl061.o > CC hw/gpio/zaurus.o > CC hw/gpio/gpio_key.o > CC hw/i2c/core.o > CC hw/i2c/smbus.o > CC hw/i2c/smbus_eeprom.o > CC hw/i2c/versatile_i2c.o > CC hw/i2c/i2c-ddc.o > CC hw/i2c/smbus_ich9.o > CC hw/i2c/pm_smbus.o > CC hw/i2c/bitbang_i2c.o > CC hw/i2c/exynos4210_i2c.o > CC hw/i2c/imx_i2c.o > CC hw/i2c/aspeed_i2c.o > CC hw/ide/core.o > CC hw/ide/atapi.o > CC hw/ide/qdev.o > CC hw/ide/pci.o > CC hw/ide/isa.o > CC hw/ide/piix.o > CC hw/ide/microdrive.o > CC hw/ide/ahci.o > CC hw/ide/ich.o > CC hw/ide/ahci-allwinner.o > CC hw/input/hid.o > CC hw/input/lm832x.o > CC hw/input/pckbd.o > CC hw/input/pl050.o > CC hw/input/ps2.o > CC hw/input/stellaris_input.o > CC hw/input/tsc2005.o > CC hw/input/virtio-input.o > CC hw/input/virtio-input-hid.o > CC hw/input/virtio-input-host.o > CC hw/intc/i8259_common.o > CC hw/intc/i8259.o > CC hw/intc/pl190.o > CC hw/intc/xlnx-pmu-iomod-intc.o > CC hw/intc/xlnx-zynqmp-ipi.o > CC hw/intc/imx_avic.o > CC hw/intc/imx_gpcv2.o > CC hw/intc/realview_gic.o > CC hw/intc/ioapic_common.o > CC hw/intc/arm_gic_common.o > CC hw/intc/arm_gic.o > CC hw/intc/arm_gicv2m.o > CC hw/intc/arm_gicv3_common.o > CC hw/intc/arm_gicv3.o > CC hw/intc/arm_gicv3_dist.o > CC hw/intc/arm_gicv3_redist.o > CC hw/intc/arm_gicv3_its_common.o > CC hw/intc/intc.o > CC hw/ipack/ipack.o > CC hw/ipack/tpci200.o > CC hw/ipmi/ipmi.o > CC hw/ipmi/ipmi_bmc_sim.o > CC hw/ipmi/ipmi_bmc_extern.o > CC hw/ipmi/isa_ipmi_kcs.o > CC hw/ipmi/isa_ipmi_bt.o > CC hw/isa/isa-bus.o > CC hw/isa/isa-superio.o > CC hw/isa/apm.o > CC hw/mem/pc-dimm.o > CC hw/mem/memory-device.o > CC hw/mem/nvdimm.o > CC hw/misc/applesmc.o > CC hw/misc/max111x.o > CC hw/misc/tmp105.o > CC hw/misc/tmp421.o > CC hw/misc/debugexit.o > CC hw/misc/sga.o > CC hw/misc/pc-testdev.o > CC hw/misc/pci-testdev.o > CC hw/misc/edu.o > CC hw/misc/pca9552.o > CC hw/misc/unimp.o > CC hw/misc/vmcoreinfo.o > CC hw/misc/arm_l2x0.o > CC hw/misc/arm_integrator_debug.o > CC hw/misc/a9scu.o > CC hw/net/xen_nic.o > CC hw/misc/arm11scu.o > CC hw/net/ne2000.o > CC hw/net/eepro100.o > CC hw/net/pcnet-pci.o > CC hw/net/pcnet.o > CC hw/net/e1000.o > CC hw/net/e1000x_common.o > CC hw/net/net_tx_pkt.o > CC hw/net/net_rx_pkt.o > CC hw/net/e1000e.o > CC hw/net/e1000e_core.o > CC hw/net/rtl8139.o > CC hw/net/vmxnet3.o > CC hw/net/smc91c111.o > CC hw/net/lan9118.o > CC hw/net/ne2000-isa.o > CC hw/net/xgmac.o > CC hw/net/xilinx_axienet.o > CC hw/net/allwinner_emac.o > CC hw/net/imx_fec.o > CC hw/net/cadence_gem.o > CC hw/net/stellaris_enet.o > CC hw/net/ftgmac100.o > CC hw/net/rocker/rocker.o > CC hw/net/rocker/rocker_fp.o > CC hw/net/rocker/rocker_desc.o > CC hw/net/rocker/rocker_world.o > CC hw/net/rocker/rocker_of_dpa.o > CC hw/net/can/can_sja1000.o > CC hw/net/can/can_kvaser_pci.o > CC hw/net/can/can_pcm3680_pci.o > CC hw/net/can/can_mioe3680_pci.o > CC hw/nvram/eeprom93xx.o > CC hw/nvram/fw_cfg.o > CC hw/nvram/chrp_nvram.o > CC hw/pci-bridge/pci_bridge_dev.o > CC hw/pci-bridge/pcie_root_port.o > CC hw/pci-bridge/gen_pcie_root_port.o > CC hw/pci-bridge/pcie_pci_bridge.o > CC hw/pci-bridge/pci_expander_bridge.o > CC hw/pci-bridge/xio3130_upstream.o > CC hw/pci-bridge/xio3130_downstream.o > CC hw/pci-bridge/ioh3420.o > CC hw/pci-bridge/i82801b11.o > CC hw/pci-host/pam.o > CC hw/pci-host/versatile.o > CC hw/pci-host/piix.o > CC hw/pci-host/q35.o > CC hw/pci-host/gpex.o > CC hw/pci-host/designware.o > CC hw/pci/pci.o > CC hw/pci/pci_bridge.o > CC hw/pci/msix.o > CC hw/pci/msi.o > CC hw/pci/shpc.o > CC hw/pci/slotid_cap.o > CC hw/pci/pci_host.o > CC hw/pci/pcie_host.o > CC hw/pci/pcie.o > CC hw/pci/pcie_aer.o > CC hw/pci/pcie_port.o > CC hw/pci/pci-stub.o > CC hw/pcmcia/pcmcia.o > CC hw/scsi/scsi-disk.o > CC hw/scsi/scsi-generic.o > CC hw/scsi/scsi-bus.o > CC hw/scsi/lsi53c895a.o > CC hw/scsi/mptsas.o > CC hw/scsi/mptconfig.o > CC hw/scsi/mptendian.o > CC hw/scsi/megasas.o > CC hw/scsi/vmw_pvscsi.o > CC hw/scsi/esp.o > CC hw/scsi/esp-pci.o > CC hw/sd/pl181.o > CC hw/sd/ssi-sd.o > CC hw/sd/sd.o > CC hw/sd/core.o > CC hw/sd/sdmmc-internal.o > CC hw/sd/sdhci.o > CC hw/smbios/smbios.o > CC hw/smbios/smbios_type_38.o > CC hw/smbios/smbios-stub.o > CC hw/smbios/smbios_type_38-stub.o > CC hw/ssi/pl022.o > CC hw/ssi/ssi.o > CC hw/ssi/xilinx_spips.o > CC hw/ssi/aspeed_smc.o > CC hw/ssi/stm32f2xx_spi.o > CC hw/ssi/mss-spi.o > CC hw/timer/arm_timer.o > CC hw/timer/arm_mptimer.o > CC hw/timer/armv7m_systick.o > CC hw/timer/a9gtimer.o > CC hw/timer/cadence_ttc.o > CC hw/timer/ds1338.o > CC hw/timer/hpet.o > CC hw/timer/i8254_common.o > CC hw/timer/i8254.o > CC hw/timer/pl031.o > CC hw/timer/twl92230.o > CC hw/timer/imx_epit.o > CC hw/timer/imx_gpt.o > CC hw/timer/xlnx-zynqmp-rtc.o > CC hw/timer/stm32f2xx_timer.o > CC hw/timer/aspeed_timer.o > CC hw/timer/cmsdk-apb-timer.o > CC hw/timer/cmsdk-apb-dualtimer.o > CC hw/timer/mss-timer.o > CC hw/tpm/tpm_util.o > CC hw/tpm/tpm_tis.o > CC hw/tpm/tpm_crb.o > CC hw/tpm/tpm_passthrough.o > CC hw/tpm/tpm_emulator.o > CC hw/usb/core.o > CC hw/usb/combined-packet.o > CC hw/usb/bus.o > CC hw/usb/libhw.o > CC hw/usb/desc.o > CC hw/usb/desc-msos.o > CC hw/usb/hcd-uhci.o > CC hw/usb/hcd-ohci.o > CC hw/usb/hcd-ehci.o > CC hw/usb/hcd-ehci-pci.o > CC hw/usb/hcd-ehci-sysbus.o > CC hw/usb/hcd-xhci.o > CC hw/usb/hcd-xhci-nec.o > CC hw/usb/hcd-musb.o > CC hw/usb/dev-hub.o > CC hw/usb/dev-hid.o > CC hw/usb/dev-wacom.o > CC hw/usb/dev-storage.o > CC hw/usb/dev-uas.o > CC hw/usb/dev-audio.o > CC hw/usb/dev-serial.o > CC hw/usb/dev-network.o > CC hw/usb/dev-bluetooth.o > CC hw/usb/dev-smartcard-reader.o > CC hw/usb/ccid-card-passthru.o > CC hw/usb/ccid-card-emulated.o > CC hw/usb/dev-mtp.o > CC hw/usb/host-stub.o > CC hw/virtio/virtio-bus.o > CC hw/virtio/virtio-rng.o > /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c: In function 'emulated_realize': > /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c:549:9: error: implicit declaration of function 'error_report' [-Werror=implicit-function-declaration] > error_report("failed to create event_thread"); > ^ > /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c:549:9: error: nested extern declaration of 'error_report' [-Werror=nested-externs] > cc1: all warnings being treated as errors > make: *** [hw/usb/ccid-card-emulated.o] Error 1 > make: *** Waiting for unfinished jobs.... > Traceback (most recent call last): > File "./tests/docker/docker.py", line 563, in <module> > sys.exit(main()) > File "./tests/docker/docker.py", line 560, in main > return args.cmdobj.run(args, argv) > File "./tests/docker/docker.py", line 306, in run > return Docker().run(argv, args.keep, quiet=args.quiet) > File "./tests/docker/docker.py", line 274, in run > quiet=quiet) > File "./tests/docker/docker.py", line 181, in _do_check > return subprocess.check_call(self._command + cmd, **kwargs) > File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call > raise CalledProcessError(retcode, cmd) > subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=53298fa0df9311e8a18952540069c830', '-u', '1000', '--security-opt', 'seccomp=unconfined', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-6f6bzbwa/src/docker-src.2018-11-03-14.07.14.17130:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2 > make[1]: *** [tests/docker/Makefile.include:217: docker-run] Error 1 > make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-6f6bzbwa/src' > make: *** [tests/docker/Makefile.include:251: docker-run-test-quick@centos7] Error 2 > > real 2m27.767s > user 0m5.117s > sys 0m3.918s > === OUTPUT END === > > Test command exited with code: 2 > > > --- > Email generated automatically by Patchew [http://patchew.org/]. > Please send your feedback to patchew-devel@redhat.com ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li ` (9 preceding siblings ...) 2018-11-03 18:09 ` [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check no-reply @ 2018-11-05 18:19 ` no-reply 10 siblings, 0 replies; 32+ messages in thread From: no-reply @ 2018-11-05 18:19 UTC (permalink / raw) To: fli; +Cc: famz, qemu-devel, quintela Hi, This series failed docker-quick@centos7 build test. Please find the testing commands and their output below. If you have Docker installed, you can probably reproduce it locally. Type: series Message-id: 20181101101715.9443-1-fli@suse.com Subject: [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check === TEST SCRIPT BEGIN === #!/bin/bash time make docker-test-quick@centos7 SHOW_ENV=1 J=8 === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 Switched to a new branch 'test' 3e277b70f1 qemu_thread_create: propagate the error to callers to handle 39551a72c7 migration: add more error handling for postcopy_ram_enable_notify 733f7a07cb migration: remove unused &local_err parameter in migrate_set_error 46e34c2c06 migration: fix the multifd code when receiving less channels d2c4705d34 migration: fix the multifd code when sending less channels 8ce0f380f1 migration: fix some segmentation faults when using multifd 37dbd330d4 qemu_thread_join: fix segmentation fault b10333fc35 qemu_init_vcpu: add a new Error parameter to propagate 3626dde437 Fix segmentation fault when qemu_signal_init fails === OUTPUT BEGIN === BUILD centos7 make[1]: Entering directory '/var/tmp/patchew-tester-tmp-skht4o_b/src' GEN /var/tmp/patchew-tester-tmp-skht4o_b/src/docker-src.2018-11-05-13.16.56.15391/qemu.tar Cloning into '/var/tmp/patchew-tester-tmp-skht4o_b/src/docker-src.2018-11-05-13.16.56.15391/qemu.tar.vroot'... done. Checking out files: 9% (632/6451) Checking out files: 10% (646/6451) Checking out files: 11% (710/6451) Checking out files: 12% (775/6451) Checking out files: 13% (839/6451) Checking out files: 14% (904/6451) Checking out files: 14% (932/6451) Checking out files: 15% (968/6451) Checking out files: 16% (1033/6451) Checking out files: 17% (1097/6451) Checking out files: 17% (1135/6451) Checking out files: 18% (1162/6451) Checking out files: 19% (1226/6451) Checking out files: 20% (1291/6451) Checking out files: 21% (1355/6451) Checking out files: 22% (1420/6451) Checking out files: 23% (1484/6451) Checking out files: 24% (1549/6451) Checking out files: 25% (1613/6451) Checking out files: 25% (1629/6451) Checking out files: 26% (1678/6451) Checking out files: 27% (1742/6451) Checking out files: 28% (1807/6451) Checking out files: 29% (1871/6451) Checking out files: 30% (1936/6451) Checking out files: 31% (2000/6451) Checking out files: 32% (2065/6451) Checking out files: 33% (2129/6451) Checking out files: 34% (2194/6451) Checking out files: 35% (2258/6451) Checking out files: 36% (2323/6451) Checking out files: 37% (2387/6451) Checking out files: 38% (2452/6451) Checking out files: 39% (2516/6451) Checking out files: 40% (2581/6451) Checking out files: 41% (2645/6451) Checking out files: 42% (2710/6451) Checking out files: 43% (2774/6451) Checking out files: 44% (2839/6451) Checking out files: 45% (2903/6451) Checking out files: 46% (2968/6451) Checking out files: 47% (3032/6451) Checking out files: 48% (3097/6451) Checking out files: 49% (3161/6451) Checking out files: 50% (3226/6451) Checking out files: 51% (3291/6451) Checking out files: 52% (3355/6451) Checking out files: 53% (3420/6451) Checking out files: 54% (3484/6451) Checking out files: 55% (3549/6451) Checking out files: 56% (3613/6451) Checking out files: 57% (3678/6451) Checking out files: 58% (3742/6451) Checking out files: 59% (3807/6451) Checking out files: 60% (3871/6451) Checking out files: 61% (3936/6451) Checking out files: 62% (4000/6451) Checking out files: 63% (4065/6451) Checking out files: 64% (4129/6451) Checking out files: 65% (4194/6451) Checking out files: 66% (4258/6451) Checking out files: 67% (4323/6451) Checking out files: 68% (4387/6451) Checking out files: 69% (4452/6451) Checking out files: 70% (4516/6451) Checking out files: 71% (4581/6451) Checking out files: 72% (4645/6451) Checking out files: 73% (4710/6451) Checking out files: 74% (4774/6451) Checking out files: 75% (4839/6451) Checking out files: 75% (4894/6451) Checking out files: 76% (4903/6451) Checking out files: 77% (4968/6451) Checking out files: 78% (5032/6451) Checking out files: 79% (5097/6451) Checking out files: 80% (5161/6451) Checking out files: 81% (5226/6451) Checking out files: 82% (5290/6451) Checking out files: 83% (5355/6451) Checking out files: 84% (5419/6451) Checking out files: 85% (5484/6451) Checking out files: 86% (5548/6451) Checking out files: 87% (5613/6451) Checking out files: 88% (5677/6451) Checking out files: 89% (5742/6451) Checking out files: 90% (5806/6451) Checking out files: 91% (5871/6451) Checking out files: 92% (5935/6451) Checking out files: 93% (6000/6451) Checking out files: 94% (6064/6451) Checking out files: 95% (6129/6451) Checking out files: 96% (6193/6451) Checking out files: 97% (6258/6451) Checking out files: 98% (6322/6451) Checking out files: 99% (6387/6451) Checking out files: 100% (6451/6451) Checking out files: 100% (6451/6451), done. Your branch is up-to-date with 'origin/test'. Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc' Cloning into '/var/tmp/patchew-tester-tmp-skht4o_b/src/docker-src.2018-11-05-13.16.56.15391/qemu.tar.vroot/dtc'... Submodule path 'dtc': checked out '88f18909db731a627456f26d779445f84e449536' Submodule 'ui/keycodemapdb' (git://git.qemu.org/keycodemapdb.git) registered for path 'ui/keycodemapdb' Cloning into '/var/tmp/patchew-tester-tmp-skht4o_b/src/docker-src.2018-11-05-13.16.56.15391/qemu.tar.vroot/ui/keycodemapdb'... Submodule path 'ui/keycodemapdb': checked out '6b3d716e2b6472eb7189d3220552280ef3d832ce' COPY RUNNER RUN test-quick in qemu:centos7 Packages installed: SDL-devel-1.2.15-14.el7.x86_64 bison-3.0.4-1.el7.x86_64 bzip2-1.0.6-13.el7.x86_64 bzip2-devel-1.0.6-13.el7.x86_64 ccache-3.3.4-1.el7.x86_64 csnappy-devel-0-6.20150729gitd7bc683.el7.x86_64 flex-2.5.37-3.el7.x86_64 gcc-4.8.5-28.el7_5.1.x86_64 gettext-0.19.8.1-2.el7.x86_64 git-1.8.3.1-14.el7_5.x86_64 glib2-devel-2.54.2-2.el7.x86_64 libaio-devel-0.3.109-13.el7.x86_64 libepoxy-devel-1.3.1-2.el7_5.x86_64 libfdt-devel-1.4.6-1.el7.x86_64 lzo-devel-2.06-8.el7.x86_64 make-3.82-23.el7.x86_64 mesa-libEGL-devel-17.2.3-8.20171019.el7.x86_64 mesa-libgbm-devel-17.2.3-8.20171019.el7.x86_64 nettle-devel-2.7.1-8.el7.x86_64 package g++ is not installed package librdmacm-devel is not installed pixman-devel-0.34.0-1.el7.x86_64 spice-glib-devel-0.34-3.el7_5.1.x86_64 spice-server-devel-0.14.0-2.el7_5.4.x86_64 tar-1.26-34.el7.x86_64 vte-devel-0.28.2-10.el7.x86_64 xen-devel-4.6.6-12.el7.x86_64 zlib-devel-1.2.7-17.el7.x86_64 Environment variables: PACKAGES=bison bzip2 bzip2-devel ccache csnappy-devel flex g++ gcc gettext git glib2-devel libaio-devel libepoxy-devel libfdt-devel librdmacm-devel lzo-devel make mesa-libEGL-devel mesa-libgbm-devel nettle-devel pixman-devel SDL-devel spice-glib-devel spice-server-devel tar vte-devel xen-devel zlib-devel HOSTNAME=ea2ae12eb067 MAKEFLAGS= -j8 J=8 CCACHE_DIR=/var/tmp/ccache EXTRA_CONFIGURE_OPTS= V= SHOW_ENV=1 PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ TARGET_LIST= SHLVL=1 HOME=/home/patchew TEST_DIR=/tmp/qemu-test FEATURES= dtc DEBUG= _=/usr/bin/env Configure options: --enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/tmp/qemu-test/install No C++ compiler available; disabling C++ specific optional code Install prefix /tmp/qemu-test/install BIOS directory /tmp/qemu-test/install/share/qemu firmware path /tmp/qemu-test/install/share/qemu-firmware binary directory /tmp/qemu-test/install/bin library directory /tmp/qemu-test/install/lib module directory /tmp/qemu-test/install/lib/qemu libexec directory /tmp/qemu-test/install/libexec include directory /tmp/qemu-test/install/include config directory /tmp/qemu-test/install/etc local state directory /tmp/qemu-test/install/var Manual directory /tmp/qemu-test/install/share/man ELF interp prefix /usr/gnemul/qemu-%M Source path /tmp/qemu-test/src GIT binary git GIT submodules C compiler cc Host C compiler cc C++ compiler Objective-C compiler cc ARFLAGS rv CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g QEMU_CFLAGS -I/usr/include/pixman-1 -Werror -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -Wno-missing-braces -I/usr/include/libpng15 -pthread -I/usr/include/spice-server -I/usr/include/cacard -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/spice-1 LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g QEMU_LDFLAGS make make install install python python -B smbd /usr/sbin/smbd module support no host CPU x86_64 host big endian no target list x86_64-softmmu aarch64-softmmu gprof enabled no sparse enabled no strip binaries yes profiler no static build no SDL support yes (1.2.15) GTK support no GTK GL support no VTE support no TLS priority NORMAL GNUTLS support no libgcrypt no nettle yes (2.7.1) libtasn1 no curses support yes virgl support no curl support no mingw32 support no Audio drivers oss Block whitelist (rw) Block whitelist (ro) VirtFS support no Multipath support no VNC support yes VNC SASL support no VNC JPEG support no VNC PNG support yes xen support yes xen ctrl version 40600 pv dom build no brlapi support no bluez support no Documentation no PIE yes vde support no netmap support no Linux AIO support yes ATTR/XATTR support yes Install blobs yes KVM support yes HAX support no HVF support no WHPX support no TCG support yes TCG debug enabled no TCG interpreter no malloc trim support yes RDMA support yes PVRDMA support yes fdt support system membarrier no preadv support yes fdatasync yes madvise yes posix_madvise yes posix_memalign yes libcap-ng support no vhost-net support yes vhost-crypto support yes vhost-scsi support yes vhost-vsock support yes vhost-user support yes Trace backends log spice support yes (0.12.13/0.14.0) rbd support no xfsctl support no smartcard support yes libusb no usb net redir no OpenGL support yes OpenGL dmabufs yes libiscsi support no libnfs support no build guest agent yes QGA VSS support no QGA w32 disk info no QGA MSI support no seccomp support no coroutine backend ucontext coroutine pool yes debug stack usage no mutex debugging no crypto afalg no GlusterFS support no gcov gcov gcov enabled no TPM support yes libssh2 support no TPM passthrough yes TPM emulator yes QOM debugging yes Live block migration yes lzo support yes snappy support no bzip2 support yes NUMA host support no libxml2 no tcmalloc support no jemalloc support no avx2 optimization yes replication support yes VxHS block device no capstone no docker no libpmem support no libudev no WARNING: Use of SDL 1.2 is deprecated and will be removed in WARNING: future releases. Please switch to using SDL 2.0 NOTE: cross-compilers enabled: 'cc' GEN x86_64-softmmu/config-devices.mak.tmp GEN aarch64-softmmu/config-devices.mak.tmp GEN qemu-options.def GEN config-host.h GEN qapi-gen GEN trace/generated-tcg-tracers.h GEN trace/generated-helpers-wrappers.h GEN trace/generated-helpers.h GEN trace/generated-helpers.c GEN module_block.h GEN x86_64-softmmu/config-devices.mak GEN aarch64-softmmu/config-devices.mak GEN ui/input-keymap-atset1-to-qcode.c GEN ui/input-keymap-linux-to-qcode.c GEN ui/input-keymap-qcode-to-atset1.c GEN ui/input-keymap-qcode-to-atset2.c GEN ui/input-keymap-qcode-to-atset3.c GEN ui/input-keymap-qcode-to-linux.c GEN ui/input-keymap-qcode-to-qnum.c GEN ui/input-keymap-qcode-to-sun.c GEN ui/input-keymap-qnum-to-qcode.c GEN ui/input-keymap-usb-to-qcode.c GEN ui/input-keymap-win32-to-qcode.c GEN ui/input-keymap-x11-to-qcode.c GEN ui/input-keymap-xorgevdev-to-qcode.c GEN ui/input-keymap-xorgkbd-to-qcode.c GEN ui/input-keymap-xorgxquartz-to-qcode.c GEN ui/input-keymap-xorgxwin-to-qcode.c GEN ui/input-keymap-osx-to-qcode.c GEN tests/test-qapi-gen GEN trace-root.h GEN accel/kvm/trace.h GEN accel/tcg/trace.h GEN audio/trace.h GEN block/trace.h GEN chardev/trace.h GEN crypto/trace.h GEN hw/9pfs/trace.h GEN hw/acpi/trace.h GEN hw/alpha/trace.h GEN hw/arm/trace.h GEN hw/audio/trace.h GEN hw/block/trace.h GEN hw/block/dataplane/trace.h GEN hw/char/trace.h GEN hw/display/trace.h GEN hw/dma/trace.h GEN hw/hppa/trace.h GEN hw/i2c/trace.h GEN hw/i386/trace.h GEN hw/i386/xen/trace.h GEN hw/ide/trace.h GEN hw/input/trace.h GEN hw/intc/trace.h GEN hw/isa/trace.h GEN hw/mem/trace.h GEN hw/misc/trace.h GEN hw/misc/macio/trace.h GEN hw/net/trace.h GEN hw/nvram/trace.h GEN hw/pci/trace.h GEN hw/pci-host/trace.h GEN hw/ppc/trace.h GEN hw/rdma/trace.h GEN hw/rdma/vmw/trace.h GEN hw/s390x/trace.h GEN hw/scsi/trace.h GEN hw/sd/trace.h GEN hw/sparc/trace.h GEN hw/sparc64/trace.h GEN hw/timer/trace.h GEN hw/tpm/trace.h GEN hw/usb/trace.h GEN hw/vfio/trace.h GEN hw/virtio/trace.h GEN hw/watchdog/trace.h GEN hw/xen/trace.h GEN io/trace.h GEN linux-user/trace.h GEN migration/trace.h GEN nbd/trace.h GEN net/trace.h GEN qapi/trace.h GEN qom/trace.h GEN scsi/trace.h GEN target/arm/trace.h GEN target/i386/trace.h GEN target/mips/trace.h GEN target/ppc/trace.h GEN target/s390x/trace.h GEN target/sparc/trace.h GEN ui/trace.h GEN trace-root.c GEN util/trace.h GEN accel/kvm/trace.c GEN accel/tcg/trace.c GEN audio/trace.c GEN block/trace.c GEN chardev/trace.c GEN crypto/trace.c GEN hw/9pfs/trace.c GEN hw/acpi/trace.c GEN hw/alpha/trace.c GEN hw/arm/trace.c GEN hw/audio/trace.c GEN hw/block/trace.c GEN hw/block/dataplane/trace.c GEN hw/char/trace.c GEN hw/display/trace.c GEN hw/dma/trace.c GEN hw/hppa/trace.c GEN hw/i2c/trace.c GEN hw/i386/trace.c GEN hw/i386/xen/trace.c GEN hw/ide/trace.c GEN hw/input/trace.c GEN hw/intc/trace.c GEN hw/isa/trace.c GEN hw/mem/trace.c GEN hw/misc/trace.c GEN hw/misc/macio/trace.c GEN hw/net/trace.c GEN hw/nvram/trace.c GEN hw/pci/trace.c GEN hw/pci-host/trace.c GEN hw/ppc/trace.c GEN hw/rdma/trace.c GEN hw/rdma/vmw/trace.c GEN hw/s390x/trace.c GEN hw/scsi/trace.c GEN hw/sd/trace.c GEN hw/sparc/trace.c GEN hw/sparc64/trace.c GEN hw/timer/trace.c GEN hw/tpm/trace.c GEN hw/usb/trace.c GEN hw/vfio/trace.c GEN hw/virtio/trace.c GEN hw/watchdog/trace.c GEN hw/xen/trace.c GEN io/trace.c GEN linux-user/trace.c GEN migration/trace.c GEN nbd/trace.c GEN net/trace.c GEN qapi/trace.c GEN qom/trace.c GEN scsi/trace.c GEN target/arm/trace.c GEN target/i386/trace.c GEN target/mips/trace.c GEN target/ppc/trace.c GEN target/s390x/trace.c GEN target/sparc/trace.c GEN ui/trace.c GEN util/trace.c GEN config-all-devices.mak CC tests/qemu-iotests/socket_scm_helper.o GEN qga/qapi-generated/qapi-gen CC qapi/qapi-types.o CC qapi/qapi-builtin-types.o CC qapi/qapi-types-char.o CC qapi/qapi-types-block.o CC qapi/qapi-types-block-core.o CC qapi/qapi-types-common.o CC qapi/qapi-types-crypto.o CC qapi/qapi-types-introspect.o CC qapi/qapi-types-job.o CC qapi/qapi-types-migration.o CC qapi/qapi-types-misc.o CC qapi/qapi-types-net.o CC qapi/qapi-types-rocker.o CC qapi/qapi-types-run-state.o CC qapi/qapi-types-sockets.o CC qapi/qapi-types-tpm.o CC qapi/qapi-types-trace.o CC qapi/qapi-types-transaction.o CC qapi/qapi-types-ui.o CC qapi/qapi-builtin-visit.o CC qapi/qapi-visit.o CC qapi/qapi-visit-block-core.o CC qapi/qapi-visit-block.o CC qapi/qapi-visit-char.o CC qapi/qapi-visit-common.o CC qapi/qapi-visit-crypto.o CC qapi/qapi-visit-introspect.o CC qapi/qapi-visit-job.o CC qapi/qapi-visit-migration.o CC qapi/qapi-visit-misc.o CC qapi/qapi-visit-net.o CC qapi/qapi-visit-rocker.o CC qapi/qapi-visit-run-state.o CC qapi/qapi-visit-tpm.o CC qapi/qapi-visit-sockets.o CC qapi/qapi-visit-trace.o CC qapi/qapi-visit-transaction.o CC qapi/qapi-visit-ui.o CC qapi/qapi-events.o CC qapi/qapi-events-block-core.o CC qapi/qapi-events-block.o CC qapi/qapi-events-char.o CC qapi/qapi-events-common.o CC qapi/qapi-events-crypto.o CC qapi/qapi-events-introspect.o CC qapi/qapi-events-job.o CC qapi/qapi-events-migration.o CC qapi/qapi-events-misc.o CC qapi/qapi-events-net.o CC qapi/qapi-events-rocker.o CC qapi/qapi-events-run-state.o CC qapi/qapi-events-sockets.o CC qapi/qapi-events-tpm.o CC qapi/qapi-events-trace.o CC qapi/qapi-events-transaction.o CC qapi/qapi-events-ui.o CC qapi/qapi-visit-core.o CC qapi/qapi-introspect.o CC qapi/qapi-dealloc-visitor.o CC qapi/qobject-input-visitor.o CC qapi/qobject-output-visitor.o CC qapi/qmp-registry.o CC qapi/qmp-dispatch.o CC qapi/string-input-visitor.o CC qapi/string-output-visitor.o CC qapi/opts-visitor.o CC qapi/qapi-clone-visitor.o CC qapi/qmp-event.o CC qapi/qapi-util.o CC qobject/qnull.o CC qobject/qnum.o CC qobject/qstring.o CC qobject/qdict.o CC qobject/qlist.o CC qobject/qbool.o CC qobject/qlit.o CC qobject/qjson.o CC qobject/qobject.o CC qobject/json-lexer.o CC qobject/json-streamer.o CC qobject/json-parser.o CC qobject/block-qdict.o CC trace/control.o CC trace/qmp.o CC util/osdep.o CC util/cutils.o CC util/unicode.o CC util/qemu-timer-common.o CC util/bufferiszero.o CC util/lockcnt.o CC util/aiocb.o CC util/async.o CC util/aio-wait.o CC util/thread-pool.o CC util/qemu-timer.o CC util/main-loop.o CC util/iohandler.o CC util/aio-posix.o CC util/compatfd.o CC util/event_notifier-posix.o CC util/mmap-alloc.o CC util/oslib-posix.o CC util/qemu-openpty.o CC util/qemu-thread-posix.o CC util/memfd.o CC util/envlist.o CC util/path.o CC util/module.o CC util/host-utils.o CC util/bitmap.o CC util/bitops.o CC util/hbitmap.o CC util/fifo8.o CC util/acl.o CC util/cacheinfo.o CC util/error.o CC util/qemu-error.o CC util/id.o CC util/iov.o CC util/qemu-config.o CC util/qemu-sockets.o CC util/uri.o CC util/notify.o CC util/qemu-option.o CC util/qemu-progress.o CC util/keyval.o CC util/hexdump.o CC util/crc32c.o CC util/uuid.o CC util/throttle.o CC util/getauxval.o CC util/readline.o CC util/rcu.o CC util/qemu-coroutine.o CC util/qemu-coroutine-lock.o CC util/qemu-coroutine-io.o CC util/qemu-coroutine-sleep.o CC util/coroutine-ucontext.o CC util/buffer.o CC util/timed-average.o CC util/base64.o CC util/log.o CC util/pagesize.o CC util/qdist.o CC util/qsp.o CC util/qht.o CC util/range.o CC util/stats64.o CC util/systemd.o CC util/iova-tree.o CC util/vfio-helpers.o CC util/drm.o CC trace-root.o CC accel/kvm/trace.o CC accel/tcg/trace.o CC audio/trace.o CC block/trace.o CC chardev/trace.o CC crypto/trace.o CC hw/9pfs/trace.o CC hw/acpi/trace.o CC hw/alpha/trace.o CC hw/arm/trace.o CC hw/audio/trace.o CC hw/block/trace.o CC hw/block/dataplane/trace.o CC hw/char/trace.o CC hw/display/trace.o CC hw/dma/trace.o CC hw/hppa/trace.o CC hw/i2c/trace.o CC hw/i386/trace.o CC hw/i386/xen/trace.o CC hw/ide/trace.o CC hw/input/trace.o CC hw/intc/trace.o CC hw/isa/trace.o CC hw/mem/trace.o CC hw/misc/trace.o CC hw/misc/macio/trace.o CC hw/net/trace.o CC hw/nvram/trace.o CC hw/pci/trace.o CC hw/pci-host/trace.o CC hw/ppc/trace.o CC hw/rdma/trace.o CC hw/rdma/vmw/trace.o CC hw/s390x/trace.o CC hw/scsi/trace.o CC hw/sd/trace.o CC hw/sparc/trace.o CC hw/sparc64/trace.o CC hw/timer/trace.o CC hw/tpm/trace.o CC hw/usb/trace.o CC hw/vfio/trace.o CC hw/virtio/trace.o CC hw/watchdog/trace.o CC hw/xen/trace.o CC io/trace.o CC linux-user/trace.o CC migration/trace.o CC nbd/trace.o CC net/trace.o CC qapi/trace.o CC qom/trace.o CC scsi/trace.o CC target/arm/trace.o CC target/i386/trace.o CC target/mips/trace.o CC target/ppc/trace.o CC target/s390x/trace.o CC target/sparc/trace.o CC ui/trace.o CC util/trace.o CC crypto/pbkdf-stub.o CC stubs/arch-query-cpu-def.o CC stubs/arch-query-cpu-model-expansion.o CC stubs/arch-query-cpu-model-comparison.o CC stubs/arch-query-cpu-model-baseline.o CC stubs/bdrv-next-monitor-owned.o CC stubs/blk-commit-all.o CC stubs/blockdev-close-all-bdrv-states.o CC stubs/clock-warp.o CC stubs/cpu-get-clock.o CC stubs/cpu-get-icount.o CC stubs/dump.o CC stubs/error-printf.o CC stubs/fdset.o CC stubs/gdbstub.o CC stubs/get-vm-name.o CC stubs/iothread.o CC stubs/iothread-lock.o CC stubs/is-daemonized.o CC stubs/linux-aio.o CC stubs/machine-init-done.o CC stubs/migr-blocker.o CC stubs/change-state-handler.o CC stubs/monitor.o CC stubs/notify-event.o CC stubs/qtest.o CC stubs/replay.o CC stubs/runstate-check.o CC stubs/set-fd-handler.o CC stubs/slirp.o CC stubs/sysbus.o CC stubs/tpm.o CC stubs/trace-control.o CC stubs/uuid.o CC stubs/vm-stop.o CC stubs/vmstate.o CC stubs/qmp_memory_device.o CC stubs/target-monitor-defs.o CC stubs/target-get-monitor-def.o CC stubs/pc_madt_cpu_entry.o CC stubs/vmgenid.o CC stubs/xen-common.o CC stubs/xen-hvm.o CC stubs/pci-host-piix.o CC stubs/ram-block.o CC stubs/ramfb.o CC contrib/ivshmem-client/main.o CC contrib/ivshmem-client/ivshmem-client.o CC contrib/ivshmem-server/ivshmem-server.o CC contrib/ivshmem-server/main.o CC qemu-nbd.o CC block.o CC blockjob.o CC job.o CC qemu-io-cmds.o CC replication.o CC block/raw-format.o CC block/qcow.o CC block/vdi.o CC block/vmdk.o CC block/cloop.o CC block/bochs.o CC block/vpc.o CC block/vvfat.o CC block/dmg.o CC block/qcow2.o CC block/qcow2-refcount.o CC block/qcow2-cluster.o CC block/qcow2-snapshot.o CC block/qcow2-cache.o CC block/qcow2-bitmap.o CC block/qed.o CC block/qed-l2-cache.o CC block/qed-table.o CC block/qed-cluster.o CC block/qed-check.o CC block/vhdx.o CC block/vhdx-endian.o CC block/vhdx-log.o CC block/quorum.o CC block/parallels.o CC block/blkdebug.o CC block/blkverify.o CC block/blkreplay.o CC block/blklogwrites.o CC block/block-backend.o CC block/snapshot.o CC block/qapi.o CC block/file-posix.o CC block/linux-aio.o CC block/null.o CC block/mirror.o CC block/commit.o CC block/io.o CC block/create.o CC block/throttle-groups.o CC block/nvme.o CC block/nbd.o CC block/nbd-client.o CC block/sheepdog.o CC block/accounting.o CC block/dirty-bitmap.o CC block/write-threshold.o CC block/backup.o CC block/replication.o CC block/throttle.o CC block/copy-on-read.o CC block/crypto.o CC nbd/server.o CC nbd/client.o CC nbd/common.o CC scsi/utils.o CC scsi/pr-manager.o CC scsi/pr-manager-helper.o CC block/dmg-bz2.o CC crypto/init.o CC crypto/hash.o CC crypto/hash-nettle.o CC crypto/hmac.o CC crypto/hmac-nettle.o CC crypto/aes.o CC crypto/desrfb.o CC crypto/cipher.o CC crypto/tlscreds.o CC crypto/tlscredsanon.o CC crypto/tlscredspsk.o CC crypto/tlscredsx509.o CC crypto/tlssession.o CC crypto/secret.o CC crypto/random-platform.o CC crypto/pbkdf.o CC crypto/pbkdf-nettle.o CC crypto/ivgen.o CC crypto/ivgen-essiv.o CC crypto/ivgen-plain.o CC crypto/ivgen-plain64.o CC crypto/afsplit.o CC crypto/xts.o CC crypto/block.o CC crypto/block-qcow.o CC crypto/block-luks.o CC io/channel.o CC io/channel-buffer.o CC io/channel-command.o CC io/channel-file.o CC io/channel-socket.o CC io/channel-tls.o CC io/channel-watch.o CC io/channel-websock.o CC io/channel-util.o CC io/dns-resolver.o CC io/net-listener.o CC io/task.o CC qom/object.o CC qom/container.o CC qom/qom-qobject.o CC qom/object_interfaces.o GEN qemu-img-cmds.h CC qemu-io.o CC qemu-edid.o CC hw/display/edid-generate.o CC scsi/qemu-pr-helper.o CC qemu-bridge-helper.o CC blockdev.o CC blockdev-nbd.o CC bootdevice.o CC iothread.o CC job-qmp.o CC qdev-monitor.o CC device-hotplug.o CC os-posix.o CC bt-host.o CC bt-vhci.o CC dma-helpers.o CC vl.o CC tpm.o CC device_tree.o CC qapi/qapi-commands.o CC qapi/qapi-commands-block-core.o CC qapi/qapi-commands-block.o CC qapi/qapi-commands-char.o CC qapi/qapi-commands-common.o CC qapi/qapi-commands-crypto.o CC qapi/qapi-commands-introspect.o CC qapi/qapi-commands-job.o CC qapi/qapi-commands-migration.o CC qapi/qapi-commands-misc.o CC qapi/qapi-commands-net.o CC qapi/qapi-commands-rocker.o CC qapi/qapi-commands-run-state.o CC qapi/qapi-commands-sockets.o CC qapi/qapi-commands-tpm.o CC qapi/qapi-commands-trace.o CC qapi/qapi-commands-transaction.o CC qapi/qapi-commands-ui.o CC qmp.o CC hmp.o CC cpus-common.o CC audio/audio.o CC audio/noaudio.o CC audio/wavaudio.o CC audio/mixeng.o CC audio/spiceaudio.o CC audio/wavcapture.o CC backends/rng.o CC backends/rng-egd.o CC backends/rng-random.o CC backends/tpm.o CC backends/hostmem.o CC backends/hostmem-ram.o CC backends/hostmem-file.o CC backends/cryptodev.o CC backends/cryptodev-builtin.o CC backends/cryptodev-vhost.o CC backends/cryptodev-vhost-user.o CC backends/hostmem-memfd.o CC block/stream.o CC chardev/msmouse.o CC chardev/wctablet.o CC chardev/testdev.o CC chardev/spice.o CC disas/arm.o CC disas/i386.o CC fsdev/qemu-fsdev-dummy.o CC fsdev/qemu-fsdev-opts.o CC fsdev/qemu-fsdev-throttle.o CC hw/acpi/core.o CC hw/acpi/piix4.o CC hw/acpi/pcihp.o CC hw/acpi/ich9.o CC hw/acpi/tco.o CC hw/acpi/cpu_hotplug.o CC hw/acpi/memory_hotplug.o CC hw/acpi/cpu.o CC hw/acpi/nvdimm.o CC hw/acpi/vmgenid.o CC hw/acpi/acpi_interface.o CC hw/acpi/bios-linker-loader.o CC hw/acpi/aml-build.o CC hw/acpi/ipmi.o CC hw/acpi/acpi-stub.o CC hw/acpi/ipmi-stub.o CC hw/audio/sb16.o CC hw/audio/es1370.o CC hw/audio/ac97.o CC hw/audio/fmopl.o CC hw/audio/adlib.o CC hw/audio/gus.o CC hw/audio/gusemu_hal.o CC hw/audio/gusemu_mixer.o CC hw/audio/cs4231a.o CC hw/audio/intel-hda.o CC hw/audio/hda-codec.o CC hw/audio/pcspk.o CC hw/audio/wm8750.o CC hw/audio/pl041.o CC hw/audio/lm4549.o CC hw/audio/marvell_88w8618.o CC hw/audio/soundhw.o CC hw/block/block.o CC hw/block/cdrom.o CC hw/block/hd-geometry.o CC hw/block/fdc.o CC hw/block/m25p80.o CC hw/block/nand.o CC hw/block/pflash_cfi01.o CC hw/block/pflash_cfi02.o CC hw/block/xen_disk.o CC hw/block/ecc.o CC hw/block/onenand.o CC hw/block/nvme.o CC hw/bt/core.o CC hw/bt/l2cap.o CC hw/bt/sdp.o CC hw/bt/hci.o CC hw/bt/hid.o CC hw/bt/hci-csr.o CC hw/char/ipoctal232.o CC hw/char/nrf51_uart.o CC hw/char/parallel.o CC hw/char/parallel-isa.o CC hw/char/pl011.o CC hw/char/serial.o CC hw/char/serial-isa.o CC hw/char/serial-pci.o CC hw/char/virtio-console.o CC hw/char/xen_console.o CC hw/char/cadence_uart.o CC hw/char/cmsdk-apb-uart.o CC hw/char/debugcon.o CC hw/char/imx_serial.o CC hw/core/qdev.o CC hw/core/qdev-properties.o CC hw/core/bus.o CC hw/core/reset.o CC hw/core/qdev-fw.o CC hw/core/fw-path-provider.o CC hw/core/irq.o CC hw/core/hotplug.o CC hw/core/nmi.o CC hw/core/stream.o CC hw/core/ptimer.o CC hw/core/sysbus.o CC hw/core/machine.o CC hw/core/loader.o CC hw/core/qdev-properties-system.o CC hw/core/register.o CC hw/core/or-irq.o CC hw/core/split-irq.o CC hw/core/platform-bus.o CC hw/core/generic-loader.o CC hw/core/null-machine.o CC hw/cpu/core.o CC hw/display/ramfb.o CC hw/display/ramfb-standalone.o CC hw/display/ads7846.o CC hw/display/cirrus_vga.o CC hw/display/cirrus_vga_isa.o CC hw/display/pl110.o CC hw/display/sii9022.o CC hw/display/ssd0303.o CC hw/display/ssd0323.o CC hw/display/xenfb.o CC hw/display/vga-pci.o CC hw/display/edid-region.o CC hw/display/vga-isa.o CC hw/display/vmware_vga.o CC hw/display/bochs-display.o CC hw/display/blizzard.o CC hw/display/exynos4210_fimd.o CC hw/display/framebuffer.o CC hw/display/tc6393xb.o CC hw/display/qxl.o CC hw/display/qxl-logger.o CC hw/display/qxl-render.o CC hw/dma/pl080.o CC hw/dma/pl330.o CC hw/dma/i8257.o CC hw/dma/xilinx_axidma.o CC hw/dma/xlnx-zynq-devcfg.o CC hw/dma/xlnx-zdma.o CC hw/gpio/max7310.o CC hw/gpio/pl061.o CC hw/gpio/zaurus.o CC hw/gpio/gpio_key.o CC hw/i2c/core.o CC hw/i2c/smbus.o CC hw/i2c/smbus_eeprom.o CC hw/i2c/i2c-ddc.o CC hw/i2c/versatile_i2c.o CC hw/i2c/smbus_ich9.o CC hw/i2c/pm_smbus.o CC hw/i2c/bitbang_i2c.o CC hw/i2c/exynos4210_i2c.o CC hw/i2c/imx_i2c.o CC hw/i2c/aspeed_i2c.o CC hw/ide/core.o CC hw/ide/atapi.o CC hw/ide/qdev.o CC hw/ide/pci.o CC hw/ide/isa.o CC hw/ide/piix.o CC hw/ide/microdrive.o CC hw/ide/ahci.o CC hw/ide/ich.o CC hw/ide/ahci-allwinner.o CC hw/input/hid.o CC hw/input/lm832x.o CC hw/input/pckbd.o CC hw/input/pl050.o CC hw/input/ps2.o CC hw/input/stellaris_input.o CC hw/input/tsc2005.o CC hw/input/virtio-input.o CC hw/input/virtio-input-hid.o CC hw/input/virtio-input-host.o CC hw/intc/i8259_common.o CC hw/intc/i8259.o CC hw/intc/pl190.o CC hw/intc/xlnx-pmu-iomod-intc.o CC hw/intc/xlnx-zynqmp-ipi.o CC hw/intc/imx_avic.o CC hw/intc/imx_gpcv2.o CC hw/intc/realview_gic.o CC hw/intc/ioapic_common.o CC hw/intc/arm_gic_common.o CC hw/intc/arm_gic.o CC hw/intc/arm_gicv2m.o CC hw/intc/arm_gicv3_common.o CC hw/intc/arm_gicv3.o CC hw/intc/arm_gicv3_dist.o CC hw/intc/arm_gicv3_redist.o CC hw/intc/arm_gicv3_its_common.o CC hw/intc/intc.o CC hw/ipack/ipack.o CC hw/ipack/tpci200.o CC hw/ipmi/ipmi.o CC hw/ipmi/ipmi_bmc_sim.o CC hw/ipmi/ipmi_bmc_extern.o CC hw/ipmi/isa_ipmi_kcs.o CC hw/ipmi/isa_ipmi_bt.o CC hw/isa/isa-bus.o CC hw/isa/isa-superio.o CC hw/isa/apm.o CC hw/mem/pc-dimm.o CC hw/mem/memory-device.o CC hw/mem/nvdimm.o CC hw/misc/applesmc.o CC hw/misc/max111x.o CC hw/misc/tmp105.o CC hw/misc/tmp421.o CC hw/misc/debugexit.o CC hw/misc/sga.o CC hw/misc/pc-testdev.o CC hw/misc/pci-testdev.o CC hw/misc/edu.o CC hw/misc/pca9552.o CC hw/misc/unimp.o CC hw/misc/vmcoreinfo.o CC hw/misc/arm_l2x0.o CC hw/misc/arm_integrator_debug.o CC hw/misc/a9scu.o CC hw/misc/arm11scu.o CC hw/net/xen_nic.o CC hw/net/ne2000.o CC hw/net/eepro100.o CC hw/net/pcnet-pci.o CC hw/net/pcnet.o CC hw/net/e1000.o CC hw/net/e1000x_common.o CC hw/net/net_tx_pkt.o CC hw/net/net_rx_pkt.o CC hw/net/e1000e.o CC hw/net/e1000e_core.o CC hw/net/rtl8139.o CC hw/net/vmxnet3.o CC hw/net/smc91c111.o CC hw/net/lan9118.o CC hw/net/ne2000-isa.o CC hw/net/xgmac.o CC hw/net/xilinx_axienet.o CC hw/net/allwinner_emac.o CC hw/net/imx_fec.o CC hw/net/cadence_gem.o CC hw/net/stellaris_enet.o CC hw/net/ftgmac100.o CC hw/net/rocker/rocker.o CC hw/net/rocker/rocker_fp.o CC hw/net/rocker/rocker_desc.o CC hw/net/rocker/rocker_world.o CC hw/net/rocker/rocker_of_dpa.o CC hw/net/can/can_sja1000.o CC hw/net/can/can_kvaser_pci.o CC hw/net/can/can_pcm3680_pci.o CC hw/net/can/can_mioe3680_pci.o CC hw/nvram/eeprom93xx.o CC hw/nvram/fw_cfg.o CC hw/pci-bridge/pci_bridge_dev.o CC hw/nvram/chrp_nvram.o CC hw/pci-bridge/pcie_root_port.o CC hw/pci-bridge/gen_pcie_root_port.o CC hw/pci-bridge/pcie_pci_bridge.o CC hw/pci-bridge/pci_expander_bridge.o CC hw/pci-bridge/xio3130_upstream.o CC hw/pci-bridge/xio3130_downstream.o CC hw/pci-bridge/ioh3420.o CC hw/pci-bridge/i82801b11.o CC hw/pci-host/pam.o CC hw/pci-host/versatile.o CC hw/pci-host/piix.o CC hw/pci-host/q35.o CC hw/pci-host/gpex.o CC hw/pci-host/designware.o CC hw/pci/pci.o CC hw/pci/pci_bridge.o CC hw/pci/msix.o CC hw/pci/msi.o CC hw/pci/shpc.o CC hw/pci/slotid_cap.o CC hw/pci/pci_host.o CC hw/pci/pcie_host.o CC hw/pci/pcie.o CC hw/pci/pcie_aer.o CC hw/pci/pcie_port.o CC hw/pci/pci-stub.o CC hw/pcmcia/pcmcia.o CC hw/scsi/scsi-disk.o CC hw/scsi/scsi-generic.o CC hw/scsi/scsi-bus.o CC hw/scsi/lsi53c895a.o CC hw/scsi/mptsas.o CC hw/scsi/mptconfig.o CC hw/scsi/mptendian.o CC hw/scsi/megasas.o CC hw/scsi/vmw_pvscsi.o CC hw/scsi/esp.o CC hw/scsi/esp-pci.o CC hw/sd/pl181.o CC hw/sd/ssi-sd.o CC hw/sd/sd.o CC hw/sd/core.o CC hw/sd/sdmmc-internal.o CC hw/sd/sdhci.o CC hw/smbios/smbios.o CC hw/smbios/smbios-stub.o CC hw/smbios/smbios_type_38.o CC hw/smbios/smbios_type_38-stub.o CC hw/ssi/pl022.o CC hw/ssi/ssi.o CC hw/ssi/xilinx_spips.o CC hw/ssi/aspeed_smc.o CC hw/ssi/stm32f2xx_spi.o CC hw/ssi/mss-spi.o CC hw/timer/arm_timer.o CC hw/timer/arm_mptimer.o CC hw/timer/armv7m_systick.o CC hw/timer/a9gtimer.o CC hw/timer/cadence_ttc.o CC hw/timer/ds1338.o CC hw/timer/hpet.o CC hw/timer/i8254_common.o CC hw/timer/i8254.o CC hw/timer/pl031.o CC hw/timer/twl92230.o CC hw/timer/imx_epit.o CC hw/timer/imx_gpt.o CC hw/timer/xlnx-zynqmp-rtc.o CC hw/timer/stm32f2xx_timer.o CC hw/timer/aspeed_timer.o CC hw/timer/cmsdk-apb-timer.o CC hw/timer/cmsdk-apb-dualtimer.o CC hw/timer/mss-timer.o CC hw/tpm/tpm_util.o CC hw/tpm/tpm_tis.o CC hw/tpm/tpm_crb.o CC hw/tpm/tpm_passthrough.o CC hw/tpm/tpm_emulator.o CC hw/usb/core.o CC hw/usb/combined-packet.o CC hw/usb/bus.o CC hw/usb/libhw.o CC hw/usb/desc.o CC hw/usb/desc-msos.o CC hw/usb/hcd-uhci.o CC hw/usb/hcd-ohci.o CC hw/usb/hcd-ehci.o CC hw/usb/hcd-ehci-pci.o CC hw/usb/hcd-ehci-sysbus.o CC hw/usb/hcd-xhci.o CC hw/usb/hcd-xhci-nec.o CC hw/usb/hcd-musb.o CC hw/usb/dev-hub.o CC hw/usb/dev-hid.o CC hw/usb/dev-wacom.o CC hw/usb/dev-storage.o CC hw/usb/dev-uas.o CC hw/usb/dev-audio.o CC hw/usb/dev-serial.o CC hw/usb/dev-network.o CC hw/usb/dev-bluetooth.o CC hw/usb/dev-smartcard-reader.o CC hw/usb/ccid-card-passthru.o CC hw/usb/ccid-card-emulated.o CC hw/usb/dev-mtp.o CC hw/usb/host-stub.o CC hw/virtio/virtio-bus.o CC hw/virtio/virtio-rng.o CC hw/virtio/virtio-pci.o CC hw/virtio/virtio-mmio.o CC hw/virtio/vhost-stub.o /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c: In function 'emulated_realize': /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c:549:9: error: implicit declaration of function 'error_report' [-Werror=implicit-function-declaration] error_report("failed to create event_thread"); ^ /tmp/qemu-test/src/hw/usb/ccid-card-emulated.c:549:9: error: nested extern declaration of 'error_report' [-Werror=nested-externs] cc1: all warnings being treated as errors make: *** [hw/usb/ccid-card-emulated.o] Error 1 make: *** Waiting for unfinished jobs.... Traceback (most recent call last): File "./tests/docker/docker.py", line 563, in <module> sys.exit(main()) File "./tests/docker/docker.py", line 560, in main return args.cmdobj.run(args, argv) File "./tests/docker/docker.py", line 306, in run return Docker().run(argv, args.keep, quiet=args.quiet) File "./tests/docker/docker.py", line 274, in run quiet=quiet) File "./tests/docker/docker.py", line 181, in _do_check return subprocess.check_call(self._command + cmd, **kwargs) File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=0775f3f6e12711e8aafc52540069c830', '-u', '1000', '--security-opt', 'seccomp=unconfined', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-skht4o_b/src/docker-src.2018-11-05-13.16.56.15391:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2 make[1]: *** [tests/docker/Makefile.include:217: docker-run] Error 1 make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-skht4o_b/src' make: *** [tests/docker/Makefile.include:251: docker-run-test-quick@centos7] Error 2 real 2m32.358s user 0m5.682s sys 0m4.024s === OUTPUT END === Test command exited with code: 2 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@redhat.com ^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2018-12-04 7:37 UTC | newest] Thread overview: 32+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-11-01 10:17 [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 1/9] Fix segmentation fault when qemu_signal_init fails Fei Li 2018-11-05 13:32 ` Juan Quintela 2018-11-06 5:08 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 2/9] qemu_init_vcpu: add a new Error parameter to propagate Fei Li 2018-11-05 13:34 ` Juan Quintela 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 3/9] qemu_thread_join: fix segmentation fault Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 4/9] migration: fix some segmentation faults when using multifd Fei Li 2018-11-02 2:31 ` Peter Xu 2018-11-02 6:03 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 5/9] migration: fix the multifd code when sending less channels Fei Li 2018-11-02 2:37 ` Peter Xu 2018-11-02 3:00 ` Fei Li 2018-11-02 3:32 ` Peter Xu 2018-11-02 7:13 ` Fei Li 2018-11-02 7:32 ` Peter Xu 2018-11-02 16:33 ` Dr. David Alan Gilbert 2018-11-12 4:43 ` Fei Li 2018-12-04 7:32 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 6/9] migration: fix the multifd code when receiving " Fei Li 2018-11-02 2:46 ` Peter Xu 2018-11-06 5:29 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 7/9] migration: remove unused &local_err parameter in migrate_set_error Fei Li 2018-11-05 13:59 ` Juan Quintela 2018-11-06 4:51 ` Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 8/9] migration: add more error handling for postcopy_ram_enable_notify Fei Li 2018-11-01 10:17 ` [Qemu-devel] [PATCH RFC v7 9/9] qemu_thread_create: propagate the error to callers to handle Fei Li 2018-11-05 13:53 ` Juan Quintela 2018-11-06 7:15 ` Fei Li 2018-11-03 18:09 ` [Qemu-devel] [PATCH RFC v7 0/9] qemu_thread_create: propagate errors to callers to check no-reply 2018-11-05 4:57 ` Fei Li 2018-11-05 18:19 ` no-reply
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).