From patchwork Wed Jul 17 02:33:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133060 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Y4hB713K"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLtq5Pdbz9sLt for ; Wed, 17 Jul 2019 12:34:11 +1000 (AEST) Received: from localhost ([::1]:53626 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlh-0001Pc-9b for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:34:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52915) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlA-0000Ej-EQ for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZl6-00061y-M8 for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:36 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:37738) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZl6-00060z-Ax for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:32 -0400 Received: by mail-pf1-x443.google.com with SMTP id 19so10044751pfa.4 for ; Tue, 16 Jul 2019 19:33:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bkbcfMa3cs5wedeyDlK30E/C95joM5HSJIHKNt/oeFo=; b=Y4hB713KWVVAVKMAShTkhu1YgNe2c9qCKl8WjsfCawJgIs6OeF9Tpo8yl39fmiLUcF jQYURiuATPUbnaOUG1pAnE+fzv5NlSMdkHGN1LGyw4QFigdNoXizSDTo476XF63LvneQ rfhM/sfYQtyH7Sqh/brRiiD/RZ8yiXhYXOzt0DE8uWnQBN9KBsky37zGRBDtOcIPREOt ulTwMT3DVqjTQhytiQEfMzttAjyYic4vg76v1UQpYl2APVIukWsMXBAiYza8O49H/AF6 XZm1cUCR6wAtfjFKJikIANhIiuQBnnfN3Nekq2577h0FYzCMkVVRRta9fIJElRi8kJ4g xPvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bkbcfMa3cs5wedeyDlK30E/C95joM5HSJIHKNt/oeFo=; b=Z7TfScHp8+Y++ptGq6fsihahGeNzjmCvaWl9b0SL86e4B0sXNwrIWgrQlAqI7q0s7T sX7lBuPXjzCP7mWbTYyDsahYMQ2dvkj4EaO1YPKmMcNXsoMwClfEpJH8sWNMmFxmAxy+ uoQwRxb62r2gqj6kXa3/5XiJPwonKPALOArtMcTYST4LdcA0r5KMayNhzkWgGD8t4fHR 5KeB9itv8xzg1nWK6VNnNZd2Ssqn19MlfHSUVucO1FyYgK8fI0GnlpuCeT8cDVoyFH7v 9dCN+A9pLhFsSEswHikKdJSxsdASUT+nmjXMwCUOcEER3DXXVS+tkbpB3wg0+FEU4fXx TcLw== X-Gm-Message-State: APjAAAXeRvHIPOsRLeFqlNOhy4rzARmcBElSXy3Z4Bn6bsXuEU4+lWGY sB+VeKK6bwmgx5wcco5WdCMFPrt4 X-Google-Smtp-Source: APXvYqwtu+Dxr/UD7BO9eOV9iaUtKlPMcFrLnV7f+z2pSNgKMZQb3VYU1fv9KsCYtdt/xCCJ1iiljA== X-Received: by 2002:a17:90a:bf02:: with SMTP id c2mr40896986pjs.73.1563330810068; Tue, 16 Jul 2019 19:33:30 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:29 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:00 +0800 Message-Id: <20190717023310.197246-2-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v14 01/11] qemu_thread: make qemu_thread_create() take Error ** argument X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , Paolo Bonzini , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li qemu_thread_create() abort()s on error. Not nice. Give it a return value and an Error ** argument, so it can return success/failure. Considering qemu_thread_create() is quite widely used in qemu, split this into two steps: this patch passes the &error_abort to qemu_thread_create() everywhere, and the next 10 patches will improve on &error_abort for callers who need. To differentiate callers who need the improvement, temporarily add the "TODO:" comment for them. Cc: Markus Armbruster Cc: Paolo Bonzini Signed-off-by: Fei Li Reviewed-by: Markus Armbruster Reviewed-by: David Gibson --- cpus.c | 23 +++++++++++++++-------- dump/dump.c | 3 ++- hw/misc/edu.c | 4 +++- hw/ppc/spapr_hcall.c | 4 +++- hw/rdma/rdma_backend.c | 3 ++- hw/usb/ccid-card-emulated.c | 5 +++-- include/qemu/thread.h | 6 +++--- io/task.c | 3 ++- iothread.c | 3 ++- migration/migration.c | 11 ++++++++--- migration/postcopy-ram.c | 4 +++- migration/ram.c | 12 ++++++++---- migration/savevm.c | 3 ++- tests/atomic64-bench.c | 3 ++- 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-char.c | 6 +++--- tests/test-rcu-list.c | 3 ++- tests/test-util-filemonitor.c | 2 +- ui/cocoa.m | 2 +- ui/vnc-jobs.c | 6 ++++-- util/compatfd.c | 6 ++++-- util/oslib-posix.c | 3 ++- util/qemu-thread-posix.c | 30 +++++++++++++++++++++++------- util/qemu-thread-win32.c | 13 ++++++++++--- util/rcu.c | 3 ++- util/thread-pool.c | 4 +++- 30 files changed, 121 insertions(+), 57 deletions(-) diff --git a/cpus.c b/cpus.c index 927a00aa90..28a241a936 100644 --- a/cpus.c +++ b/cpus.c @@ -1971,15 +1971,17 @@ static void qemu_tcg_init_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG", cpu->cpu_index); + /* TODO: let the callers handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_JOINABLE, &error_abort); } else { /* share a single thread for all cpus with TCG */ snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG"); + /* TODO: let the callers handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_tcg_rr_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_JOINABLE, &error_abort); single_tcg_halt_cond = cpu->halt_cond; single_tcg_cpu_thread = cpu->thread; @@ -2007,8 +2009,9 @@ static void qemu_hax_start_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX", cpu->cpu_index); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_JOINABLE, &error_abort); #ifdef _WIN32 cpu->hThread = qemu_thread_get_handle(cpu->thread); #endif @@ -2023,8 +2026,9 @@ static void qemu_kvm_start_vcpu(CPUState *cpu) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM", cpu->cpu_index); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_JOINABLE, &error_abort); } static void qemu_hvf_start_vcpu(CPUState *cpu) @@ -2041,8 +2045,9 @@ static void qemu_hvf_start_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF", cpu->cpu_index); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_JOINABLE, &error_abort); } static void qemu_whpx_start_vcpu(CPUState *cpu) @@ -2054,8 +2059,9 @@ static void qemu_whpx_start_vcpu(CPUState *cpu) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX", cpu->cpu_index); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE); + cpu, QEMU_THREAD_JOINABLE, &error_abort); #ifdef _WIN32 cpu->hThread = qemu_thread_get_handle(cpu->thread); #endif @@ -2070,8 +2076,9 @@ static void qemu_dummy_start_vcpu(CPUState *cpu) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY", cpu->cpu_index); - qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu, - QEMU_THREAD_JOINABLE); + /* TODO: let the further caller handle the error instead of abort() here */ + qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, &error_abort); } void qemu_init_vcpu(CPUState *cpu) diff --git a/dump/dump.c b/dump/dump.c index c7b2301652..1358e62fb7 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -2022,8 +2022,9 @@ void qmp_dump_guest_memory(bool paging, const char *file, if (detach_p) { /* detached dump */ s->detached = true; + /* TODO: let the further caller handle the error instead of abort() */ qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread, - s, QEMU_THREAD_DETACHED); + s, QEMU_THREAD_DETACHED, &error_abort); } else { /* sync dump */ dump_process(s, errp); diff --git a/hw/misc/edu.c b/hw/misc/edu.c index 3b6dba2c72..1edc66955a 100644 --- a/hw/misc/edu.c +++ b/hw/misc/edu.c @@ -29,6 +29,7 @@ #include "qemu/timer.h" #include "qemu/main-loop.h" /* iothread mutex */ #include "qemu/module.h" +#include "qapi/error.h" #include "qapi/visitor.h" #define TYPE_PCI_EDU_DEVICE "edu" @@ -370,8 +371,9 @@ static void pci_edu_realize(PCIDevice *pdev, Error **errp) qemu_mutex_init(&edu->thr_mutex); qemu_cond_init(&edu->thr_cond); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&edu->thread, "edu", edu_fact_thread, - edu, QEMU_THREAD_JOINABLE); + edu, QEMU_THREAD_JOINABLE, &error_abort); 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 6808d4cda8..d64b634526 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -508,8 +508,10 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, pending->shift = shift; pending->ret = H_HARDWARE; + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&pending->thread, "sPAPR HPT prepare", - hpt_prepare_thread, pending, QEMU_THREAD_DETACHED); + hpt_prepare_thread, pending, + QEMU_THREAD_DETACHED, &error_abort); spapr->pending_hpt = pending; diff --git a/hw/rdma/rdma_backend.c b/hw/rdma/rdma_backend.c index c39051068d..29f52955d0 100644 --- a/hw/rdma/rdma_backend.c +++ b/hw/rdma/rdma_backend.c @@ -281,7 +281,8 @@ static void start_comp_thread(RdmaBackendDev *backend_dev) ibv_get_device_name(backend_dev->ib_dev)); backend_dev->comp_thread.run = true; 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)(void *ctx, diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c index e20f8ed293..4d95ee07aa 100644 --- a/hw/usb/ccid-card-emulated.c +++ b/hw/usb/ccid-card-emulated.c @@ -545,10 +545,11 @@ static void emulated_realize(CCIDCardState *base, Error **errp) error_setg(errp, "%s: failed to initialize vcard", TYPE_EMULATED_CCID); goto out2; } + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread, - card, QEMU_THREAD_JOINABLE); + card, QEMU_THREAD_JOINABLE, &error_abort); qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread, - card, QEMU_THREAD_JOINABLE); + card, QEMU_THREAD_JOINABLE, &error_abort); return; diff --git a/include/qemu/thread.h b/include/qemu/thread.h index 55d83a907c..ec18d8b171 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, - void *(*start_routine)(void *), - void *arg, int mode); +int qemu_thread_create(QemuThread *thread, const char *name, + void *(*start_routine)(void *), + 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 64c4c7126a..1499540cdf 100644 --- a/io/task.c +++ b/io/task.c @@ -170,7 +170,8 @@ void qio_task_run_in_thread(QIOTask *task, "io-task-worker", qio_task_thread_worker, task, - QEMU_THREAD_DETACHED); + QEMU_THREAD_DETACHED, + &error_abort); } diff --git a/iothread.c b/iothread.c index 7130be58e3..2d5a5bfe6c 100644 --- a/iothread.c +++ b/iothread.c @@ -198,8 +198,9 @@ static void iothread_complete(UserCreatable *obj, Error **errp) */ name = object_get_canonical_path_component(OBJECT(obj)); thread_name = g_strdup_printf("IO %s", name); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&iothread->thread, thread_name, iothread_run, - iothread, QEMU_THREAD_JOINABLE); + iothread, QEMU_THREAD_JOINABLE, &error_abort); g_free(thread_name); g_free(name); diff --git a/migration/migration.c b/migration/migration.c index 8a607fe1e2..1786afb63d 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -483,8 +483,10 @@ static void process_incoming_migration_co(void *opaque) goto fail; } + /* TODO: let the further caller handle the error instead of abort() */ qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming", - colo_process_incoming_thread, mis, QEMU_THREAD_JOINABLE); + colo_process_incoming_thread, mis, + QEMU_THREAD_JOINABLE, &error_abort); mis->have_colo_incoming_thread = true; qemu_coroutine_yield(); @@ -2496,8 +2498,10 @@ static int open_return_path_on_source(MigrationState *ms, return 0; } + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&ms->rp_state.rp_thread, "return path", - source_return_path_thread, ms, QEMU_THREAD_JOINABLE); + source_return_path_thread, ms, + QEMU_THREAD_JOINABLE, &error_abort); trace_open_return_path_on_source_continue(); @@ -3342,8 +3346,9 @@ void migrate_fd_connect(MigrationState *s, Error *error_in) migrate_fd_cleanup(s); return; } + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&s->thread, "live_migration", migration_thread, s, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); s->migration_thread_running = true; } diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index 9faacacc9e..135e9cd746 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -1121,8 +1121,10 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis) } qemu_sem_init(&mis->fault_thread_sem, 0); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&mis->fault_thread, "postcopy/fault", - postcopy_ram_fault_thread, mis, QEMU_THREAD_JOINABLE); + postcopy_ram_fault_thread, mis, + QEMU_THREAD_JOINABLE, &error_abort); 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 2b0774c2bf..0f677f2d27 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -565,9 +565,10 @@ 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); + /* TODO: let the further caller handle the error instead of abort() */ qemu_thread_create(compress_threads + i, "compress", do_data_compress, comp_param + i, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); } return 0; @@ -1167,8 +1168,9 @@ 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; + /* TODO: let the further caller handle the error instead of abort() */ qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); } } @@ -1447,8 +1449,9 @@ bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp) p->num_packets = 1; p->running = true; + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); atomic_inc(&multifd_recv_state->count); return atomic_read(&multifd_recv_state->count) == migrate_multifd_channels(); @@ -3891,9 +3894,10 @@ 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; + /* TODO: let the further caller handle the error instead of abort() */ qemu_thread_create(decompress_threads + i, "decompress", do_data_decompress, decomp_param + i, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); } return 0; exit: diff --git a/migration/savevm.c b/migration/savevm.c index 79ed44d475..c792dee8aa 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1826,9 +1826,10 @@ 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); + /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(&mis->listen_thread, "postcopy/listen", postcopy_ram_listen_thread, NULL, - QEMU_THREAD_DETACHED); + QEMU_THREAD_DETACHED, &error_abort); qemu_sem_wait(&mis->listen_thread_sem); qemu_sem_destroy(&mis->listen_thread_sem); diff --git a/tests/atomic64-bench.c b/tests/atomic64-bench.c index 121a8c14f4..08ec753582 100644 --- a/tests/atomic64-bench.c +++ b/tests/atomic64-bench.c @@ -8,6 +8,7 @@ #include "qemu/thread.h" #include "qemu/host-utils.h" #include "qemu/processor.h" +#include "qapi/error.h" struct thread_info { uint64_t r; @@ -103,7 +104,7 @@ static void create_threads(void) info->r = (i + 1) ^ time(NULL); info->accesses = 0; qemu_thread_create(&threads[i], NULL, thread_func, info, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); } } diff --git a/tests/atomic_add-bench.c b/tests/atomic_add-bench.c index 5666f6bbff..52071585a9 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; @@ -108,7 +109,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 e3b512f26f..728c2e06c7 100644 --- a/tests/qht-bench.c +++ b/tests/qht-bench.c @@ -10,6 +10,7 @@ #include "qemu/qht.h" #include "qemu/rcu.h" #include "qemu/xxhash.h" +#include "qapi/error.h" struct thread_stats { size_t rd; @@ -248,7 +249,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-char.c b/tests/test-char.c index f9440cdcfd..093e26e333 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -793,7 +793,7 @@ static void char_socket_server_test(gconstpointer opaque) */ qemu_thread_create(&thread, "client", char_socket_server_client_thread, - addr, QEMU_THREAD_JOINABLE); + addr, QEMU_THREAD_JOINABLE, &error_abort); g_assert(data.event == -1); if (config->wait_connected) { @@ -901,7 +901,7 @@ static void char_socket_client_test(gconstpointer opaque) */ qemu_thread_create(&thread, "client", char_socket_client_server_thread, - ioc, QEMU_THREAD_JOINABLE); + ioc, QEMU_THREAD_JOINABLE, &error_abort); /* * Populate the chardev address based on what the server @@ -994,7 +994,7 @@ static void char_socket_client_test(gconstpointer opaque) reconnected = true; qemu_thread_create(&thread, "client", char_socket_client_server_thread, - ioc, QEMU_THREAD_JOINABLE); + ioc, QEMU_THREAD_JOINABLE, &error_abort); goto reconnect; } diff --git a/tests/test-rcu-list.c b/tests/test-rcu-list.c index 6f076473e0..399744f03c 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/tests/test-util-filemonitor.c b/tests/test-util-filemonitor.c index 46e781c022..a7a7c1eeeb 100644 --- a/tests/test-util-filemonitor.c +++ b/tests/test-util-filemonitor.c @@ -397,7 +397,7 @@ test_file_monitor_events(void) evstopping = 0; qemu_thread_create(&th, "event-loop", qemu_file_monitor_test_event_loop, NULL, - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); if (local_err) { g_printerr("File monitoring not available: %s", diff --git a/ui/cocoa.m b/ui/cocoa.m index c2984028c5..d8cf1484d9 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -1766,7 +1766,7 @@ int main (int argc, const char * argv[]) { qemu_sem_init(&app_started_sem, 0); qemu_thread_create(&thread, "qemu_main", call_qemu_main, - NULL, QEMU_THREAD_DETACHED); + NULL, QEMU_THREAD_DETACHED, &error_abort); COCOA_DEBUG("Main thread: waiting for display_init_sem\n"); qemu_sem_wait(&display_init_sem); diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c index 929391f85d..5712f1f501 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" /* @@ -339,7 +340,8 @@ void vnc_start_worker_thread(void) return ; q = vnc_queue_init(); - qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, q, - QEMU_THREAD_DETACHED); + /* TODO: let the further caller handle the error instead of abort() here */ + qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, + q, QEMU_THREAD_DETACHED, &error_abort); queue = q; /* Set global queue */ } diff --git a/util/compatfd.c b/util/compatfd.c index c296f55d14..caad10ae56 100644 --- a/util/compatfd.c +++ b/util/compatfd.c @@ -15,6 +15,7 @@ #include "qemu/osdep.h" #include "qemu/thread.h" +#include "qapi/error.h" #include @@ -87,8 +88,9 @@ 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); + /* TODO: let the further caller handle the error instead of abort() here */ + qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, + info, QEMU_THREAD_DETACHED, &error_abort); return fds[0]; } diff --git a/util/oslib-posix.c b/util/oslib-posix.c index fe0309ce7a..55c1b9c098 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -465,9 +465,10 @@ 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; + /* TODO: let the callers handle the error instead of abort() here */ qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", do_touch_pages, &memset_thread[i], - QEMU_THREAD_JOINABLE); + QEMU_THREAD_JOINABLE, &error_abort); addr += size_per_thread; numpages -= numpages_per_thread; } diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index 1bf5e65dea..06a9e78ba8 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,18 @@ static void *qemu_thread_start(void *args) return r; } -void qemu_thread_create(QemuThread *thread, const char *name, - void *(*start_routine)(void*), - void *arg, int mode) +/* + * Create a new thread with name @name + * The thread executes @start_routine() with argument @arg. + * The thread will be created in a detached state if @mode is + * QEMU_THREAD_DETACHED, and in a jounable state if it's + * QEMU_THREAD_JOINABLE. + * On success, return 0. + * On failure, store an error through @errp and return negative errno. + */ +int 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 +525,8 @@ void qemu_thread_create(QemuThread *thread, const char *name, err = pthread_attr_init(&attr); if (err) { - error_exit(err, __func__); + error_setg(errp, "pthread_attr_init failed"); + return -err; } if (mode == QEMU_THREAD_DETACHED) { @@ -538,13 +549,18 @@ void qemu_thread_create(QemuThread *thread, const char *name, err = pthread_create(&thread->thread, &attr, qemu_thread_start, qemu_thread_args); - - if (err) - error_exit(err, __func__); + if (err) { + error_setg(errp, "pthread_create failed"); + pthread_attr_destroy(&attr); + g_free(qemu_thread_args->name); + g_free(qemu_thread_args); + return -err; + } pthread_sigmask(SIG_SETMASK, &oldset, NULL); pthread_attr_destroy(&attr); + return 0; } void qemu_thread_get_self(QemuThread *thread) diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c index 572f88535d..f2deea5250 100644 --- a/util/qemu-thread-win32.c +++ b/util/qemu-thread-win32.c @@ -16,6 +16,7 @@ #include "qemu/thread.h" #include "qemu/notify.h" #include "qemu-thread-common.h" +#include "qapi/error.h" #include static bool name_threads; @@ -384,9 +385,9 @@ void *qemu_thread_join(QemuThread *thread) return ret; } -void qemu_thread_create(QemuThread *thread, const char *name, +int qemu_thread_create(QemuThread *thread, const char *name, void *(*start_routine)(void *), - void *arg, int mode) + void *arg, int mode, Error **errp) { HANDLE hThread; struct QemuThreadData *data; @@ -405,10 +406,16 @@ 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(errp, "failed to create win32_start_routine"); + g_free(data); + return -errno; } CloseHandle(hThread); thread->data = data; + return 0; } void qemu_thread_get_self(QemuThread *thread) diff --git a/util/rcu.c b/util/rcu.c index 177a675619..ff11837b47 100644 --- a/util/rcu.c +++ b/util/rcu.c @@ -31,6 +31,7 @@ #include "qemu/atomic.h" #include "qemu/thread.h" #include "qemu/main-loop.h" +#include "qapi/error.h" #if defined(CONFIG_MALLOC_TRIM) #include #endif @@ -324,7 +325,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 4ed9b89ab2..9a867776f9 100644 --- a/util/thread-pool.c +++ b/util/thread-pool.c @@ -21,6 +21,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); @@ -131,7 +132,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) From patchwork Wed Jul 17 02:33:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133058 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="GiDbxstR"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLtV6QSyz9s7T for ; Wed, 17 Jul 2019 12:33:54 +1000 (AEST) Received: from localhost ([::1]:53620 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlQ-0000e0-Nb for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:33:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52941) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlC-0000Ny-OA for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlA-00064U-Ds for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:38 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:40810) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZl9-00063D-V6 for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:36 -0400 Received: by mail-pf1-x443.google.com with SMTP id p184so10037427pfp.7 for ; Tue, 16 Jul 2019 19:33:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=D3obKT9rDhuzehgM7xHWUXMcx1FQLCDksitZUAA5kp0=; b=GiDbxstRs9s4CCyYamukJMdvF3AYM/XLXMVMTN2I1ajhvc8cMFhzrSl5rkNhxciDC6 x4/LepKTj39QK4KCNEbkwfp58ex7dHMM9YJnz00Q7kEPFV2FDwXt60O1uqHkyjRLegAY kE81q0pNUGp3tU0Z31/isbmz0IKrNBMWQImGRzFLi6LKGyGa/CxlBNhgJNvBKqagUclp ZIRMp4G8DZBwVNWQpHP6h13w3uka2z8VsmGXth1rjkk2XwW+MbkqskhLs4YHl0cZpgtB O/TL9agQnup4Zszl/V1VpU6xVaot8oFPRmsr8GFHsHP9TYySsz4xziOv5eGJ2uYvhdQs lr1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=D3obKT9rDhuzehgM7xHWUXMcx1FQLCDksitZUAA5kp0=; b=oz2TmwAppni8PQXUGH1/5qpx8w9EE67x04DR8bT2mgoSN5FmCXVLnjRACvVJ1dcaMP n1N4Fi27sxZfnwQgsg9rGQQs6BjS42QELdYwCDXveM1gLb4gX1MOgPfssR4BX5Ebridu OIB9ymvkdIpMvm0f+AWVeS2u82FOZp4RL/L1G7mhVBM/fRMox/45o/dtMzOY5na9OHsR p1uEDeDsHvj9jOnTFHRRCwmfb/Jb2Y6sBuf4T/XYDZc+EihU9UXSAowt6ZBODmv+PfhR sOiRs8T0qKB+SmW8zTJfF4a2KgBKDfvdTt9RwiHVIwypws+aipy3rYPz9tXNrjL3W5Tz ZO0g== X-Gm-Message-State: APjAAAUH0f2XwJ86EcgxXvgz1YjFBSMhfnccMxRe1I/NhV+3jRCgTE9T 9JfUBL6NWoBd8gt6LiDJbrRGmojL X-Google-Smtp-Source: APXvYqxrGLuHBAjvQARzj9PtArdh4d8WRklyHssrkbQjJmOyvEm5z+2xymrNWElPaT5GBMD68wQSAA== X-Received: by 2002:a17:90a:a489:: with SMTP id z9mr39098560pjp.24.1563330813540; Tue, 16 Jul 2019 19:33:33 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:32 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:01 +0800 Message-Id: <20190717023310.197246-3-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v14 02/11] qemu_thread: supplement error handling for qemu_X_start_vcpu X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , Paolo Bonzini , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li The callers of qemu_init_vcpu() already passed the **errp to handle errors. In view of this, add a new Error parameter to qemu_init_vcpu() and all qemu_X_start_vcpu() functions called by qemu_init_vcpu() to propagate the error and let the further callers check it. Besides, make qemu_init_vcpu() return a Boolean value to let its callers know whether it succeeds. Cc: Paolo Bonzini Signed-off-by: Fei Li Reviewed-by: Fam Zheng Reviewed-by: Juan Quintela Reviewed-by: Markus Armbruster ppc parts: Acked-by: David Gibson --- accel/tcg/user-exec-stub.c | 3 +- cpus.c | 74 +++++++++++++++++++++++------------------ include/qom/cpu.h | 2 +- target/alpha/cpu.c | 4 ++- target/arm/cpu.c | 4 ++- target/cris/cpu.c | 4 ++- target/hppa/cpu.c | 4 ++- target/i386/cpu.c | 4 ++- target/lm32/cpu.c | 4 ++- target/m68k/cpu.c | 4 ++- target/microblaze/cpu.c | 4 ++- target/mips/cpu.c | 4 ++- target/moxie/cpu.c | 4 ++- target/nios2/cpu.c | 4 ++- target/openrisc/cpu.c | 4 ++- target/ppc/translate_init.inc.c | 4 ++- target/riscv/cpu.c | 4 ++- target/s390x/cpu.c | 4 ++- target/sh4/cpu.c | 4 ++- target/sparc/cpu.c | 4 ++- target/tilegx/cpu.c | 4 ++- target/tricore/cpu.c | 4 ++- target/unicore32/cpu.c | 4 ++- target/xtensa/cpu.c | 4 ++- 24 files changed, 108 insertions(+), 55 deletions(-) diff --git a/accel/tcg/user-exec-stub.c b/accel/tcg/user-exec-stub.c index 4bf00b8496..215bd9eead 100644 --- a/accel/tcg/user-exec-stub.c +++ b/accel/tcg/user-exec-stub.c @@ -9,8 +9,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 28a241a936..c913bdc29e 100644 --- a/cpus.c +++ b/cpus.c @@ -1941,7 +1941,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; @@ -1971,17 +1971,20 @@ static void qemu_tcg_init_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG", cpu->cpu_index); - /* TODO: let the callers handle the error instead of abort() here */ - qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(cpu->thread, thread_name, + qemu_tcg_cpu_thread_fn, cpu, + QEMU_THREAD_JOINABLE, errp) < 0) { + return; + } } else { /* share a single thread for all cpus with TCG */ snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG"); - /* TODO: let the callers handle the error instead of abort() here */ - qemu_thread_create(cpu->thread, thread_name, - qemu_tcg_rr_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(cpu->thread, thread_name, + qemu_tcg_rr_cpu_thread_fn, cpu, + QEMU_THREAD_JOINABLE, errp) < 0) { + return; + } single_tcg_halt_cond = cpu->halt_cond; single_tcg_cpu_thread = cpu->thread; @@ -1999,7 +2002,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]; @@ -2009,15 +2012,16 @@ static void qemu_hax_start_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX", cpu->cpu_index); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp) < 0) { + return; + } #ifdef _WIN32 cpu->hThread = qemu_thread_get_handle(cpu->thread); #endif } -static void qemu_kvm_start_vcpu(CPUState *cpu) +static void qemu_kvm_start_vcpu(CPUState *cpu, Error **errp) { char thread_name[VCPU_THREAD_NAME_SIZE]; @@ -2026,12 +2030,11 @@ static void qemu_kvm_start_vcpu(CPUState *cpu) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM", cpu->cpu_index); - /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + cpu, QEMU_THREAD_JOINABLE, errp); } -static void qemu_hvf_start_vcpu(CPUState *cpu) +static void qemu_hvf_start_vcpu(CPUState *cpu, Error **errp) { char thread_name[VCPU_THREAD_NAME_SIZE]; @@ -2045,12 +2048,11 @@ static void qemu_hvf_start_vcpu(CPUState *cpu) snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF", cpu->cpu_index); - /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + cpu, QEMU_THREAD_JOINABLE, errp); } -static void qemu_whpx_start_vcpu(CPUState *cpu) +static void qemu_whpx_start_vcpu(CPUState *cpu, Error **errp) { char thread_name[VCPU_THREAD_NAME_SIZE]; @@ -2059,15 +2061,16 @@ static void qemu_whpx_start_vcpu(CPUState *cpu) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX", cpu->cpu_index); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn, + cpu, QEMU_THREAD_JOINABLE, errp) < 0) { + return; + } #ifdef _WIN32 cpu->hThread = qemu_thread_get_handle(cpu->thread); #endif } -static void qemu_dummy_start_vcpu(CPUState *cpu) +static void qemu_dummy_start_vcpu(CPUState *cpu, Error **errp) { char thread_name[VCPU_THREAD_NAME_SIZE]; @@ -2076,12 +2079,11 @@ static void qemu_dummy_start_vcpu(CPUState *cpu) qemu_cond_init(cpu->halt_cond); snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY", cpu->cpu_index); - /* TODO: let the further caller handle the error instead of abort() here */ qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, - cpu, QEMU_THREAD_JOINABLE, &error_abort); + cpu, QEMU_THREAD_JOINABLE, errp); } -void qemu_init_vcpu(CPUState *cpu) +bool qemu_init_vcpu(CPUState *cpu, Error **errp) { MachineState *ms = MACHINE(qdev_get_machine()); @@ -2089,6 +2091,7 @@ void qemu_init_vcpu(CPUState *cpu) cpu->nr_threads = ms->smp.threads; cpu->stopped = true; cpu->random_seed = qemu_guest_random_seed_thread_part1(); + Error *local_err = NULL; if (!cpu->as) { /* If the target cpu hasn't set up any address spaces itself, @@ -2099,22 +2102,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 5ee0046b62..37f2d3dad5 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -1021,7 +1021,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 b3fd6643e8..84c9b517c8 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 1959467fdc..8b9c186780 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -1610,7 +1610,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 7adfd6caf4..229928ae72 100644 --- a/target/cris/cpu.c +++ b/target/cris/cpu.c @@ -135,7 +135,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 71b6aca45d..11837dc4f9 100644 --- a/target/hppa/cpu.c +++ b/target/hppa/cpu.c @@ -99,7 +99,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 805ce95247..004910ab93 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5377,7 +5377,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 b35537de62..503b75b32b 100644 --- a/target/lm32/cpu.c +++ b/target/lm32/cpu.c @@ -134,7 +134,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 e6596de29c..28b28cfb5c 100644 --- a/target/m68k/cpu.c +++ b/target/m68k/cpu.c @@ -232,7 +232,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 0bec54b2f8..610bff082d 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 39eafafc5c..0b3aeba140 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 48996d0554..bb2df19a08 100644 --- a/target/moxie/cpu.c +++ b/target/moxie/cpu.c @@ -65,7 +65,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 ca9c7a6df5..2b5091071c 100644 --- a/target/nios2/cpu.c +++ b/target/nios2/cpu.c @@ -92,7 +92,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 f19e482a55..28d448396b 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 86fc8f2e31..63a75dc115 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -9843,7 +9843,9 @@ static void ppc_cpu_realize(DeviceState *dev, Error **errp) gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg, pcc->gdb_num_sprs, "power-spr.xml", 0); #endif - qemu_init_vcpu(cs); + if (!qemu_init_vcpu(cs, errp)) { + goto unrealize; + } pcc->parent_realize(dev, errp); diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index f8d07bd20a..24fa555db7 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -412,7 +412,9 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) riscv_cpu_register_gdb_regs_for_features(cs); - qemu_init_vcpu(cs); + if (!qemu_init_vcpu(cs, errp)) { + return; + } cpu_reset(cs); mcc->parent_realize(dev, errp); diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c index 736a7903e2..98ffd2767c 100644 --- a/target/s390x/cpu.c +++ b/target/s390x/cpu.c @@ -226,7 +226,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 816d6d7f31..dc67833e3a 100644 --- a/target/sh4/cpu.c +++ b/target/sh4/cpu.c @@ -186,7 +186,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 ee60a5536a..1a584b3404 100644 --- a/target/sparc/cpu.c +++ b/target/sparc/cpu.c @@ -768,7 +768,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 69971247f2..750b6fd110 100644 --- a/target/tilegx/cpu.c +++ b/target/tilegx/cpu.c @@ -93,7 +93,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 df807c1d74..1d0853c3f4 100644 --- a/target/tricore/cpu.c +++ b/target/tricore/cpu.c @@ -95,7 +95,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 802e2f1eba..4a3da5f900 100644 --- a/target/unicore32/cpu.c +++ b/target/unicore32/cpu.c @@ -95,7 +95,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 76db1741a7..46a15f0df5 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); } From patchwork Wed Jul 17 02:33:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133065 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UeqOG9GS"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLvt3Vlkz9sLt for ; Wed, 17 Jul 2019 12:35:06 +1000 (AEST) Received: from localhost ([::1]:53654 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZma-0005Wz-0g for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:35:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52949) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlD-0000PO-2w for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlC-000667-5y for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:39 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:41617) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlC-00065Y-06 for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:38 -0400 Received: by mail-pl1-x642.google.com with SMTP id m9so11065451pls.8 for ; Tue, 16 Jul 2019 19:33:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=e/myvR8UUqBBLg5JmLrRZ1lh6zWyj3aqESVQCWDzo60=; b=UeqOG9GStswvomrQRyq/EmfU8c4b6IdmhENzogOP7kjzol+Y0Y11dmkJbukWAXHlB3 Kv6zwvY3A9UWRfvfO8zxxEIv7EnEqOF6fcBkeJCP69MvWdxqXDT5CGNVU0hDOUWE9fCU KzsHrjJLTeSEo5TwfmCL7MygbsMfG5NCGtIDfsW/zfnczvUmfXYBDwEPzX9mfsbpctHM Z7qxNrpFkKtog58f4R1/eHqMvgSNEIl9RzKw/6814HnFNTUqLuc26LFy6Z41y188FGgq CCHbwFwmqd/8IX3cqKPiuQyi0Fsov17vjfXdGOTX2bHPlAdbRzZ37rPjlJ1waW7sbujv VnSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=e/myvR8UUqBBLg5JmLrRZ1lh6zWyj3aqESVQCWDzo60=; b=iF977RxjFum2N2bHR+Ut+1a6eZDmuIzeGbXDhTJmG82ppzLXyU6PG1/13Gaes7Al1V pcaWqa85rcRMPyqDYPb6pY1RWPjRbg1oTH77uPLZYUiQ7qqM0Y/Ir1L0tNPZCp52jzbC hYoiNgMNs+G3swOJA/3VbFBQb5Y5FKesKmEHcwbML9klidCR0jQLAP7GtMfeYHe+uRig NqIlom+9LDkdU7uXkBJnmf6DHPWEP/xfTlT4BUQZyzt59/rDHr4SSBqlRbwxFLt4bzZb JeGGW4GFque3voAqp+c5eL8KVIs3K459BbEUaO99FMiyQblrtZ9btzSQqm11ASEVXjH7 e3mg== X-Gm-Message-State: APjAAAX6ZvupbUmiNMSUSUfbarzG15wa8+pzVaXcWyEZdSk54o3rftEb UwM2xhachONJPo2cYm+ihN8PPSQT X-Google-Smtp-Source: APXvYqzd8GxjqssTpvMl4775NVKE5Kz7cvEIFaeswlfrGNV+a/3t8puPAtVhWnNOSrv6Wz0Ffq4jDQ== X-Received: by 2002:a17:902:b603:: with SMTP id b3mr40327360pls.9.1563330816769; Tue, 16 Jul 2019 19:33:36 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:36 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:02 +0800 Message-Id: <20190717023310.197246-4-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 Subject: [Qemu-devel] [PATCH v14 03/11] qemu_thread: supplement error handling for qmp_dump_guest_memory X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Utilize the existed errp to propagate the error instead of the temporary &error_abort. Cc: Markus Armbruster Cc: Marc-André Lureau Signed-off-by: Fei Li Reviewed-by: Markus Armbruster --- dump/dump.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dump/dump.c b/dump/dump.c index 1358e62fb7..07a983cf4c 100644 --- a/dump/dump.c +++ b/dump/dump.c @@ -2022,9 +2022,8 @@ void qmp_dump_guest_memory(bool paging, const char *file, if (detach_p) { /* detached dump */ s->detached = true; - /* TODO: let the further caller handle the error instead of abort() */ qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread, - s, QEMU_THREAD_DETACHED, &error_abort); + s, QEMU_THREAD_DETACHED, errp); } else { /* sync dump */ dump_process(s, errp); From patchwork Wed Jul 17 02:33:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133062 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="f/51wm0o"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLvM4cPbz9s7T for ; Wed, 17 Jul 2019 12:34:39 +1000 (AEST) Received: from localhost ([::1]:53638 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZm9-0003cQ-8A for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:34:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52997) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlG-0000d2-Mp for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlF-00069C-MZ for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:42 -0400 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]:39834) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlF-00068T-GV for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:41 -0400 Received: by mail-pg1-x544.google.com with SMTP id u17so10369559pgi.6 for ; Tue, 16 Jul 2019 19:33:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=giSB4Ucoh3BMg4F8CjK3a1ECxOO/Z7JkMiX8m5yVGtE=; b=f/51wm0oZoms9b5O0WaTRS+Qc26r2WG3ixLaYATK/V1p6jQ7zpo3WseP43RiQZlopp /zzFmmtM9XDpwncklTOdIzf9Hm07nHv4aAwpoDst0bExRMvJkOYr4gkD5hIBtIoY8w+d otdc5Dx9eNXzSw4aVmkg4gIRhd6ByJqCT/SheWQrNV8ttz0AzCEiZ1FZ1eUH9yADu21/ xC4CNBWLnO81K3YKkScd58Doq2t3VePflUXWwYU6yqB11hUzcssxHG1aXoIxyCsGVjs/ BWp08hUN1zCRXe5Nc9yDWt7PwD0gxzbXnN/oaaH0VUi8P2mf2OW7r1L7deoHRjIshIpc J9HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=giSB4Ucoh3BMg4F8CjK3a1ECxOO/Z7JkMiX8m5yVGtE=; b=R7bQsfSheT/kv3zkO9QK3q9eUv5H2x8aU2EVhfsVWsdfdw+q7qt/bsIxLeNvP3NR7C XeRZoO0Umi7HsqLZIp0zwphUt8sfgQho2KPM9QgznoJ+jD5GpQ9E23TP14m5/rQWMk6O 9Yg8J5oVxY2JX8M2uxlzjkOjIyhpA29sADaE/smepZLDZsOA4DnKcdKXZdv7P1y4+KMb bPhOIMeyUuVAYs3nKIzIS8d2nYLnsgmAxmFKrSIgpZRDjBW7uZ2r8nz8JE0Fq1lZ4FfK FyLlKTDCFtsNLI1bONb6WId1kv5mRaJUy/BnTOQDjWCflL/oau8cveixE6iV2OcsjNtZ j+4g== X-Gm-Message-State: APjAAAX2lqeaLLynTwLHl8qlIXshTSdz72vU+HZ2SvzblL+na/ivkP8b rK2C3xfcX9EOLP8pMKd1FcaEtchk X-Google-Smtp-Source: APXvYqzIhrdHKgfc9k/0hF/BuyPWMa4K+iO50xdokyULC/oxqCZxariiNn7TCVaHAk/Vy6CtT/hG1A== X-Received: by 2002:a17:90a:30e4:: with SMTP id h91mr39036719pjb.37.1563330820297; Tue, 16 Jul 2019 19:33:40 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:39 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:03 +0800 Message-Id: <20190717023310.197246-5-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::544 Subject: [Qemu-devel] [PATCH v14 04/11] qemu_thread: supplement error handling for pci_edu_realize X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jiri Slaby , Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Utilize the existed errp to propagate the error and do the corresponding cleanup to replace the temporary &error_abort. Cc: Markus Armbruster Cc: Jiri Slaby Signed-off-by: Fei Li Reviewed-by: Markus Armbruster --- hw/misc/edu.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/hw/misc/edu.c b/hw/misc/edu.c index 1edc66955a..632b56f64c 100644 --- a/hw/misc/edu.c +++ b/hw/misc/edu.c @@ -371,9 +371,14 @@ static void pci_edu_realize(PCIDevice *pdev, Error **errp) qemu_mutex_init(&edu->thr_mutex); qemu_cond_init(&edu->thr_cond); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&edu->thread, "edu", edu_fact_thread, - edu, QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&edu->thread, "edu", edu_fact_thread, + edu, QEMU_THREAD_JOINABLE, errp) < 0) { + qemu_cond_destroy(&edu->thr_cond); + qemu_mutex_destroy(&edu->thr_mutex); + timer_del(&edu->dma_timer); + msi_uninit(pdev); + return; + } memory_region_init_io(&edu->mmio, OBJECT(edu), &edu_mmio_ops, edu, "edu-mmio", 1 * MiB); From patchwork Wed Jul 17 02:33:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133061 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="PHMhxfnA"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLv43f6Zz9sLt for ; Wed, 17 Jul 2019 12:34:24 +1000 (AEST) Received: from localhost ([::1]:53630 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlu-0002Vw-82 for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:34:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53024) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlK-0000vl-RY for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlJ-0006CM-Pc for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:46 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:40812) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlJ-0006C9-Ji for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:45 -0400 Received: by mail-pf1-x442.google.com with SMTP id p184so10037688pfp.7 for ; Tue, 16 Jul 2019 19:33:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wPqs8L4AEA0rcGYgmc6N0qNsLBP0T+Vh12xM4e8iNf0=; b=PHMhxfnA0KdpMf6rxJlb/kMjukfX5Fxh6SEa5x3lOnkoBykm9OMcTmlD0HqKSd2oPf QMWUVTdIo0FYcBCb6YqQE2H9LtW0aMT2AkAbQG9xhQcrOE0N+KDlV87WuzTqevkCmiUC gpHCKNsbguZfOsI0RpGhGZvWc270C2YVJqAqruHw9G5mQWKMLUC2Wvgbq0Hqb7lRIUti lyPPaKgmJSc5LcDKk0ZesiHvanzYfWc5elI3GzFIdO8JejgmKdYaiUaKaltYhrKYMU7D jS7r++5w6qhxCrH8O/PBUnH7Rsb8i8txPgPSkZJRuytI6On8sB+VEvNItQx7pk6jPOje Tkkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wPqs8L4AEA0rcGYgmc6N0qNsLBP0T+Vh12xM4e8iNf0=; b=eHoVqJ3ASnNkXgRVG1Helvq/2dnk5pkTaW6Liofxv9dRKPgLQyvwQiqF5qNxhHqzH7 OJeU2BIELro4ay1S4AUx3JYVm3VqxmNGwSldmawUnj36x6tHZ/ZjSpziOiH5iz9C9c5S 4KN/t/Hh12eUvDTfxpCRmUR/cCNmok7uv1vqJwb8GjpzcdJg+sCi8XMatQ+n/9V7ABoE NuQowqZuTDMJJapN0GNcBmOZL8cD6kCgwSGCtVybxTsXKLYjGxcUVi1TD5obIpkDbwoI 8FoiIEzTNhJBSHf1PQ7V63X1QDrc3+DkUOq80TzslT1C844ddCzlLPcCD4mqNf9Tl7dx nQVg== X-Gm-Message-State: APjAAAUDBsPfFm8x261C0hi+0qOO+QvghcCKUyTgAkvfUA6IEP0hMM8A Db+eBzspuw00aKhAloiQ6lEjBFih X-Google-Smtp-Source: APXvYqxEV2u/v/IBFX7RU0658qeRULWsM5fDxflLiY9dwodedPIWceeDzlErfTac4GfBkdencRxjQQ== X-Received: by 2002:a17:90a:8c92:: with SMTP id b18mr39831215pjo.97.1563330824296; Tue, 16 Jul 2019 19:33:44 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:43 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:04 +0800 Message-Id: <20190717023310.197246-6-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v14 05/11] qemu_thread: supplement error handling for h_resize_hpt_prepare X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Add a local_err to hold the error, and return the corresponding error code to replace the temporary &error_abort. Cc: Markus Armbruster Cc: David Gibson Signed-off-by: Fei Li Acked-by: David Gibson Reviewed-by: Markus Armbruster --- hw/ppc/spapr_hcall.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index d64b634526..c9de3c0204 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -448,6 +448,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; @@ -508,10 +509,13 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, pending->shift = shift; pending->ret = H_HARDWARE; - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&pending->thread, "sPAPR HPT prepare", - hpt_prepare_thread, pending, - QEMU_THREAD_DETACHED, &error_abort); + if (qemu_thread_create(&pending->thread, "sPAPR HPT prepare", + hpt_prepare_thread, pending, + QEMU_THREAD_DETACHED, &local_err) < 0) { + error_reportf_err(local_err, "failed to create hpt_prepare_thread: "); + g_free(pending); + return H_HARDWARE; + } spapr->pending_hpt = pending; From patchwork Wed Jul 17 02:33:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133059 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VgTY3C5F"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLtl05Z6z9sLt for ; Wed, 17 Jul 2019 12:34:07 +1000 (AEST) Received: from localhost ([::1]:53624 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlc-0001Pa-PV for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:34:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53055) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlO-0001BS-7h for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlN-0006Er-6s for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:50 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]:43261) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlN-0006EN-16 for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:49 -0400 Received: by mail-pf1-x442.google.com with SMTP id i189so10041848pfg.10 for ; Tue, 16 Jul 2019 19:33:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0e/ngLNRrmzCNyqP64QJRvjo9UERFAOaH0yurKB6MKM=; b=VgTY3C5FlBFNP+zsNZptHLjdSr7Bm7rJIgpOJipQqkimKQfIygNwZ9Z7p/fZT4yTj1 cs8PIbmiN0P7WgdYbeNWjrmzeUzWXNLI2pqmMerMXoZd8Xyqyi0s3d35zNFku5oFAS7C xnmxxae6+nMWJkdKMM+z7TUxT13+KQcKYmazM1EVx7Y/GX16ReCeh8CYAWVUotB7vH0O bYojWkJnF3OD9btXxsx7+1Ztl01try/XVStZCAla6OZ3UJX0aoLF2Tp1KspPrmTt4g2Z V/D6XAlISlyqmklPFS1T+HQgXK6hr2QScG5+W/3vilVsasDkov1+byb8RoOO+ArHQmF4 rK2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0e/ngLNRrmzCNyqP64QJRvjo9UERFAOaH0yurKB6MKM=; b=pXDnokEBJyiHQbW3awQT3p/ObGOa8jRpVeLQLCkYS8hP+DrtoSY6yeiAmVK+RZJkPW VwDhNL5SCp5dzA8t7R1QpclksG5DDmiYs6RINFRjkgsfwKvBcL64uAfcZC6b3p+WdObC VgwQjRhKoBCXnO6IxqyRKnyXnhL0vn7Ipzsv1x6WJv0l+TdO2ajhkxlO/MGAipSnnM4B 6x3CAsyVWl3ywgrSo3DprxtVh1+/5jBUZ9edJ6NjGT5Lr62D5GHxIsxS7QEAUmvgh2vH naZuY7xYdGbovcD5vuXzPGlJlreL5ma5sE7RHUPYoNfDFeT18jy4b21f+ATxzlh7Cte/ Bu+g== X-Gm-Message-State: APjAAAWWSUD/9UWiGpywq9GHzXc8AiT3AJwPToV/hMO+woYHBtKqlUH8 VcFcKmSGPb5HP+KUB0+pByYWZLBK X-Google-Smtp-Source: APXvYqwThnvZOBaddq+r3mDPCL8uVk7NraVd+t0OgZQw75Lxm+c4AN/CJ3QYpT8nTi6TBia6IJX4UQ== X-Received: by 2002:a17:90a:346c:: with SMTP id o99mr39834390pjb.20.1563330827879; Tue, 16 Jul 2019 19:33:47 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:46 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:05 +0800 Message-Id: <20190717023310.197246-7-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::442 Subject: [Qemu-devel] [PATCH v14 06/11] qemu_thread: supplement error handling for emulated_realize X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Christophe Fergeau , Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Utilize the existed errp to propagate the error and do the corresponding cleanup to replace the temporary &error_abort. If the second thread fails to be created, use a VEvent to cancel the first thread before the join(). Cc: Markus Armbruster Cc: Gerd Hoffmann Cc: Christophe Fergeau Cc: Marc-André Lureau Signed-off-by: Fei Li --- hw/usb/ccid-card-emulated.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c index 4d95ee07aa..bdf1971e6b 100644 --- a/hw/usb/ccid-card-emulated.c +++ b/hw/usb/ccid-card-emulated.c @@ -545,11 +545,18 @@ static void emulated_realize(CCIDCardState *base, Error **errp) error_setg(errp, "%s: failed to initialize vcard", TYPE_EMULATED_CCID); goto out2; } - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread, - card, QEMU_THREAD_JOINABLE, &error_abort); - qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread, - card, QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread, + card, QEMU_THREAD_JOINABLE, errp) < 0) { + goto out2; + } + if (qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", + handle_apdu_thread, card, + QEMU_THREAD_JOINABLE, errp) < 0) { + VEvent *vevent = vevent_new(VEVENT_LAST, NULL, NULL); + vevent_queue_vevent(vevent); /* stop vevent thread */ + qemu_thread_join(&card->event_thread_id); + goto out2; + } return; From patchwork Wed Jul 17 02:33:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133064 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AwCpgJ1j"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLvt36QLz9s7T for ; Wed, 17 Jul 2019 12:35:06 +1000 (AEST) Received: from localhost ([::1]:53652 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZma-0005UL-1J for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:35:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53087) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlS-0001S2-6s for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlR-0006Hq-5A for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:54 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:39835) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlQ-0006HI-Ud for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:53 -0400 Received: by mail-pg1-x542.google.com with SMTP id u17so10369854pgi.6 for ; Tue, 16 Jul 2019 19:33:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VM7YAJwry+wyZ2yuE+WkugvtQMJfdLiPFMhwqCS6SXA=; b=AwCpgJ1jy+igCKsUWWOo+oZNqPZgx31GZusSNWrwJpHO6kHb+xE5oWBxgqncc7INiC inryyUtPHeUBUmFWbu5gYzyw3SP2izEyK5UJGnaKMtav26WacuVlVOQCDNhdHvxAUs8J mQIGQ+zfgF26CwZbiPlus1j7Q6qvRz4dr3ow2UW1V+tBJNPcTSRK+gaxyxkw07ILEVgq f3s+9034EVU3MJ5lPIAZW8MQhaWaBwQ68QwD+zgB2RgwofJrD+dKUX9Qalfldtdu6UP5 Vu1DzRlZ3/63CmVHxzTJjX1GSh3G34b1jJYvE9SBYRi2XUz8eFaKf97WlN2CJ4Zr/yS7 E3FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VM7YAJwry+wyZ2yuE+WkugvtQMJfdLiPFMhwqCS6SXA=; b=bdklQZ2JfG3HFT9rjRRLpznTd27flR3bgP5tmCk+rnAJULzqw4STfCZ1pVkatkCfmB 5OazCIYRlbCEoCXVR3yZMRu+kjRN6hcWn+iMHcMaQ0+2JwxjYet3X3xVsR39Pf0YbHp7 77xV/kJhxl9Cmqo7nvBZKZbIhLSskXza11UxzlK5zqv3R9jLfAV/aWKf+ChZLh8/fWO7 OriNyLD7CdP3neoWjgLXr8xJLMQSZLzVcxDCm3Vuoe5zbotOmpvtXfrp5xyLYKBi9RA+ 0fzgs7kdCoDcwazMKZ98or4kiw6lRKBb2N4UICgRcUDJ9cm3kpKosKaaunXT5qTB7xOK wgNA== X-Gm-Message-State: APjAAAWkkyqIJKMKDmUOImZs1CNsdABlkzxRBxuaHJnHC60VEa2cCC9h Sc8dhwWEKQpMxC4c7eSRPbmr4hJ3 X-Google-Smtp-Source: APXvYqx52Lkfej/uv7TQ0xluHXOfs3fh8G8OLSMq4JZQ3RDPh0ms84JK2QeUZUCL3YN4oE4u1L8iDg== X-Received: by 2002:a65:4103:: with SMTP id w3mr25808719pgp.1.1563330831645; Tue, 16 Jul 2019 19:33:51 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:50 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:06 +0800 Message-Id: <20190717023310.197246-8-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 Subject: [Qemu-devel] [PATCH v14 07/11] qemu_thread: supplement error handling for iothread_complete X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , Stefan Hajnoczi , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Utilize the existed errp to propagate the error and do the corresponding cleanup to replace the temporary &error_abort. Cc: Markus Armbruster Cc: Stefan Hajnoczi Cc: Eric Blake Signed-off-by: Fei Li Reviewed-by: Markus Armbruster --- iothread.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/iothread.c b/iothread.c index 2d5a5bfe6c..1ebacaf089 100644 --- a/iothread.c +++ b/iothread.c @@ -166,6 +166,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp) Error *local_error = NULL; IOThread *iothread = IOTHREAD(obj); char *name, *thread_name; + int thread_ok; iothread->stopping = false; iothread->running = true; @@ -188,9 +189,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; } /* This assumes we are called from a thread with useful CPU affinity for us @@ -198,16 +197,23 @@ static void iothread_complete(UserCreatable *obj, Error **errp) */ name = object_get_canonical_path_component(OBJECT(obj)); thread_name = g_strdup_printf("IO %s", name); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&iothread->thread, thread_name, iothread_run, - iothread, QEMU_THREAD_JOINABLE, &error_abort); + thread_ok = qemu_thread_create(&iothread->thread, thread_name, iothread_run, + iothread, QEMU_THREAD_JOINABLE, errp); g_free(thread_name); g_free(name); + if (thread_ok < 0) { + qemu_sem_destroy(&iothread->init_done_sem); + goto fail; + } /* Wait for initialization to complete */ while (iothread->thread_id == -1) { qemu_sem_wait(&iothread->init_done_sem); } + return; +fail: + aio_context_unref(iothread->ctx); + iothread->ctx = NULL; } typedef struct { From patchwork Wed Jul 17 02:33:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133067 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="jF1E10oA"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLwb74jPz9s7T for ; Wed, 17 Jul 2019 12:35:43 +1000 (AEST) Received: from localhost ([::1]:53674 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZnB-0000MS-UK for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:35:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53107) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlV-0001eb-DF for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlU-0006K8-9r for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:57 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:40200) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlU-0006JX-42 for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:56 -0400 Received: by mail-pl1-x641.google.com with SMTP id a93so11102121pla.7 for ; Tue, 16 Jul 2019 19:33:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zYeWHhuJyr6C57qu/O6Tfde/UDD5ubrHcW5il7tqHN0=; b=jF1E10oAX2REYrHcFCGzd/yfpWFDc0GP8R9N6kKgp39rBfc2rEzrH0CI9ISXzVE/yp Xmuw094VToo7TtbcQnNqjOd4DmV/2Fe/H0PYqR4g7Gj7Y6m3Yvo8PWZXVZl0Lpou6NiK SUquIM/mgOImmi1kbfgZqBqSGGEwmo66ujCwlIOxP8yLgCwsob/zwmAmPCcqdGO+TFKW tz0FcPEDJ6QH3ewr96KshaGNrp1jYrseFHJNhOjAEgAlIYYFhanVVHDCfYtKpSAF/xRC 5SwbMHYUpH18CLdmvm7FbwEBL0so40VAXpYsggjISpucKJcGhlMjo55NnqxkiLKQ45mJ RNDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zYeWHhuJyr6C57qu/O6Tfde/UDD5ubrHcW5il7tqHN0=; b=V3RnDMUx0QKtwO0dhIkIGvtfdNx6YRBPWDOOH3B17Ecgkd6LMLPjQ9XDWPsoGIOmNB TUoQSuWQm2efDLmkqLCW77lLQYr6kihShYv+C4OLuubpoLyYgt8PEEO6x+3d5gFuCKmT TO263S/9QCL6QZk3wy/Qm36NGzyd8th8uKRPosl3p06s2/tVZZIp2D8RtgnBSq4HgvUx zDwTVTStEAGsh3lq2d4JiEb5GgrR9Rp7PrJFC/kn3g9Q9M13mTx7A/XVDXG0KDoafnGz p1f+QFaqbtpykfRsP+iai2DSE6aglbqyx9EQj9MmsqDRXCdyltw7RJ5XjU5k8lRS57I0 G8WA== X-Gm-Message-State: APjAAAVEx4hH3q642ImUyfP+lYIKi0iAMZMj9/zipmWH26LcauPnd9so 8AwrVotFoxiQdD8R9mvXwvwTQWjG X-Google-Smtp-Source: APXvYqzfHE4Veq5xUBRVaH3akALkmxIX2GRgX7A1PlM86NtrsKBeCBFKoSy/8tDVFZgEcoilAQL0hw== X-Received: by 2002:a17:902:2d01:: with SMTP id o1mr40535538plb.105.1563330834806; Tue, 16 Jul 2019 19:33:54 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:53 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:07 +0800 Message-Id: <20190717023310.197246-9-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 Subject: [Qemu-devel] [PATCH v14 08/11] qemu_thread: supplement error handling for qemu_signalfd_compat X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Gerd Hoffmann , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Set errno, do some cleanup, and return -1 to replace the temporary &error_abort when failing to create sigwait_compat. Cc: Markus Armbruster Cc: Eric Blake Signed-off-by: Fei Li Reviewed-by: Markus Armbruster --- util/compatfd.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/util/compatfd.c b/util/compatfd.c index caad10ae56..bd15464586 100644 --- a/util/compatfd.c +++ b/util/compatfd.c @@ -70,6 +70,7 @@ static int qemu_signalfd_compat(const sigset_t *mask) struct sigfd_compat_info *info; QemuThread thread; int fds[2]; + int ret; info = malloc(sizeof(*info)); if (info == NULL) { @@ -88,9 +89,15 @@ static int qemu_signalfd_compat(const sigset_t *mask) memcpy(&info->mask, mask, sizeof(*mask)); info->fd = fds[1]; - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, - info, QEMU_THREAD_DETACHED, &error_abort); + ret = qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, + info, QEMU_THREAD_DETACHED, NULL); + if (ret < 0) { + close(fds[0]); + close(fds[1]); + free(info); + errno = -ret; + return -1; + } return fds[0]; } From patchwork Wed Jul 17 02:33:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133063 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="PDCAcrvr"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLvd0tmTz9s7T for ; Wed, 17 Jul 2019 12:34:53 +1000 (AEST) Received: from localhost ([::1]:53644 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZmM-0004Jz-Mj for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:34:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53140) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlZ-0001wh-Nd for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlX-0006OI-Rw for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:01 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:33002) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlX-0006NB-JZ for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:33:59 -0400 Received: by mail-pf1-x443.google.com with SMTP id g2so10055865pfq.0 for ; Tue, 16 Jul 2019 19:33:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WaJvV1QSsXcUg2IhvinOwCmvPU+3lsp5AGmaZZULkrU=; b=PDCAcrvrC6ZHRXYQAG+7vzqR0yyX6Cu5XsBp8K2BdVbNzy+Ug6gyuQLFbhGhEgqw0u JE7UooivmL6qqqKq1ps7ZBUwpC2Zt7CbJ2b/3NTnf+WMla+X5DF+gB2KWkz9WmdnHRVw Bn2Qjr1exFYOs+GRK4kjLPr4HtrrkvwgFZs1xwQSXEfNdbY5PWRPnVc7j+XBKIUs5XhZ ts89Hyj1VkzvjjZajTgg9Pq7kleY+9SKajI7OQNKxjsuKuW81TDqd1inFvmhSmjT+UXt MeGGk/hE7zJL5tN1s2QEHQwRBUc8482babFK9dBQCI8PzETH1d500tZDfOUFUYzUsDJK Qcuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WaJvV1QSsXcUg2IhvinOwCmvPU+3lsp5AGmaZZULkrU=; b=dG1jUgcHykPaaT4Ly4N4IkDOYacioSM4LblMRFDX5/4Y/fFCWG5M/5D1t1l1rMmAAX +2ARgq26E0PPExl7mTmkbHTnW5akindlHvrVfwqZwXflxANDEycUCV/hXtTGtGsMUm3W qHRsgLiQNyglJHV+EDpZO4E+CrJKzXR/ac28q5xFtsZkaD7KOv2XRqhHqvExc+9VNDF6 gstgAq0h93S10mUm79GHQEq2VAhvIj7DkFBXApd30l786vppp+F8wSPvqco+0Z1YhJR9 MJNZvTnB0Z1ropCyRT29SPhbfnzelCJFF9b1azliApSDAEQopkujMLIh7b1OCusoSYHL XcfQ== X-Gm-Message-State: APjAAAXMJ168Wk+fELb97gMTjHG7qRChQMOWfy+vhNllXpzp1CqJXGzq 693PKZJjmyE4YLX5qPPs2WUJjguj X-Google-Smtp-Source: APXvYqwNbc1WcTErV8qEYZUi2IUq2XvW5SXBZs5pcdoj8oOTeaMzQYmixeqEZ4k+1Y5mzlVvuKcqJg== X-Received: by 2002:a63:755e:: with SMTP id f30mr38021112pgn.246.1563330838273; Tue, 16 Jul 2019 19:33:58 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:33:57 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:08 +0800 Message-Id: <20190717023310.197246-10-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH v14 09/11] qemu_thread: supplement error handling for migration X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Juan Quintela , Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Update qemu_thread_create()'s callers by - setting an error on qemu_thread_create() failure for callers that set an error on failure; - reporting the error and returning failure for callers that return an error code on failure; - reporting the error and setting some state for callers that just report errors and choose not to continue on. Besides, make compress_threads_save_cleanup() cope with partially initialized comp_param[i] to adapt to the new qemu_thread_create() failure case. Cc: Markus Armbruster Cc: Dr. David Alan Gilbert Cc: Juan Quintela Cc: "Peter Xu " Signed-off-by: Fei Li Reviewed-by: Dr. David Alan Gilbert --- migration/migration.c | 35 ++++++++++++++++-------- migration/postcopy-ram.c | 16 ++++++++--- migration/ram.c | 70 +++++++++++++++++++++++++++++++----------------- migration/savevm.c | 12 ++++++--- 4 files changed, 89 insertions(+), 44 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 1786afb63d..ab46ee65be 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -483,10 +483,13 @@ static void process_incoming_migration_co(void *opaque) goto fail; } - /* TODO: let the further caller handle the error instead of abort() */ - qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming", - colo_process_incoming_thread, mis, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&mis->colo_incoming_thread, "COLO incoming", + colo_process_incoming_thread, mis, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + error_reportf_err(local_err, "failed to create " + "colo_process_incoming_thread: "); + goto fail; + } mis->have_colo_incoming_thread = true; qemu_coroutine_yield(); @@ -2485,6 +2488,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) { @@ -2498,10 +2502,15 @@ static int open_return_path_on_source(MigrationState *ms, return 0; } - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&ms->rp_state.rp_thread, "return path", - source_return_path_thread, ms, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&ms->rp_state.rp_thread, "return path", + source_return_path_thread, ms, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + error_reportf_err(local_err, + "failed to create source_return_path_thread: "); + qemu_fclose(ms->rp_state.from_dst_file); + ms->rp_state.from_dst_file = NULL; + return -1; + } trace_open_return_path_on_source_continue(); @@ -3346,9 +3355,13 @@ void migrate_fd_connect(MigrationState *s, Error *error_in) migrate_fd_cleanup(s); return; } - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&s->thread, "live_migration", migration_thread, s, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&s->thread, "live_migration", migration_thread, s, + QEMU_THREAD_JOINABLE, &error_in) < 0) { + 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 135e9cd746..d82136962d 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -1095,6 +1095,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) { @@ -1121,10 +1123,16 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis) } qemu_sem_init(&mis->fault_thread_sem, 0); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&mis->fault_thread, "postcopy/fault", - postcopy_ram_fault_thread, mis, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&mis->fault_thread, "postcopy/fault", + postcopy_ram_fault_thread, mis, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + 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 0f677f2d27..16f59ad057 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -504,6 +504,14 @@ static void compress_threads_save_cleanup(void) thread_count = migrate_compress_threads(); for (i = 0; i < thread_count; i++) { + qemu_mutex_lock(&comp_param[i].mutex); + comp_param[i].quit = true; + qemu_cond_signal(&comp_param[i].cond); + qemu_mutex_unlock(&comp_param[i].mutex); + + qemu_mutex_destroy(&comp_param[i].mutex); + qemu_cond_destroy(&comp_param[i].cond); + /* * we use it as a indicator which shows if the thread is * properly init'd or not @@ -511,15 +519,7 @@ static void compress_threads_save_cleanup(void) if (!comp_param[i].file) { break; } - - qemu_mutex_lock(&comp_param[i].mutex); - comp_param[i].quit = true; - qemu_cond_signal(&comp_param[i].cond); - qemu_mutex_unlock(&comp_param[i].mutex); - qemu_thread_join(compress_threads + i); - qemu_mutex_destroy(&comp_param[i].mutex); - qemu_cond_destroy(&comp_param[i].cond); deflateEnd(&comp_param[i].stream); g_free(comp_param[i].originbuf); qemu_fclose(comp_param[i].file); @@ -536,6 +536,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; @@ -546,6 +547,9 @@ static int compress_threads_save_setup(void) qemu_cond_init(&comp_done_cond); qemu_mutex_init(&comp_done_lock); for (i = 0; i < thread_count; i++) { + qemu_mutex_init(&comp_param[i].mutex); + qemu_cond_init(&comp_param[i].cond); + comp_param[i].quit = false; comp_param[i].originbuf = g_try_malloc(TARGET_PAGE_SIZE); if (!comp_param[i].originbuf) { goto exit; @@ -562,13 +566,16 @@ static int compress_threads_save_setup(void) */ comp_param[i].file = qemu_fopen_ops(NULL, &empty_ops); comp_param[i].done = true; - comp_param[i].quit = false; - qemu_mutex_init(&comp_param[i].mutex); - qemu_cond_init(&comp_param[i].cond); - /* TODO: let the further caller handle the error instead of abort() */ - qemu_thread_create(compress_threads + i, "compress", - do_data_compress, comp_param + i, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(compress_threads + i, "compress", + do_data_compress, comp_param + i, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + error_reportf_err(local_err, "failed to create do_data_compress: "); + deflateEnd(&comp_param[i].stream); + g_free(comp_param[i].originbuf); + qemu_fclose(comp_param[i].file); + comp_param[i].file = NULL; + goto exit; + } } return 0; @@ -1168,9 +1175,14 @@ 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; - /* TODO: let the further caller handle the error instead of abort() */ - qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&p->thread, p->name, multifd_send_thread, p, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + migrate_set_error(migrate_get_current(), local_err); + error_reportf_err(local_err, + "failed to create multifd_send_thread: "); + multifd_save_cleanup(); + return; + } } } @@ -1449,9 +1461,13 @@ bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp) p->num_packets = 1; p->running = true; - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + multifd_recv_terminate_threads(local_err); + error_propagate_prepend(errp, local_err, + "failed to create multifd_recv_thread: "); + return false; + } atomic_inc(&multifd_recv_state->count); return atomic_read(&multifd_recv_state->count) == migrate_multifd_channels(); @@ -3873,6 +3889,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; @@ -3894,10 +3911,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; - /* TODO: let the further caller handle the error instead of abort() */ - qemu_thread_create(decompress_threads + i, "decompress", - do_data_decompress, decomp_param + i, - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(decompress_threads + i, "decompress", + do_data_decompress, decomp_param + i, + QEMU_THREAD_JOINABLE, &local_err) < 0) { + 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 c792dee8aa..d75d078946 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1826,10 +1826,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); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&mis->listen_thread, "postcopy/listen", - postcopy_ram_listen_thread, NULL, - QEMU_THREAD_DETACHED, &error_abort); + if (qemu_thread_create(&mis->listen_thread, "postcopy/listen", + postcopy_ram_listen_thread, NULL, + QEMU_THREAD_DETACHED, &local_err) < 0) { + 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); From patchwork Wed Jul 17 02:33:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133066 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hYVN4SO+"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLwD3gP8z9s7T for ; Wed, 17 Jul 2019 12:35:24 +1000 (AEST) Received: from localhost ([::1]:53660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZmr-0006qy-WE for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:35:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53170) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZld-0002BS-7m for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlb-0006R0-23 for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:05 -0400 Received: from mail-pg1-x52a.google.com ([2607:f8b0:4864:20::52a]:44911) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZla-0006QA-Ro for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:02 -0400 Received: by mail-pg1-x52a.google.com with SMTP id i18so10366199pgl.11 for ; Tue, 16 Jul 2019 19:34:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7FY9rArmeN2qGXWCSOPhl+5ILUXBgNadzkrqAFbuET0=; b=hYVN4SO+5XIW8q5ZNzatit06yB/L3Df29sQAdSUzh4H1LNzPS1fmWMVqwKm8HvI8h5 nXm+ANWcEM+ihA8dbv+D8q6qA3ProkB5xiFnQc91rPkg9AMKEpGXq1gg3okqcm972cYL QI2tiLvixPOMKOBW+jhOwiRVXWzz9HeeOdGYGsmjdm093P/7AFHTk1ndPomA9MkqSqxo NNLvyVKPVsaTSM/9nrGNS0emhuXx9xbz3vwxAnlqo4OcZzGq9BUs54tHc+WQOZuTWSAD CIQIknszFEGiz0GVdBFMgpYmoo8Ea8O7JP363Dryb9ag37BJ+HSO5WukwFuxd/V+YKEr y8KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7FY9rArmeN2qGXWCSOPhl+5ILUXBgNadzkrqAFbuET0=; b=ptZmKFMoL3zQMDwmdswNO/laZ/RXvslSjAyx8AskXBOYXLmVQbDftT9pp3O9mqe1SM uJkAS7WfQyG+mSFkArqeKGnRjBMPKofcJpv0J6hLFJ/QTrC/n5XYpzxHJ6FCbUAUeQeF n1J7bHm2kavPeAx+jJrGGy2cAwf/I5kwq0P1D2EyAfGdo8jAubDV9TM/DcbkGENItyIQ rp8skSRrUuCy5h4poupob2AhK+fA6+83CBeQIS0Whq4wvIUjVeEfV+CsFMiIzc87QvTD BcSlAFPCp75tbHjxGXCYHHsUEnjIYPj02ZjRN555px/ruOHcJwFpep8MAd+9KTN1ari/ 4v3g== X-Gm-Message-State: APjAAAUQFfEOxxtw5aBKfjbSYrgBW69kwxwY3DxecOfY3iYpMIRNBiUI L7PuP8camm6C4h6+nVB9Enq+xBE9 X-Google-Smtp-Source: APXvYqyWNDrH5M/VgXOWJDavXmS1N67P/ZH1ErPedS5rC3efCszrmwBAzWP0dPrQYZ+X98G68easwQ== X-Received: by 2002:a63:d23:: with SMTP id c35mr37568550pgl.376.1563330841443; Tue, 16 Jul 2019 19:34:01 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.33.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:34:00 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:09 +0800 Message-Id: <20190717023310.197246-11-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::52a Subject: [Qemu-devel] [PATCH v14 10/11] qemu_thread: supplement error handling for vnc_start_worker_thread X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Supplement the error handling for vnc_thread_worker_thread: add an Error parameter for it to propagate the error to its caller to handle in case it fails, and make it return a Boolean to indicate whether it succeeds. Cc: Markus Armbruster Cc: Gerd Hoffmann Signed-off-by: Fei Li Reviewed-by: Markus Armbruster --- ui/vnc-jobs.c | 17 +++++++++++------ ui/vnc-jobs.h | 2 +- ui/vnc.c | 4 +++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c index 5712f1f501..1371895513 100644 --- a/ui/vnc-jobs.c +++ b/ui/vnc-jobs.c @@ -332,16 +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()) { + return true; + } q = vnc_queue_init(); - /* TODO: let the further caller handle the error instead of abort() here */ - qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, - q, QEMU_THREAD_DETACHED, &error_abort); + if (qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, + q, QEMU_THREAD_DETACHED, errp) < 0) { + vnc_queue_clear(q); + return false; + } queue = q; /* Set global queue */ + + 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 38f92bfca3..561fcb9a29 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -3196,7 +3196,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); From patchwork Wed Jul 17 02:33:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Li X-Patchwork-Id: 1133068 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="oc8cvP0A"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45pLws4Lwfz9sLt for ; Wed, 17 Jul 2019 12:35:57 +1000 (AEST) Received: from localhost ([::1]:53684 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZnP-0001iw-OC for incoming@patchwork.ozlabs.org; Tue, 16 Jul 2019 22:35:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53187) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hnZlg-0002PB-9h for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hnZlf-0006TQ-6F for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:08 -0400 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:42201) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hnZlf-0006Sm-0C for qemu-devel@nongnu.org; Tue, 16 Jul 2019 22:34:07 -0400 Received: by mail-pg1-x543.google.com with SMTP id t132so10360754pgb.9 for ; Tue, 16 Jul 2019 19:34:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZlmBo0TLQANZAtGi/aDCtbMrJkweF6r+WlH/gv43QgA=; b=oc8cvP0ATx4w+MylNhKJfJvNkpLnLAo/LlNlnXU9qU3hVy14KKhiCzedRyKSVHh92i p9PWeTancxN570mGLx7vYS3tGFymB/3zhTN0WE9OVRdZ2vIc3J6RoHOVQomrxAIqxqcP SSwNz5Gsz/Fm+5yU97KKrAmVFDiP7Adra3eyhT1oB2khw2Kg+F4Soz4pFQ7CLDPjOX0/ dRE7p8YTz2UcdL50N0ZbuMbnA3dzTbABkGeKXvlf9Tpd2nWqlSg8SSj3JALFpsCEG9zb fdXXFdoSDSBIKhBpdbeo/9whSWGuiSuMyVU2T29BbKXe8u7chVdm1oR2P9yVyJbGYjz+ WZmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZlmBo0TLQANZAtGi/aDCtbMrJkweF6r+WlH/gv43QgA=; b=ORL4Ahuj8XO3cDz8ePpuMD7EvdW8cQMhAo1A3Lwo5eY7aKqgBZMDO01Z9mYXgf6INW Vm9ndYbd+AQ1jjj8qW0FMgmdVAaI/s6dkhW6u7if60WQlW2C2v16Vxi1zlDLcdlaFii0 XnVXJ06w3Q0Rj4t3BMlN6322qVVcogVkj+eKcyr3RRXFo59A64FZIG3gppAopfRPQgTd yJ3nF4MPBEZVmyYxUYy+QK3ENEUTXYZ1o5ez4RJzub+MFJrkfZJW7lYPX0QDWfaS8cOk 8QHSCgwEPrZs27g4j5XnPidokdeT6wDEIQSKTRIJSPw0XWaid2JcCOZ8YWHHMBs8oX8z 6Y1g== X-Gm-Message-State: APjAAAWyfCMdBtNpCjxlTkS8gkDnYdk93IwpsRitq+vOD2mn3IFZPsIy HZdPB2UaA5cCjgTVA4MIvnOYOrPJ X-Google-Smtp-Source: APXvYqwoITl4shxkQG5p9IVRUvVMcI2KBVbBQHKg80HIatfrSBh9jgcMvBlOwow0dnnlvueNRm53UA== X-Received: by 2002:a63:f13:: with SMTP id e19mr37682711pgl.132.1563330845374; Tue, 16 Jul 2019 19:34:05 -0700 (PDT) Received: from n3-021-211.byted.org ([49.7.44.72]) by smtp.gmail.com with ESMTPSA id b1sm20986530pfi.91.2019.07.16.19.34.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 19:34:04 -0700 (PDT) From: Fei Li To: qemu-devel@nongnu.org, shirley17fei@gmail.com Date: Wed, 17 Jul 2019 10:33:10 +0800 Message-Id: <20190717023310.197246-12-shirley17fei@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190717023310.197246-1-shirley17fei@gmail.com> References: <20190717023310.197246-1-shirley17fei@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v14 11/11] qemu_thread: supplement error handling for touch_all_pages X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster , Peter Xu , "Dr . David Alan Gilbert" , Fei Li , Gerd Hoffmann , David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Supplement the error handling for touch_all_pages: add an Error parameter for it to propagate the error to its caller to do the handling in case it fails. Cc: Markus Armbruster Signed-off-by: Fei Li --- util/oslib-posix.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 55c1b9c098..eff5af3ccf 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -448,12 +448,12 @@ static inline int get_memset_num_threads(int smp_cpus) } static bool touch_all_pages(char *area, size_t hpagesize, size_t numpages, - int smp_cpus) + int smp_cpus, Error **errp) { size_t numpages_per_thread; size_t size_per_thread; char *addr = area; - int i = 0; + int i = 0, j = 0; memset_thread_failed = false; memset_num_threads = get_memset_num_threads(smp_cpus); @@ -465,20 +465,32 @@ 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; - /* TODO: let the callers handle the error instead of abort() here */ - qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", - do_touch_pages, &memset_thread[i], - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", + do_touch_pages, &memset_thread[i], + QEMU_THREAD_JOINABLE, errp) < 0) { + break; + } addr += size_per_thread; numpages -= numpages_per_thread; } - for (i = 0; i < memset_num_threads; i++) { - qemu_thread_join(&memset_thread[i].pgthread); + + for (j = 0; j < i; j++) { + qemu_thread_join(&memset_thread[j].pgthread); } g_free(memset_thread); memset_thread = NULL; - return memset_thread_failed; + if (i < memset_num_threads) { + /* qemu_thread_create() has set @errp */ + return false; + } + + if (memset_thread_failed) { + error_setg(errp, "os_mem_prealloc: Insufficient free host " + "memory pages available to allocate guest RAM"); + return false; + } + return true; } void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus, @@ -501,10 +513,7 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus, } /* touch pages simultaneously */ - if (touch_all_pages(area, hpagesize, numpages, smp_cpus)) { - error_setg(errp, "os_mem_prealloc: Insufficient free host memory " - "pages available to allocate guest RAM"); - } + touch_all_pages(area, hpagesize, numpages, smp_cpus, errp); ret = sigaction(SIGBUS, &oldact, NULL); if (ret) {