* --help/--version improvements (Eric)

* GCC 7 workaround (Greg)
 * Small SCSI fix (Hannes)
 * SSE 4.1 fix (Joseph)
 * RCU deadlock fix (myself)
 -----BEGIN PGP SIGNATURE-----
 
 iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAlmJ2LgUHHBib256aW5p
 QHJlZGhhdC5jb20ACgkQv/vSX3jHroPMLgf/Zvj+1yP94YejCWma5jay8/kbWqNx
 25AVurgleLsuhFATpZixyURauVkyGi1RCCldq0EZR2bXMDmwTk76VTt2Kh7/xh5I
 GZIT44tRKwItpihfN600xGHFH00C9pu4dg5zSZvj1nuwlowEgmx7hni2uG4DdKaM
 PSGckkXq4IaIAh49Pggc/Mucj9S5ZbgFvEUK4KcB75+U5x0UXpQRh/dY7gOfIrw/
 Alufbu48UOFNIW9k8AcMRucin0HawHyWhaGbn3cgyfdVTNO2t9mhFyAIYcPbF/6L
 7LLXp1Ujngfdfcq4b4pLaFAkFkGOjHwXEtgEi/Z+mphXfORlf7haOphdOA==
 =v1PK
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging

* --help/--version improvements (Eric)
* GCC 7 workaround (Greg)
* Small SCSI fix (Hannes)
* SSE 4.1 fix (Joseph)
* RCU deadlock fix (myself)

# gpg: Signature made Tue 08 Aug 2017 16:28:56 BST
# gpg:                using RSA key 0xBFFBD25F78C7AE83
# gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>"
# gpg:                 aka "Paolo Bonzini <pbonzini@redhat.com>"
# Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4  E2F7 7E15 100C CD36 69B1
#      Subkey fingerprint: F133 3857 4B66 2389 866C  7682 BFFB D25F 78C7 AE83

* remotes/bonzini/tags/for-upstream:
  maint: Include bug-reporting info in --help output
  qga: Give more --version information
  qemu-io: Give more --version information
  qemu-img: Sort sub-command names in --help
  target/i386: set rip_offset for some SSE4.1 instructions
  scsi: clarify sense codes for LUN0 emulation
  kvm: workaround build break on gcc-7.1.1 / fedora26
  Revert "rcu: do not create thread in pthread_atfork callback"
  rcu: completely disable pthread_atfork callbacks as soon as possible

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-08-08 16:32:54 +01:00
commit e42590c22a
16 changed files with 84 additions and 37 deletions

View File

@ -686,6 +686,8 @@ static void usage(void)
" -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n" " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
"Note that if you provide several changes to single variable\n" "Note that if you provide several changes to single variable\n"
"last change will stay in effect.\n" "last change will stay in effect.\n"
"\n"
QEMU_HELP_BOTTOM "\n"
, ,
TARGET_NAME, TARGET_NAME,
interp_prefix, interp_prefix,

View File

