mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
* NBD and chardev conversion to QIONetListener (Daniel)
* MTTCG fixes (David) * Hyper-V fixes (Roman, Evgeny) * share-rw option (Fam) * Mux chardev event bugfix (Marc-André) * Add systemd unit files in contrib/ (me) * SCSI and block/iscsi.c bugfixes (me, Peter L.) * unassigned_mem_ops fixes (Peter M.) * VEX decoding fix (Peter M.) * "info pic" and "info irq" improvements (Peter Xu) * vmport trace events (Philippe) * Braille chardev bugfix (Samuel) * Compiler warnings fix (Stefan) * initial support for TCG smoke test of more boards (Thomas) * New CPU features (Yang) * Reduce startup memory usage (Yang) * QemuThread race fix (linhecheng) -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAlo7cTkUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroPTsQf+IlIjTWnwBKaoECDo3t5Nulj84+O5 KLLwW7Yhy6vtu1U8N2kxzGickGf+wF1OEw0916Ku6b/P2jpKNogjDxXBQuO+uerG fPdc17gpSLcIXFzcfhiEH7pKJsdtcW+TTWPoF/RNK0KLP/tmJ+SBNNn0Ly0KRxQ9 t4YoMkFiybMZ+bpuixy/2TN2ZRwyuGdjXSiFLjium6ioPF262f4DqXV8PA7kfV8b FCANCql/p0HvAtURgzsJt0lfqAatKLOUELE4ClHBjUfGCLXAwMw8LQ0F/9jBAcaz fJov/RKjh5y2Av9mjCaTPEu+E550+4qdDcfpk2kuV8xH+CUspUpqGGm3jw== =y+Yl -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging * NBD and chardev conversion to QIONetListener (Daniel) * MTTCG fixes (David) * Hyper-V fixes (Roman, Evgeny) * share-rw option (Fam) * Mux chardev event bugfix (Marc-André) * Add systemd unit files in contrib/ (me) * SCSI and block/iscsi.c bugfixes (me, Peter L.) * unassigned_mem_ops fixes (Peter M.) * VEX decoding fix (Peter M.) * "info pic" and "info irq" improvements (Peter Xu) * vmport trace events (Philippe) * Braille chardev bugfix (Samuel) * Compiler warnings fix (Stefan) * initial support for TCG smoke test of more boards (Thomas) * New CPU features (Yang) * Reduce startup memory usage (Yang) * QemuThread race fix (linhecheng) # gpg: Signature made Thu 21 Dec 2017 08:30:49 GMT # 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: (41 commits) chardev: convert the socket server to QIONetListener blockdev: convert qemu-nbd server to QIONetListener blockdev: convert internal NBD server to QIONetListener test: add some chardev mux event tests chardev: fix backend events regression with mux chardev rcu: reduce more than 7MB heap memory by malloc_trim() checkpatch: volatile with a comment or sig_atomic_t is okay i8259: move TYPE_INTERRUPT_STATS_PROVIDER upper kvm-i8259: support "info pic" and "info irq" i8259: generalize statistics into common code i8259: use DEBUG_IRQ_COUNT always i8259: convert DPRINTFs into trace Remove legacy -no-kvm-pit option scsi: replace hex constants with #defines scsi: provide general-purpose functions to manage sense data hw/i386/vmport: replace fprintf() by trace events or LOG_UNIMP hw/mips/boston: Remove workaround for writes to ROM aborting exec: Don't reuse unassigned_mem_ops for io_mem_rom block/iscsi: only report an iSCSI Failure if we don't handle it gracefully block/iscsi: dont leave allocmap in an invalid state on UNMAP failure ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
23bafd75cd
48 changed files with 665 additions and 488 deletions
|
@ -31,9 +31,7 @@
|
|||
|
||||
#include "qemu/memfd.h"
|
||||
|
||||
#ifdef CONFIG_MEMFD
|
||||
#include <sys/memfd.h>
|
||||
#elif defined CONFIG_LINUX
|
||||
#if defined CONFIG_LINUX && !defined CONFIG_MEMFD
|
||||
#include <sys/syscall.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
|
|
|
@ -198,7 +198,6 @@ static int try_bind(int socket, InetSocketAddress *saddr, struct addrinfo *e)
|
|||
|
||||
static int inet_listen_saddr(InetSocketAddress *saddr,
|
||||
int port_offset,
|
||||
bool update_addr,
|
||||
Error **errp)
|
||||
{
|
||||
struct addrinfo ai,*res,*e;
|
||||
|
@ -326,15 +325,6 @@ listen_failed:
|
|||
return -1;
|
||||
|
||||
listen_ok:
|
||||
if (update_addr) {
|
||||
g_free(saddr->host);
|
||||
saddr->host = g_strdup(uaddr);
|
||||
g_free(saddr->port);
|
||||
saddr->port = g_strdup_printf("%d",
|
||||
inet_getport(e) - port_offset);
|
||||
saddr->has_ipv6 = saddr->ipv6 = e->ai_family == PF_INET6;
|
||||
saddr->has_ipv4 = saddr->ipv4 = e->ai_family != PF_INET6;
|
||||
}
|
||||
freeaddrinfo(res);
|
||||
return slisten;
|
||||
}
|
||||
|
@ -790,7 +780,6 @@ static int vsock_parse(VsockSocketAddress *addr, const char *str,
|
|||
#ifndef _WIN32
|
||||
|
||||
static int unix_listen_saddr(UnixSocketAddress *saddr,
|
||||
bool update_addr,
|
||||
Error **errp)
|
||||
{
|
||||
struct sockaddr_un un;
|
||||
|
@ -855,12 +844,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (update_addr && pathbuf) {
|
||||
g_free(saddr->path);
|
||||
saddr->path = pathbuf;
|
||||
} else {
|
||||
g_free(pathbuf);
|
||||
}
|
||||
g_free(pathbuf);
|
||||
return sock;
|
||||
|
||||
err:
|
||||
|
@ -920,7 +904,6 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
|
|||
#else
|
||||
|
||||
static int unix_listen_saddr(UnixSocketAddress *saddr,
|
||||
bool update_addr,
|
||||
Error **errp)
|
||||
{
|
||||
error_setg(errp, "unix sockets are not available on windows");
|
||||
|
@ -937,7 +920,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
|
|||
#endif
|
||||
|
||||
/* compatibility wrapper */
|
||||
int unix_listen(const char *str, char *ostr, int olen, Error **errp)
|
||||
int unix_listen(const char *str, Error **errp)
|
||||
{
|
||||
char *path, *optstr;
|
||||
int sock, len;
|
||||
|
@ -957,11 +940,7 @@ int unix_listen(const char *str, char *ostr, int olen, Error **errp)
|
|||
saddr->path = g_strdup(str);
|
||||
}
|
||||
|
||||
sock = unix_listen_saddr(saddr, true, errp);
|
||||
|
||||
if (sock != -1 && ostr) {
|
||||
snprintf(ostr, olen, "%s%s", saddr->path, optstr ? optstr : "");
|
||||
}
|
||||
sock = unix_listen_saddr(saddr, errp);
|
||||
|
||||
qapi_free_UnixSocketAddress(saddr);
|
||||
return sock;
|
||||
|
@ -1052,11 +1031,11 @@ int socket_listen(SocketAddress *addr, Error **errp)
|
|||
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_TYPE_INET:
|
||||
fd = inet_listen_saddr(&addr->u.inet, 0, false, errp);
|
||||
fd = inet_listen_saddr(&addr->u.inet, 0, errp);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_UNIX:
|
||||
fd = unix_listen_saddr(&addr->u.q_unix, false, errp);
|
||||
fd = unix_listen_saddr(&addr->u.q_unix, errp);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_FD:
|
||||
|
|
|
@ -479,15 +479,29 @@ static void __attribute__((constructor)) qemu_thread_atexit_init(void)
|
|||
}
|
||||
|
||||
|
||||
/* Attempt to set the threads name; note that this is for debug, so
|
||||
* we're not going to fail if we can't set it.
|
||||
*/
|
||||
static void qemu_thread_set_name(QemuThread *thread, const char *name)
|
||||
{
|
||||
#ifdef CONFIG_PTHREAD_SETNAME_NP
|
||||
pthread_setname_np(thread->thread, name);
|
||||
#endif
|
||||
typedef struct {
|
||||
void *(*start_routine)(void *);
|
||||
void *arg;
|
||||
char *name;
|
||||
} QemuThreadArgs;
|
||||
|
||||
static void *qemu_thread_start(void *args)
|
||||
{
|
||||
QemuThreadArgs *qemu_thread_args = args;
|
||||
void *(*start_routine)(void *) = qemu_thread_args->start_routine;
|
||||
void *arg = qemu_thread_args->arg;
|
||||
|
||||
/* Attempt to set the threads name; note that this is for debug, so
|
||||
* we're not going to fail if we can't set it.
|
||||
*/
|
||||
pthread_setname_np(pthread_self(), qemu_thread_args->name);
|
||||
g_free(qemu_thread_args->name);
|
||||
g_free(qemu_thread_args);
|
||||
return start_routine(arg);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void qemu_thread_create(QemuThread *thread, const char *name,
|
||||
void *(*start_routine)(void*),
|
||||
|
@ -502,23 +516,34 @@ void qemu_thread_create(QemuThread *thread, const char *name,
|
|||
error_exit(err, __func__);
|
||||
}
|
||||
|
||||
if (mode == QEMU_THREAD_DETACHED) {
|
||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||
}
|
||||
|
||||
/* Leave signal handling to the iothread. */
|
||||
sigfillset(&set);
|
||||
pthread_sigmask(SIG_SETMASK, &set, &oldset);
|
||||
err = pthread_create(&thread->thread, &attr, start_routine, arg);
|
||||
|
||||
#ifdef CONFIG_PTHREAD_SETNAME_NP
|
||||
if (name_threads) {
|
||||
QemuThreadArgs *qemu_thread_args;
|
||||
qemu_thread_args = g_new0(QemuThreadArgs, 1);
|
||||
qemu_thread_args->name = g_strdup(name);
|
||||
qemu_thread_args->start_routine = start_routine;
|
||||
qemu_thread_args->arg = arg;
|
||||
|
||||
err = pthread_create(&thread->thread, &attr,
|
||||
qemu_thread_start, qemu_thread_args);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
err = pthread_create(&thread->thread, &attr,
|
||||
start_routine, arg);
|
||||
}
|
||||
|
||||
if (err)
|
||||
error_exit(err, __func__);
|
||||
|
||||
if (name_threads) {
|
||||
qemu_thread_set_name(thread, name);
|
||||
}
|
||||
|
||||
if (mode == QEMU_THREAD_DETACHED) {
|
||||
err = pthread_detach(thread->thread);
|
||||
if (err) {
|
||||
error_exit(err, __func__);
|
||||
}
|
||||
}
|
||||
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
||||
|
||||
pthread_attr_destroy(&attr);
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
#include "qemu/atomic.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#if defined(CONFIG_MALLOC_TRIM)
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Global grace period counter. Bit 0 is always one in rcu_gp_ctr.
|
||||
|
@ -246,6 +249,9 @@ static void *call_rcu_thread(void *opaque)
|
|||
qemu_event_reset(&rcu_call_ready_event);
|
||||
n = atomic_read(&rcu_call_count);
|
||||
if (n == 0) {
|
||||
#if defined(CONFIG_MALLOC_TRIM)
|
||||
malloc_trim(4 * 1024 * 1024);
|
||||
#endif
|
||||
qemu_event_wait(&rcu_call_ready_event);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue