[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/37] kvm: Call qemu_kvm_eat_signals also under !CO
From: |
Marcelo Tosatti |
Subject: |
[Qemu-devel] [PATCH 14/37] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD |
Date: |
Mon, 14 Feb 2011 13:22:43 -0200 |
From: Jan Kiszka <address@hidden>
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 <address@hidden>
Signed-off-by: Marcelo Tosatti <address@hidden>
---
cpus.c | 90 +++++++++++++++++++++++++++++++++++++---------------------------
1 files changed, 52 insertions(+), 38 deletions(-)
diff --git a/cpus.c b/cpus.c
index d9c9111..f2ec74c 100644
--- a/cpus.c
+++ b/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) {
--
1.7.4
- [Qemu-devel] [PATCH 03/37] Process vmstop requests in IO thread, (continued)
- [Qemu-devel] [PATCH 03/37] Process vmstop requests in IO thread, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 19/37] kvm: Unconditionally reenter kernel after IO exits, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 09/37] kvm: Handle kvm_init_vcpu errors, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 12/37] kvm: Set up signal mask also for !CONFIG_IOTHREAD, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 20/37] kvm: Remove static return code of kvm_handle_io, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 35/37] cirrus: Remove obsolete kvm.h include, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 28/37] Move debug exception handling out of cpu_exec, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 07/37] kvm: Report proper error on GET_VCPU_MMAP_SIZE failures, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 11/37] Refactor signal setup functions in cpus.c, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 23/37] Refactor kvm&tcg function names in cpus.c, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 14/37] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD,
Marcelo Tosatti <=
- [Qemu-devel] [PATCH 15/37] Set up signalfd under !CONFIG_IOTHREAD, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 02/37] Stop current VCPU on synchronous reset requests, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 22/37] kvm: make tsc stable over migration and machine start, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 04/37] Trigger exit from cpu_exec_all on pending IO events, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 34/37] Introduce log_start/log_stop in CPUPhysMemoryClient, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 16/37] kvm: Fix race between timer signals and vcpu entry under !IOTHREAD, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 17/37] kvm: Add MCE signal support for !CONFIG_IOTHREAD, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 37/37] kvm: x86: Introduce kvmclock device to save/restore its state, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 30/37] kvm: x86: Prepare VCPU loop for in-kernel irqchip, Marcelo Tosatti, 2011/02/14
- [Qemu-devel] [PATCH 31/37] kvm: Drop return values from kvm_arch_pre/post_run, Marcelo Tosatti, 2011/02/14