提交 55f8d6ac 编写于 作者: J Jan Kiszka 提交者: Marcelo Tosatti

Refactor signal setup functions in cpus.c

Move {tcg,kvm}_init_ipi and block_io_signals to avoid prototypes, rename
the former two to clarify that they deal with more than SIG_IPI. No
functional changes - except for the tiny fixup of strerror usage.

The forward declaration of sigbus_handler is just temporarily, it will
be moved in a succeeding patch. dummy_signal is moved into the !_WIN32
block as we will soon need it also for !CONFIG_IOTHREAD.
Signed-off-by: NJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: NMarcelo Tosatti <mtosatti@redhat.com>
上级 a1b87fe0
......@@ -222,7 +222,15 @@ fail:
close(fds[1]);
return err;
}
#else
#ifdef CONFIG_IOTHREAD
static void dummy_signal(int sig)
{
}
#endif
#else /* _WIN32 */
HANDLE qemu_event_handle;
static void dummy_event_handler(void *opaque)
......@@ -248,7 +256,7 @@ static void qemu_event_increment(void)
exit (1);
}
}
#endif
#endif /* _WIN32 */
#ifndef CONFIG_IOTHREAD
int qemu_init_main_loop(void)
......@@ -348,10 +356,6 @@ static QemuCond qemu_system_cond;
static QemuCond qemu_pause_cond;
static QemuCond qemu_work_cond;
static void tcg_init_ipi(void);
static void kvm_init_ipi(CPUState *env);
static sigset_t block_io_signals(void);
/* If we have signalfd, we mask out the signals we want to handle and then
* use signalfd to listen for them. We rely on whatever the current signal
* handler is to dispatch the signals when we receive them.
......@@ -387,6 +391,77 @@ static void sigfd_handler(void *opaque)
}
}
static void cpu_signal(int sig)
{
if (cpu_single_env) {
cpu_exit(cpu_single_env);
}
exit_request = 1;
}
static void qemu_kvm_init_cpu_signals(CPUState *env)
{
int r;
sigset_t set;
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = dummy_signal;
sigaction(SIG_IPI, &sigact, NULL);
pthread_sigmask(SIG_BLOCK, NULL, &set);
sigdelset(&set, SIG_IPI);
sigdelset(&set, SIGBUS);
r = kvm_set_signal_mask(env, &set);
if (r) {
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
exit(1);
}
}
static void qemu_tcg_init_cpu_signals(void)
{
sigset_t set;
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = cpu_signal;
sigaction(SIG_IPI, &sigact, NULL);
sigemptyset(&set);
sigaddset(&set, SIG_IPI);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
}
static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
void *ctx);
static sigset_t block_io_signals(void)
{
sigset_t set;
struct sigaction action;
/* SIGUSR2 used by posix-aio-compat.c */
sigemptyset(&set);
sigaddset(&set, SIGUSR2);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
sigemptyset(&set);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIG_IPI);
sigaddset(&set, SIGBUS);
pthread_sigmask(SIG_BLOCK, &set, NULL);
memset(&action, 0, sizeof(action));
action.sa_flags = SA_SIGINFO;
action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
sigaction(SIGBUS, &action, NULL);
prctl(PR_MCE_KILL, 1, 1, 0, 0);
return set;
}
static int qemu_signalfd_init(sigset_t mask)
{
int sigfd;
......@@ -615,7 +690,7 @@ static void *kvm_cpu_thread_fn(void *arg)
exit(1);
}
kvm_init_ipi(env);
qemu_kvm_init_cpu_signals(env);
/* signal CPU creation */
env->created = 1;
......@@ -638,7 +713,7 @@ static void *tcg_cpu_thread_fn(void *arg)
{
CPUState *env = arg;
tcg_init_ipi();
qemu_tcg_init_cpu_signals();
qemu_thread_self(env->thread);
/* signal CPU creation */
......@@ -679,77 +754,6 @@ int qemu_cpu_self(void *_env)
return qemu_thread_equal(&this, env->thread);
}
static void cpu_signal(int sig)
{
if (cpu_single_env)
cpu_exit(cpu_single_env);
exit_request = 1;
}
static void tcg_init_ipi(void)
{
sigset_t set;
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = cpu_signal;
sigaction(SIG_IPI, &sigact, NULL);
sigemptyset(&set);
sigaddset(&set, SIG_IPI);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
}
static void dummy_signal(int sig)
{
}
static void kvm_init_ipi(CPUState *env)
{
int r;
sigset_t set;
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = dummy_signal;
sigaction(SIG_IPI, &sigact, NULL);
pthread_sigmask(SIG_BLOCK, NULL, &set);
sigdelset(&set, SIG_IPI);
sigdelset(&set, SIGBUS);
r = kvm_set_signal_mask(env, &set);
if (r) {
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(r));
exit(1);
}
}
static sigset_t block_io_signals(void)
{
sigset_t set;
struct sigaction action;
/* SIGUSR2 used by posix-aio-compat.c */
sigemptyset(&set);
sigaddset(&set, SIGUSR2);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
sigemptyset(&set);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIG_IPI);
sigaddset(&set, SIGBUS);
pthread_sigmask(SIG_BLOCK, &set, NULL);
memset(&action, 0, sizeof(action));
action.sa_flags = SA_SIGINFO;
action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
sigaction(SIGBUS, &action, NULL);
prctl(PR_MCE_KILL, 1, 1, 0, 0);
return set;
}
void qemu_mutex_lock_iothread(void)
{
if (kvm_enabled()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册