@ -517,6 +517,11 @@ static int32_t scsi_target_send_command(SCSIRequest *req, uint8_t *buf)
{ {
SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req); SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
if (req->lun != 0) {
scsi_req_build_sense(req, SENSE_CODE(LUN_NOT_SUPPORTED));
scsi_req_complete(req, CHECK_CONDITION);
return 0;
}
switch (buf[0]) { switch (buf[0]) {
case REPORT_LUNS: case REPORT_LUNS:
if (!scsi_target_emulate_report_luns(r)) { if (!scsi_target_emulate_report_luns(r)) {
@ -542,7 +547,7 @@ static int32_t scsi_target_send_command(SCSIRequest *req, uint8_t *buf)
case TEST_UNIT_READY: case TEST_UNIT_READY:
break; break;
default: default:
scsi_req_build_sense(req, SENSE_CODE(LUN_NOT_SUPPORTED)); scsi_req_build_sense(req, SENSE_CODE(INVALID_OPCODE));
scsi_req_complete(req, CHECK_CONDITION); scsi_req_complete(req, CHECK_CONDITION);
return 0; return 0;
illegal_request: illegal_request:

View File

@ -22,6 +22,11 @@
#define QEMU_COPYRIGHT "Copyright (c) 2003-2017 " \ #define QEMU_COPYRIGHT "Copyright (c) 2003-2017 " \
"Fabrice Bellard and the QEMU Project developers" "Fabrice Bellard and the QEMU Project developers"
/* Bug reporting information for --help arguments, About dialogs, etc */
#define QEMU_HELP_BOTTOM \
"See <http://qemu.org/contribute/report-a-bug> for how to report bugs.\n" \
"More information on the QEMU project at <http://qemu.org>."
/* main function, renamed */ /* main function, renamed */
#if defined(CONFIG_COCOA) #if defined(CONFIG_COCOA)
int qemu_main(int argc, char **argv, char **envp); int qemu_main(int argc, char **argv, char **envp);

View File

@ -105,7 +105,12 @@ extern void synchronize_rcu(void);
*/ */
extern void rcu_register_thread(void); extern void rcu_register_thread(void);
extern void rcu_unregister_thread(void); extern void rcu_unregister_thread(void);
extern void rcu_after_fork(void);
/*
* Support for fork(). fork() support is enabled at startup.
*/
extern void rcu_enable_atfork(void);
extern void rcu_disable_atfork(void);
struct rcu_head; struct rcu_head;
typedef void RCUCBFunc(struct rcu_head *head); typedef void RCUCBFunc(struct rcu_head *head);

View File

@ -428,11 +428,8 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension);
.flags = cap_flags, \ .flags = cap_flags, \
}; \ }; \
uint64_t args_tmp[] = { __VA_ARGS__ }; \ uint64_t args_tmp[] = { __VA_ARGS__ }; \
int i; \ size_t n = MIN(ARRAY_SIZE(args_tmp), ARRAY_SIZE(cap.args)); \
for (i = 0; i < (int)ARRAY_SIZE(args_tmp) && \ memcpy(cap.args, args_tmp, n * sizeof(cap.args[0])); \
i < ARRAY_SIZE(cap.args); i++) { \
cap.args[i] = args_tmp[i]; \
} \
kvm_vm_ioctl(s, KVM_ENABLE_CAP, &cap); \ kvm_vm_ioctl(s, KVM_ENABLE_CAP, &cap); \
}) })
@ -443,11 +440,8 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension);
.flags = cap_flags, \ .flags = cap_flags, \
}; \ }; \
uint64_t args_tmp[] = { __VA_ARGS__ }; \ uint64_t args_tmp[] = { __VA_ARGS__ }; \
int i; \ size_t n = MIN(ARRAY_SIZE(args_tmp), ARRAY_SIZE(cap.args)); \
for (i = 0; i < (int)ARRAY_SIZE(args_tmp) && \ memcpy(cap.args, args_tmp, n * sizeof(cap.args[0])); \
i < ARRAY_SIZE(cap.args); i++) { \
cap.args[i] = args_tmp[i]; \
} \
kvm_vcpu_ioctl(cpu, KVM_ENABLE_CAP, &cap); \ kvm_vcpu_ioctl(cpu, KVM_ENABLE_CAP, &cap); \
}) })

View File

@ -4136,7 +4136,9 @@ static void usage(int exitcode)
" -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n" " -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" " 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" "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); exit(exitcode);
} }

View File

