From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: [PATCH 06/18] kvm: Refactor qemu_kvm_eat_signals Date: Mon, 10 Jan 2011 09:31:59 +0100 Message-ID: <8630ac717d7c3fefaf091b70feaf17e63c411c26.1294648329.git.jan.kiszka@web.de> References: Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org To: Avi Kivity , Marcelo Tosatti Return-path: Received: from fmmailgate02.web.de ([217.72.192.227]:50004 "EHLO fmmailgate02.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751849Ab1AJIcV (ORCPT ); Mon, 10 Jan 2011 03:32:21 -0500 In-Reply-To: In-Reply-To: References: Sender: kvm-owner@vger.kernel.org List-ID: From: Jan Kiszka We do not use the timeout, so drop its logic. As we always poll our signals, we do not need to drop the global lock. Removing those calls allows some further simplifications. Also fix the error processing of sigpending at this chance. Signed-off-by: Jan Kiszka --- cpus.c | 23 +++++++---------------- 1 files changed, 7 insertions(+), 16 deletions(-) diff --git a/cpus.c b/cpus.c index bf0fb85..6da0f8f 100644 --- a/cpus.c +++ b/cpus.c @@ -617,31 +617,22 @@ static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo, } } -static void qemu_kvm_eat_signal(CPUState *env, int timeout) +static void qemu_kvm_eat_signals(CPUState *env) { - struct timespec ts; - int r, e; + struct timespec ts = { 0, 0 }; siginfo_t siginfo; sigset_t waitset; sigset_t chkset; - - ts.tv_sec = timeout / 1000; - ts.tv_nsec = (timeout % 1000) * 1000000; + int r; sigemptyset(&waitset); sigaddset(&waitset, SIG_IPI); sigaddset(&waitset, SIGBUS); do { - qemu_mutex_unlock(&qemu_global_mutex); - r = sigtimedwait(&waitset, &siginfo, &ts); - e = errno; - - qemu_mutex_lock(&qemu_global_mutex); - - if (r == -1 && !(e == EAGAIN || e == EINTR)) { - fprintf(stderr, "sigtimedwait: %s\n", strerror(e)); + if (r == -1 && !(errno == EAGAIN || errno == EINTR)) { + perror("sigtimedwait"); exit(1); } @@ -657,7 +648,7 @@ static void qemu_kvm_eat_signal(CPUState *env, int timeout) r = sigpending(&chkset); if (r == -1) { - fprintf(stderr, "sigpending: %s\n", strerror(e)); + perror("sigpending"); exit(1); } } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS)); @@ -668,7 +659,7 @@ static void qemu_kvm_wait_io_event(CPUState *env) while (!cpu_has_work(env)) qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000); - qemu_kvm_eat_signal(env, 0); + qemu_kvm_eat_signals(env); qemu_wait_io_event_common(env); } -- 1.7.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=52213 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PcDAv-0003cx-2w for qemu-devel@nongnu.org; Mon, 10 Jan 2011 03:32:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PcDAs-0006N5-Ft for qemu-devel@nongnu.org; Mon, 10 Jan 2011 03:32:24 -0500 Received: from fmmailgate02.web.de ([217.72.192.227]:50007) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PcDAr-0006MR-Ks for qemu-devel@nongnu.org; Mon, 10 Jan 2011 03:32:22 -0500 From: Jan Kiszka Date: Mon, 10 Jan 2011 09:31:59 +0100 Message-Id: <8630ac717d7c3fefaf091b70feaf17e63c411c26.1294648329.git.jan.kiszka@web.de> In-Reply-To: References: In-Reply-To: References: Sender: jan.kiszka@web.de Subject: [Qemu-devel] [PATCH 06/18] kvm: Refactor qemu_kvm_eat_signals List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Avi Kivity , Marcelo Tosatti Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org From: Jan Kiszka We do not use the timeout, so drop its logic. As we always poll our signals, we do not need to drop the global lock. Removing those calls allows some further simplifications. Also fix the error processing of sigpending at this chance. Signed-off-by: Jan Kiszka --- cpus.c | 23 +++++++---------------- 1 files changed, 7 insertions(+), 16 deletions(-) diff --git a/cpus.c b/cpus.c index bf0fb85..6da0f8f 100644 --- a/cpus.c +++ b/cpus.c @@ -617,31 +617,22 @@ static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo, } } -static void qemu_kvm_eat_signal(CPUState *env, int timeout) +static void qemu_kvm_eat_signals(CPUState *env) { - struct timespec ts; - int r, e; + struct timespec ts = { 0, 0 }; siginfo_t siginfo; sigset_t waitset; sigset_t chkset; - - ts.tv_sec = timeout / 1000; - ts.tv_nsec = (timeout % 1000) * 1000000; + int r; sigemptyset(&waitset); sigaddset(&waitset, SIG_IPI); sigaddset(&waitset, SIGBUS); do { - qemu_mutex_unlock(&qemu_global_mutex); - r = sigtimedwait(&waitset, &siginfo, &ts); - e = errno; - - qemu_mutex_lock(&qemu_global_mutex); - - if (r == -1 && !(e == EAGAIN || e == EINTR)) { - fprintf(stderr, "sigtimedwait: %s\n", strerror(e)); + if (r == -1 && !(errno == EAGAIN || errno == EINTR)) { + perror("sigtimedwait"); exit(1); } @@ -657,7 +648,7 @@ static void qemu_kvm_eat_signal(CPUState *env, int timeout) r = sigpending(&chkset); if (r == -1) { - fprintf(stderr, "sigpending: %s\n", strerror(e)); + perror("sigpending"); exit(1); } } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS)); @@ -668,7 +659,7 @@ static void qemu_kvm_wait_io_event(CPUState *env) while (!cpu_has_work(env)) qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000); - qemu_kvm_eat_signal(env, 0); + qemu_kvm_eat_signals(env); qemu_wait_io_event_common(env); } -- 1.7.1