kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD
Move qemu_kvm_eat_signals around and call it also when the IO-thread is not used. Do not yet process SIGBUS, will be armed in a separate step. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
5db5bdacdf
commit
9a36085b86
90
cpus.c
90
cpus.c
@ -227,6 +227,47 @@ static void dummy_signal(int sig)
|
||||
{
|
||||
}
|
||||
|
||||
static void sigbus_reraise(void);
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
struct timespec ts = { 0, 0 };
|
||||
siginfo_t siginfo;
|
||||
sigset_t waitset;
|
||||
sigset_t chkset;
|
||||
int r;
|
||||
|
||||
sigemptyset(&waitset);
|
||||
sigaddset(&waitset, SIG_IPI);
|
||||
sigaddset(&waitset, SIGBUS);
|
||||
|
||||
do {
|
||||
r = sigtimedwait(&waitset, &siginfo, &ts);
|
||||
if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
|
||||
perror("sigtimedwait");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
switch (r) {
|
||||
#ifdef CONFIG_IOTHREAD
|
||||
case SIGBUS:
|
||||
if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
|
||||
sigbus_reraise();
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
r = sigpending(&chkset);
|
||||
if (r == -1) {
|
||||
perror("sigpending");
|
||||
exit(1);
|
||||
}
|
||||
} while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
|
||||
}
|
||||
|
||||
#else /* _WIN32 */
|
||||
|
||||
HANDLE qemu_event_handle;
|
||||
@ -254,6 +295,10 @@ static void qemu_event_increment(void)
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifndef CONFIG_IOTHREAD
|
||||
@ -644,43 +689,6 @@ static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
|
||||
}
|
||||
}
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
struct timespec ts = { 0, 0 };
|
||||
siginfo_t siginfo;
|
||||
sigset_t waitset;
|
||||
sigset_t chkset;
|
||||
int r;
|
||||
|
||||
sigemptyset(&waitset);
|
||||
sigaddset(&waitset, SIG_IPI);
|
||||
sigaddset(&waitset, SIGBUS);
|
||||
|
||||
do {
|
||||
r = sigtimedwait(&waitset, &siginfo, &ts);
|
||||
if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
|
||||
perror("sigtimedwait");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
switch (r) {
|
||||
case SIGBUS:
|
||||
if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
|
||||
sigbus_reraise();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
r = sigpending(&chkset);
|
||||
if (r == -1) {
|
||||
perror("sigpending");
|
||||
exit(1);
|
||||
}
|
||||
} while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
|
||||
}
|
||||
|
||||
static void qemu_kvm_wait_io_event(CPUState *env)
|
||||
{
|
||||
while (!cpu_has_work(env))
|
||||
@ -953,6 +961,8 @@ static int qemu_cpu_exec(CPUState *env)
|
||||
|
||||
bool cpu_exec_all(void)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (next_cpu == NULL)
|
||||
next_cpu = first_cpu;
|
||||
for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu) {
|
||||
@ -964,7 +974,11 @@ bool cpu_exec_all(void)
|
||||
if (qemu_alarm_pending())
|
||||
break;
|
||||
if (cpu_can_run(env)) {
|
||||
if (qemu_cpu_exec(env) == EXCP_DEBUG) {
|
||||
r = qemu_cpu_exec(env);
|
||||
if (kvm_enabled()) {
|
||||
qemu_kvm_eat_signals(env);
|
||||
}
|
||||
if (r == EXCP_DEBUG) {
|
||||
break;
|
||||
}
|
||||
} else if (env->stop) {
|
||||
|
Loading…
Reference in New Issue
Block a user