@ -6354,7 +6354,6 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
ret = fork(); ret = fork();
if (ret == 0) { if (ret == 0) {
/* Child Process. */ /* Child Process. */
rcu_after_fork();
cpu_clone_regs(env, newsp); cpu_clone_regs(env, newsp);
fork_end(1); fork_end(1);
/* There is a race condition here. The parent process could /* There is a race condition here. The parent process could

View File

@ -34,7 +34,6 @@
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "net/slirp.h" #include "net/slirp.h"
#include "qemu-options.h" #include "qemu-options.h"
#include "qemu/rcu.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "qemu/cutils.h" #include "qemu/cutils.h"
@ -249,7 +248,6 @@ void os_daemonize(void)
signal(SIGTSTP, SIG_IGN); signal(SIGTSTP, SIG_IGN);
signal(SIGTTOU, SIG_IGN); signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN); signal(SIGTTIN, SIG_IGN);
rcu_after_fork();
} }
} }

View File

@ -1,3 +1,4 @@
HXCOMM Keep the list of subcommands sorted by name.
HXCOMM Use DEFHEADING() to define headings in both help text and texi HXCOMM Use DEFHEADING() to define headings in both help text and texi
HXCOMM Text between STEXI and ETEXI are copied to texi version and HXCOMM Text between STEXI and ETEXI are copied to texi version and
HXCOMM discarded from C version HXCOMM discarded from C version
@ -9,6 +10,12 @@ STEXI
@table @option @table @option
ETEXI ETEXI
DEF("amend", img_amend,
"amend [--object objectdef] [--image-opts] [-p] [-q] [-f fmt] [-t cache] -o options filename")
STEXI
@item amend [--object @var{objectdef}] [--image-opts] [-p] [-q] [-f @var{fmt}] [-t @var{cache}] -o @var{options} @var{filename}
ETEXI
DEF("bench", img_bench, DEF("bench", img_bench,
"bench [-c count] [-d depth] [-f fmt] [--flush-interval=flush_interval] [-n] [--no-drain] [-o offset] [--pattern=pattern] [-q] [-s buffer_size] [-S step_size] [-t cache] [-w] [-U] filename") "bench [-c count] [-d depth] [-f fmt] [--flush-interval=flush_interval] [-n] [--no-drain] [-o offset] [--pattern=pattern] [-q] [-s buffer_size] [-S step_size] [-t cache] [-w] [-U] filename")
STEXI STEXI
@ -21,12 +28,6 @@ STEXI
@item check [--object @var{objectdef}] [--image-opts] [-q] [-f @var{fmt}] [--output=@var{ofmt}] [-r [leaks | all]] [-T @var{src_cache}] [-U] @var{filename} @item check [--object @var{objectdef}] [--image-opts] [-q] [-f @var{fmt}] [--output=@var{ofmt}] [-r [leaks | all]] [-T @var{src_cache}] [-U] @var{filename}
ETEXI ETEXI
DEF("create", img_create,
"create [-q] [--object objectdef] [-f fmt] [-b backing_file] [-F backing_fmt] [-u] [-o options] filename [size]")
STEXI
@item create [--object @var{objectdef}] [-q] [-f @var{fmt}] [-b @var{backing_file}] [-F @var{backing_fmt}] [-u] [-o @var{options}] @var{filename} [@var{size}]
ETEXI
DEF("commit", img_commit, DEF("commit", img_commit,
"commit [-q] [--object objectdef] [--image-opts] [-f fmt] [-t cache] [-b base] [-d] [-p] filename") "commit [-q] [--object objectdef] [--image-opts] [-f fmt] [-t cache] [-b base] [-d] [-p] filename")
STEXI STEXI
@ -45,6 +46,12 @@ STEXI
@item convert [--object @var{objectdef}] [--image-opts] [--target-image-opts] [-U] [-c] [-p] [-q] [-n] [-f @var{fmt}] [-t @var{cache}] [-T @var{src_cache}] [-O @var{output_fmt}] [-B @var{backing_file}] [-o @var{options}] [-s @var{snapshot_id_or_name}] [-l @var{snapshot_param}] [-S @var{sparse_size}] [-m @var{num_coroutines}] [-W] @var{filename} [@var{filename2} [...]] @var{output_filename} @item convert [--object @var{objectdef}] [--image-opts] [--target-image-opts] [-U] [-c] [-p] [-q] [-n] [-f @var{fmt}] [-t @var{cache}] [-T @var{src_cache}] [-O @var{output_fmt}] [-B @var{backing_file}] [-o @var{options}] [-s @var{snapshot_id_or_name}] [-l @var{snapshot_param}] [-S @var{sparse_size}] [-m @var{num_coroutines}] [-W] @var{filename} [@var{filename2} [...]] @var{output_filename}
ETEXI ETEXI
DEF("create", img_create,
"create [-q] [--object objectdef] [-f fmt] [-b backing_file] [-F backing_fmt] [-u] [-o options] filename [size]")
STEXI
@item create [--object @var{objectdef}] [-q] [-f @var{fmt}] [-b @var{backing_file}] [-F @var{backing_fmt}] [-u] [-o @var{options}] @var{filename} [@var{size}]
ETEXI
DEF("dd", img_dd, DEF("dd", img_dd,
"dd [--image-opts] [-U] [-f fmt] [-O output_fmt] [bs=block_size] [count=blocks] [skip=blocks] if=input of=output") "dd [--image-opts] [-U] [-f fmt] [-O output_fmt] [bs=block_size] [count=blocks] [skip=blocks] if=input of=output")
STEXI STEXI
@ -87,9 +94,6 @@ STEXI
@item resize [--object @var{objectdef}] [--image-opts] [-q] @var{filename} [+ | -]@var{size} @item resize [--object @var{objectdef}] [--image-opts] [-q] @var{filename} [+ | -]@var{size}
ETEXI ETEXI
DEF("amend", img_amend,
"amend [--object objectdef] [--image-opts] [-p] [-q] [-f fmt] [-t cache] -o options filename")
STEXI STEXI
@item amend [--object @var{objectdef}] [--image-opts] [-p] [-q] [-f @var{fmt}] [-t @var{cache}] -o @var{options} @var{filename}
@end table @end table
ETEXI ETEXI

View File

@ -201,7 +201,7 @@ static void QEMU_NORETURN help(void)
printf("%s\nSupported formats:", help_msg); printf("%s\nSupported formats:", help_msg);
bdrv_iterate_format(format_print, NULL); bdrv_iterate_format(format_print, NULL);
printf("\n"); printf("\n\n" QEMU_HELP_BOTTOM "\n");
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }

View File

@ -26,6 +26,7 @@
#include "block/block_int.h" #include "block/block_int.h"
#include "trace/control.h" #include "trace/control.h"
#include "crypto/init.h" #include "crypto/init.h"
#include "qemu-version.h"
#define CMD_NOFILE_OK 0x01 #define CMD_NOFILE_OK 0x01
@ -261,8 +262,9 @@ static void usage(const char *name)
" -h, --help display this help and exit\n" " -h, --help display this help and exit\n"
" -V, --version output version information and exit\n" " -V, --version output version information and exit\n"
"\n" "\n"
"See '%s -c help' for information on available commands." "See '%s -c help' for information on available commands.\n"
"\n", "\n"
QEMU_HELP_BOTTOM "\n",
name, name); name, name);
} }
@ -522,7 +524,8 @@ int main(int argc, char **argv)
trace_file = trace_opt_parse(optarg); trace_file = trace_opt_parse(optarg);
break; break;
case 'V': case 'V':
printf("%s version %s\n", progname, QEMU_VERSION); printf("%s version " QEMU_VERSION QEMU_PKGVERSION "\n"
QEMU_COPYRIGHT "\n", progname);
exit(0); exit(0);
case 'h': case 'h':
usage(progname); usage(progname);

View File

@ -123,7 +123,7 @@ static void usage(const char *name)
" --detect-zeroes=MODE set detect-zeroes mode (off, on, unmap)\n" " --detect-zeroes=MODE set detect-zeroes mode (off, on, unmap)\n"
" --image-opts treat FILE as a full set of image options\n" " --image-opts treat FILE as a full set of image options\n"
"\n" "\n"
"Report bugs to <qemu-devel@nongnu.org>\n" QEMU_HELP_BOTTOM "\n"
, name, NBD_DEFAULT_PORT, "DEVICE"); , name, NBD_DEFAULT_PORT, "DEVICE");
} }

View File

@ -29,6 +29,7 @@
#include "qemu/help_option.h" #include "qemu/help_option.h"
#include "qemu/sockets.h" #include "qemu/sockets.h"
#include "qemu/systemd.h" #include "qemu/systemd.h"
#include "qemu-version.h"
#ifdef _WIN32 #ifdef _WIN32
#include "qga/service-win32.h" #include "qga/service-win32.h"
#include "qga/vss-win32.h" #include "qga/vss-win32.h"
@ -213,7 +214,8 @@ static void usage(const char *cmd)
{ {
printf( printf(
"Usage: %s [-m <method> -p <path>] [<options>]\n" "Usage: %s [-m <method> -p <path>] [<options>]\n"
"QEMU Guest Agent %s\n" "QEMU Guest Agent " QEMU_VERSION QEMU_PKGVERSION "\n"
QEMU_COPYRIGHT "\n"
"\n" "\n"
" -m, --method transport method: one of unix-listen, virtio-serial,\n" " -m, --method transport method: one of unix-listen, virtio-serial,\n"
" isa-serial, or vsock-listen (virtio-serial is the default)\n" " isa-serial, or vsock-listen (virtio-serial is the default)\n"
@ -247,8 +249,8 @@ static void usage(const char *cmd)
" options / command-line parameters to stdout\n" " options / command-line parameters to stdout\n"
" -h, --help display this help and exit\n" " -h, --help display this help and exit\n"
"\n" "\n"
"Report bugs to <mdroth@linux.vnet.ibm.com>\n" QEMU_HELP_BOTTOM "\n"
, cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT, , cmd, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT,
dfl_pathnames.pidfile, dfl_pathnames.pidfile,
#ifdef CONFIG_FSFREEZE #ifdef CONFIG_FSFREEZE
QGA_FSFREEZE_HOOK_DEFAULT, QGA_FSFREEZE_HOOK_DEFAULT,

View File

@ -4080,6 +4080,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
if (sse_fn_eppi == SSE_SPECIAL) { if (sse_fn_eppi == SSE_SPECIAL) {
ot = mo_64_32(s->dflag); ot = mo_64_32(s->dflag);
rm = (modrm & 7) | REX_B(s); rm = (modrm & 7) | REX_B(s);
s->rip_offset = 1;
if (mod != 3) if (mod != 3)
gen_lea_modrm(env, s, modrm); gen_lea_modrm(env, s, modrm);
reg = ((modrm >> 3) & 7) | rex_r; reg = ((modrm >> 3) & 7) | rex_r;

View File

@ -318,30 +318,54 @@ static void rcu_init_complete(void)
rcu_register_thread(); rcu_register_thread();
} }
static int atfork_depth = 1;
void rcu_enable_atfork(void)
{
atfork_depth++;
}
void rcu_disable_atfork(void)
{
atfork_depth--;
}
#ifdef CONFIG_POSIX #ifdef CONFIG_POSIX
static void rcu_init_lock(void) static void rcu_init_lock(void)
{ {
if (atfork_depth < 1) {
return;
}
qemu_mutex_lock(&rcu_sync_lock); qemu_mutex_lock(&rcu_sync_lock);
qemu_mutex_lock(&rcu_registry_lock); qemu_mutex_lock(&rcu_registry_lock);
} }
static void rcu_init_unlock(void) static void rcu_init_unlock(void)
{ {
if (atfork_depth < 1) {
return;
}
qemu_mutex_unlock(&rcu_registry_lock); qemu_mutex_unlock(&rcu_registry_lock);
qemu_mutex_unlock(&rcu_sync_lock); qemu_mutex_unlock(&rcu_sync_lock);
} }
#endif
void rcu_after_fork(void) static void rcu_init_child(void)
{ {
if (atfork_depth < 1) {
return;
}
memset(&registry, 0, sizeof(registry)); memset(&registry, 0, sizeof(registry));
rcu_init_complete(); rcu_init_complete();
} }
#endif
static void __attribute__((__constructor__)) rcu_init(void) static void __attribute__((__constructor__)) rcu_init(void)
{ {
#ifdef CONFIG_POSIX #ifdef CONFIG_POSIX
pthread_atfork(rcu_init_lock, rcu_init_unlock, rcu_init_unlock); pthread_atfork(rcu_init_lock, rcu_init_unlock, rcu_init_child);
#endif #endif
rcu_init_complete(); rcu_init_complete();
} }

5
vl.c
View File

@ -1942,7 +1942,9 @@ static void help(int exitcode)
"ctrl-alt-n switch to virtual console 'n'\n" "ctrl-alt-n switch to virtual console 'n'\n"
"ctrl-alt toggle mouse and keyboard grab\n" "ctrl-alt toggle mouse and keyboard grab\n"
"\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); exit(exitcode);
} }
@ -4121,6 +4123,7 @@ int main(int argc, char **argv, char **envp)
set_memory_options(&ram_slots, &maxram_size, machine_class); set_memory_options(&ram_slots, &maxram_size, machine_class);
os_daemonize(); os_daemonize();
rcu_disable_atfork();
if (pid_file && qemu_create_pidfile(pid_file) != 0) { if (pid_file && qemu_create_pidfile(pid_file) != 0) {
error_report("could not acquire pid file: %s", strerror(errno)); error_report("could not acquire pid file: %s", strerror(errno));