On 2011-02-01 13:38, Marcelo Tosatti wrote: > 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). > For those signals that matter, it is. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux -- 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