On Thu, Jan 27, 2011 at 02:09:56PM +0100, Jan Kiszka wrote: > 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@xxxxxxxxxxx> > --- > cpus.c | 88 ++++++++++++++++++++++++++++++++++++--------------------------- > 1 files changed, 50 insertions(+), 38 deletions(-) > > diff --git a/cpus.c b/cpus.c > index 9071848..558c0d3 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -261,6 +261,45 @@ static void qemu_kvm_init_cpu_signals(CPUState *env) > } > } > > +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; > @@ -292,6 +331,10 @@ static void qemu_event_increment(void) > static void qemu_kvm_init_cpu_signals(CPUState *env) > { > } > + > +static void qemu_kvm_eat_signals(CPUState *env) > +{ > +} > #endif /* _WIN32 */ > > #ifndef CONFIG_IOTHREAD > @@ -631,43 +674,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)) > @@ -932,6 +938,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) { > @@ -943,7 +951,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; > } As mentioned before, signal processing should be independent of cpu_can_run (still want to process SIGALRM if vm is stopped, for example). -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html