From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD Date: Tue, 01 Feb 2011 14:21:22 +0100 Message-ID: <4D4808D2.4070509@siemens.com> References: <0e59ec643d0d2abfb497091672daa9e8ae7f0353.1296133797.git.jan.kiszka@siemens.com> <20110201123835.GA12439@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Avi Kivity , "kvm@vger.kernel.org" , "qemu-devel@nongnu.org" To: Marcelo Tosatti Return-path: Received: from goliath.siemens.de ([192.35.17.28]:19040 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753088Ab1BANVj (ORCPT ); Tue, 1 Feb 2011 08:21:39 -0500 In-Reply-To: <20110201123835.GA12439@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: 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 >> --- >> 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 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=60758 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PkGAi-00024Y-Ap for qemu-devel@nongnu.org; Tue, 01 Feb 2011 08:21:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PkGAg-0007Js-Nh for qemu-devel@nongnu.org; Tue, 01 Feb 2011 08:21:28 -0500 Received: from goliath.siemens.de ([192.35.17.28]:16867) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PkGAg-0007Jg-DY for qemu-devel@nongnu.org; Tue, 01 Feb 2011 08:21:26 -0500 Message-ID: <4D4808D2.4070509@siemens.com> Date: Tue, 01 Feb 2011 14:21:22 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <0e59ec643d0d2abfb497091672daa9e8ae7f0353.1296133797.git.jan.kiszka@siemens.com> <20110201123835.GA12439@amt.cnet> In-Reply-To: <20110201123835.GA12439@amt.cnet> Content-Type: text/plain; charset=ISO-8859-1 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: Marcelo Tosatti Cc: Avi Kivity , "kvm@vger.kernel.org" , "qemu-devel@nongnu.org" 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 >> --- >> 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