From patchwork Mon Jul 4 15:38:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= X-Patchwork-Id: 644250 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rjrmw2frfz9s9x for ; Tue, 5 Jul 2016 01:40:00 +1000 (AEST) Received: from localhost ([::1]:48704 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bK5yY-0004Al-5i for incoming@patchwork.ozlabs.org; Mon, 04 Jul 2016 11:39:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45858) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bK5xF-0003I0-AM for qemu-devel@nongnu.org; Mon, 04 Jul 2016 11:38:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bK5xA-00023j-Ab for qemu-devel@nongnu.org; Mon, 04 Jul 2016 11:38:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51213) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bK5xA-00023H-2V for qemu-devel@nongnu.org; Mon, 04 Jul 2016 11:38:32 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 17A6FC049D59 for ; Mon, 4 Jul 2016 15:38:31 +0000 (UTC) Received: from localhost (ovpn-116-37.phx2.redhat.com [10.3.116.37]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u64FcU3P002467; Mon, 4 Jul 2016 11:38:30 -0400 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Date: Mon, 4 Jul 2016 17:38:23 +0200 Message-Id: <20160704153823.16879-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 04 Jul 2016 15:38:31 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH] char: do not use atexit cleanup handler X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Marc-André Lureau It turns out qemu is calling exit() in various places from various threads without taking much care of resources state. The atexit() cleanup handlers cannot easily destroy resources that are in use (by the same thread or other). Since c1111a24a3, TCG arm guests run into the following abort() when running tests, the chardev mutex is locked during the write, so qemu_mutex_destroy() returns an error: #0 0x00007fffdbb806f5 in raise () at /lib64/libc.so.6 #1 0x00007fffdbb822fa in abort () at /lib64/libc.so.6 #2 0x00005555557616fe in error_exit (err=, msg=msg@entry=0x555555c38c30 <__func__.14622> "qemu_mutex_destroy") at /home/drjones/code/qemu/util/qemu-thread-posix.c:39 #3 0x0000555555b0be20 in qemu_mutex_destroy (mutex=mutex@entry=0x5555566aa0e0) at /home/drjones/code/qemu/util/qemu-thread-posix.c:57 #4 0x00005555558aab00 in qemu_chr_free_common (chr=0x5555566aa0e0) at /home/drjones/code/qemu/qemu-char.c:4029 #5 0x00005555558b05f9 in qemu_chr_delete (chr=) at /home/drjones/code/qemu/qemu-char.c:4038 #6 0x00005555558b05f9 in qemu_chr_delete (chr=) at /home/drjones/code/qemu/qemu-char.c:4044 #7 0x00005555558b062c in qemu_chr_cleanup () at /home/drjones/code/qemu/qemu-char.c:4557 #8 0x00007fffdbb851e8 in __run_exit_handlers () at /lib64/libc.so.6 #9 0x00007fffdbb85235 in () at /lib64/libc.so.6 #10 0x00005555558d1b39 in testdev_write (testdev=0x5555566aa0a0) at /home/drjones/code/qemu/backends/testdev.c:71 #11 0x00005555558d1b39 in testdev_write (chr=, buf=0x7fffc343fd9a "", len=0) at /home/drjones/code/qemu/backends/testdev.c:95 #12 0x00005555558adced in qemu_chr_fe_write (s=0x5555566aa0e0, buf=buf@entry=0x7fffc343fd98 "0q", len=len@entry=2) at /home/drjones/code/qemu/qemu-char.c:282 Instead of using a atexit() handler, only run the chardev cleanup as initially proposed at the end of main(), where there are less chances (hic) of conflicts or other races. Signed-off-by: Marc-André Lureau Reported-by: Andrew Jones --- include/sysemu/char.h | 7 +++++++ qemu-char.c | 4 +--- vl.c | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/sysemu/char.h b/include/sysemu/char.h index 57df10a..0ea9eac 100644 --- a/include/sysemu/char.h +++ b/include/sysemu/char.h @@ -151,6 +151,13 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename, */ void qemu_chr_disconnect(CharDriverState *chr); +/** + * @qemu_chr_cleanup: + * + * Delete all chardevs (when leaving qemu) + */ +void qemu_chr_cleanup(void); + /** * @qemu_chr_new_noreplay: * diff --git a/qemu-char.c b/qemu-char.c index b73969d..a542192 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -4549,7 +4549,7 @@ void qmp_chardev_remove(const char *id, Error **errp) qemu_chr_delete(chr); } -static void qemu_chr_cleanup(void) +void qemu_chr_cleanup(void) { CharDriverState *chr, *tmp; @@ -4604,8 +4604,6 @@ static void register_types(void) * is specified */ qemu_add_machine_init_done_notifier(&muxes_realize_notify); - - atexit(qemu_chr_cleanup); } type_init(register_types); diff --git a/vl.c b/vl.c index 9bb7f4c..d0b9ff9 100644 --- a/vl.c +++ b/vl.c @@ -4596,6 +4596,7 @@ int main(int argc, char **argv, char **envp) #ifdef CONFIG_TPM tpm_cleanup(); #endif + qemu_chr_cleanup(); return 0; }