[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 12/14] char: do not use atexit cleanup handler
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 12/14] char: do not use atexit cleanup handler |
Date: |
Wed, 13 Jul 2016 15:26:30 +0200 |
From: Marc-André Lureau <address@hidden>
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=<optimized out>, address@hidden
<__func__.14622> "qemu_mutex_destroy")
at /home/drjones/code/qemu/util/qemu-thread-posix.c:39
#3 0x0000555555b0be20 in qemu_mutex_destroy (address@hidden) 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=<optimized out>) at
/home/drjones/code/qemu/qemu-char.c:4038
#6 0x00005555558b05f9 in qemu_chr_delete (chr=<optimized out>) 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=<optimized out>,
buf=0x7fffc343fd9a "", len=0) at /home/drjones/code/qemu/backends/testdev.c:95
#12 0x00005555558adced in qemu_chr_fe_write (s=0x5555566aa0e0, address@hidden
"0q", address@hidden) 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 <address@hidden>
Reported-by: Andrew Jones <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
include/sysemu/char.h | 7 +++++++
qemu-char.c | 4 +---
vl.c | 2 ++
3 files changed, 10 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
@@ -152,6 +152,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:
*
* Create a new character backend from a URI.
diff --git a/qemu-char.c b/qemu-char.c
index 0698b98..e4b8448 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -4548,7 +4548,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;
@@ -4603,8 +4603,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 cad4da2..d3ec532 100644
--- a/vl.c
+++ b/vl.c
@@ -4608,7 +4608,9 @@ int main(int argc, char **argv, char **envp)
tpm_cleanup();
#endif
+ /* vhost-user must be cleaned up before chardevs. */
net_cleanup();
+ qemu_chr_cleanup();
return 0;
}
--
1.8.3.1
- [Qemu-devel] [PULL 05/14] json-streamer: fix double-free on exiting during a parse, (continued)
- [Qemu-devel] [PULL 05/14] json-streamer: fix double-free on exiting during a parse, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 06/14] disas: avoid including everything in headers compiled from C++, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 08/14] util: Fix MIN_NON_ZERO, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 01/14] scsi-bus: Add SCSI scanner support, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 02/14] scsi-bus: Use longer sense buffer with scanners, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 09/14] tap: use an exit notifier to call down_script, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 07/14] qemu-sockets: use qapi_free_SocketAddress in cleanup, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 10/14] slirp: use exit notifier for slirp_smb_cleanup, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 11/14] net: do not use atexit for cleanup, Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 13/14] hostmem: fix QEMU crash by 'info memdev', Paolo Bonzini, 2016/07/13
- [Qemu-devel] [PULL 12/14] char: do not use atexit cleanup handler,
Paolo Bonzini <=
- [Qemu-devel] [PULL 14/14] hostmem: detect host backend memory is being used properly, Paolo Bonzini, 2016/07/13
- Re: [Qemu-devel] [PULL 00/14] SCSI, chardev, build fixes for 2016-07-13, Peter Maydell, 2016/07/14