From 73c6e4013b4cd92d3d531bc22cc29e6036ef42e0 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 27 Jan 2016 08:49:21 +0100 Subject: rcu: completely disable pthread_atfork callbacks as soon as possible Because of -daemonize, system mode QEMU sometimes needs to fork() and keep RCU enabled in the child. However, there is a possible deadlock with synchronize_rcu: - the CPU thread is inside a RCU critical section and wants to take the BQL in order to do MMIO - the monitor thread, which is owning the BQL, calls rcu_init_lock which tries to take the rcu_sync_lock - the call_rcu thread has taken rcu_sync_lock in synchronize_rcu, but synchronize_rcu needs the CPU thread to end the critical section before returning. This cannot happen for user-mode emulation, because it does not have a BQL. To fix it, assume that system mode QEMU only forks in preparation for exec (except when daemonizing) and disable pthread_atfork as soon as the double fork has happened. Reported-by: Dr. David Alan Gilbert Tested-by: Dr. David Alan Gilbert Signed-off-by: Paolo Bonzini --- vl.c | 1 + 1 file changed, 1 insertion(+) (limited to 'vl.c') diff --git a/vl.c b/vl.c index 99fcfa0442..8967115514 100644 --- a/vl.c +++ b/vl.c @@ -4121,6 +4121,7 @@ int main(int argc, char **argv, char **envp) set_memory_options(&ram_slots, &maxram_size, machine_class); os_daemonize(); + rcu_disable_atfork(); if (pid_file && qemu_create_pidfile(pid_file) != 0) { error_report("could not acquire pid file: %s", strerror(errno)); -- cgit v1.2.3-55-g7522 From f5048cb7517348a20ba202e435e1006a8f5001cf Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Thu, 3 Aug 2017 11:33:53 -0500 Subject: maint: Include bug-reporting info in --help output These days, many programs are including a bug-reporting address, or better yet, a link to the project web site, at the tail of their --help output. However, we were not very consistent at doing so: only qemu-nbd and qemu-qa mentioned anything, with the latter pointing to an individual person instead of the project. Add a new #define that sets up a uniform string, mentioning both bug reporting instructions and overall project details, and which a downstream vendor could tweak if they want bugs to go to a downstream database. Then use it in all of our binaries which have --help output. The canned text intentionally references http:// instead of https:// because our https website currently causes certificate errors in some browsers. That can be tweaked later once we have resolved the web site issued. Signed-off-by: Eric Blake Reviewed-by: Daniel P. Berrange Reviewed-by: Philippe Mathieu-Daudé Message-Id: <20170803163353.19558-5-eblake@redhat.com> Signed-off-by: Paolo Bonzini --- bsd-user/main.c | 2 ++ include/qemu-common.h | 5 +++++ linux-user/main.c | 4 +++- qemu-img.c | 2 +- qemu-io.c | 5 +++-- qemu-nbd.c | 2 +- qga/main.c | 2 +- vl.c | 4 +++- 8 files changed, 19 insertions(+), 7 deletions(-) (limited to 'vl.c') diff --git a/bsd-user/main.c b/bsd-user/main.c index 501e16f675..8a6706a1c8 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -686,6 +686,8 @@ static void usage(void) " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n" "Note that if you provide several changes to single variable\n" "last change will stay in effect.\n" + "\n" + QEMU_HELP_BOTTOM "\n" , TARGET_NAME, interp_prefix, diff --git a/include/qemu-common.h b/include/qemu-common.h index b5adbfa5e9..0456c79df4 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -22,6 +22,11 @@ #define QEMU_COPYRIGHT "Copyright (c) 2003-2017 " \ "Fabrice Bellard and the QEMU Project developers" +/* Bug reporting information for --help arguments, About dialogs, etc */ +#define QEMU_HELP_BOTTOM \ + "See for how to report bugs.\n" \ + "More information on the QEMU project at ." + /* main function, renamed */ #if defined(CONFIG_COCOA) int qemu_main(int argc, char **argv, char **envp); diff --git a/linux-user/main.c b/linux-user/main.c index 2b38d39d87..03666ef657 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -4136,7 +4136,9 @@ static void usage(int exitcode) " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n" " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n" "Note that if you provide several changes to a single variable\n" - "the last change will stay in effect.\n"); + "the last change will stay in effect.\n" + "\n" + QEMU_HELP_BOTTOM "\n"); exit(exitcode); } diff --git a/qemu-img.c b/qemu-img.c index f4d5f0d77d..56ef49e214 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -201,7 +201,7 @@ static void QEMU_NORETURN help(void) printf("%s\nSupported formats:", help_msg); bdrv_iterate_format(format_print, NULL); - printf("\n"); + printf("\n\n" QEMU_HELP_BOTTOM "\n"); exit(EXIT_SUCCESS); } diff --git a/qemu-io.c b/qemu-io.c index ec175630a6..265445ad89 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -262,8 +262,9 @@ static void usage(const char *name) " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" "\n" -"See '%s -c help' for information on available commands." -"\n", +"See '%s -c help' for information on available commands.\n" +"\n" +QEMU_HELP_BOTTOM "\n", name, name); } diff --git a/qemu-nbd.c b/qemu-nbd.c index b8666bb575..27164b8205 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -123,7 +123,7 @@ static void usage(const char *name) " --detect-zeroes=MODE set detect-zeroes mode (off, on, unmap)\n" " --image-opts treat FILE as a full set of image options\n" "\n" -"Report bugs to \n" +QEMU_HELP_BOTTOM "\n" , name, NBD_DEFAULT_PORT, "DEVICE"); } diff --git a/qga/main.c b/qga/main.c index b64c7ac2a2..62a62755bd 100644 --- a/qga/main.c +++ b/qga/main.c @@ -249,7 +249,7 @@ QEMU_COPYRIGHT "\n" " options / command-line parameters to stdout\n" " -h, --help display this help and exit\n" "\n" -"Report bugs to \n" +QEMU_HELP_BOTTOM "\n" , cmd, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT, dfl_pathnames.pidfile, #ifdef CONFIG_FSFREEZE diff --git a/vl.c b/vl.c index 8967115514..8e247cc2a2 100644 --- a/vl.c +++ b/vl.c @@ -1942,7 +1942,9 @@ static void help(int exitcode) "ctrl-alt-n switch to virtual console 'n'\n" "ctrl-alt toggle mouse and keyboard grab\n" "\n" - "When using -nographic, press 'ctrl-a h' to get some help.\n"); + "When using -nographic, press 'ctrl-a h' to get some help.\n" + "\n" + QEMU_HELP_BOTTOM "\n"); exit(exitcode); } -- cgit v1.2.3-55-g7522