From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD Date: Fri, 28 Jan 2011 09:09:58 +0100 Message-ID: <4D4279D6.5020303@redhat.com> References: <0e59ec643d0d2abfb497091672daa9e8ae7f0353.1296133797.git.jan.kiszka@siemens.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Avi Kivity , Marcelo Tosatti , kvm@vger.kernel.org, qemu-devel@nongnu.org To: Jan Kiszka Return-path: Received: from mail-wy0-f174.google.com ([74.125.82.174]:42534 "EHLO mail-wy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754066Ab1A1IKN (ORCPT ); Fri, 28 Jan 2011 03:10:13 -0500 Received: by wyb28 with SMTP id 28so2940600wyb.19 for ; Fri, 28 Jan 2011 00:10:11 -0800 (PST) In-Reply-To: <0e59ec643d0d2abfb497091672daa9e8ae7f0353.1296133797.git.jan.kiszka@siemens.com> Sender: kvm-owner@vger.kernel.org List-ID: On 01/27/2011 02:09 PM, 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 > --- > 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; > } > } else if (env->stop) { Reviewed-by: Paolo Bonzini Paolo From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=51151 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PijPl-0003J6-UT for qemu-devel@nongnu.org; Fri, 28 Jan 2011 03:11:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PijPI-0004UU-VE for qemu-devel@nongnu.org; Fri, 28 Jan 2011 03:10:14 -0500 Received: from mail-wy0-f173.google.com ([74.125.82.173]:50265) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PijPI-0004UK-Ja for qemu-devel@nongnu.org; Fri, 28 Jan 2011 03:10:12 -0500 Received: by wyg36 with SMTP id 36so3029796wyg.4 for ; Fri, 28 Jan 2011 00:10:11 -0800 (PST) Sender: Paolo Bonzini Message-ID: <4D4279D6.5020303@redhat.com> Date: Fri, 28 Jan 2011 09:09:58 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <0e59ec643d0d2abfb497091672daa9e8ae7f0353.1296133797.git.jan.kiszka@siemens.com> In-Reply-To: <0e59ec643d0d2abfb497091672daa9e8ae7f0353.1296133797.git.jan.kiszka@siemens.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Marcelo Tosatti , Avi Kivity , kvm@vger.kernel.org, qemu-devel@nongnu.org On 01/27/2011 02:09 PM, 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 > --- > 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; > } > } else if (env->stop) { Reviewed-by: Paolo Bonzini Paolo