mirror of https://github.com/xqemu/xqemu.git
* --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:
commit
e42590c22a
|
@ -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,
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
30
util/rcu.c
30
util/rcu.c
|
@ -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(®istry, 0, sizeof(registry));
|
memset(®istry, 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
5
vl.c
|
@ -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));
|
||||||
|
|
Loading…
Reference in New Issue