From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41398) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUOPi-0002dk-Fv for qemu-devel@nongnu.org; Tue, 25 Aug 2015 20:18:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZUOPh-0000PA-Ia for qemu-devel@nongnu.org; Tue, 25 Aug 2015 20:18:02 -0400 Received: from mail-wi0-x230.google.com ([2a00:1450:400c:c05::230]:34891) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUOPh-0000Ok-B6 for qemu-devel@nongnu.org; Tue, 25 Aug 2015 20:18:01 -0400 Received: by wicne3 with SMTP id ne3so29607341wic.0 for ; Tue, 25 Aug 2015 17:18:00 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 26 Aug 2015 02:17:44 +0200 Message-Id: <1440548265-4755-9-git-send-email-pbonzini@redhat.com> In-Reply-To: <1440548265-4755-1-git-send-email-pbonzini@redhat.com> References: <1440548265-4755-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 8/9] use qemu_cpu_kick instead of cpu_exit or qemu_cpu_kick_thread List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mttcg@greensocs.com, cota@braap.org, rth@twiddle.net Use the same API to trigger interruption of a CPU, no matter if under TCG or KVM. There is no difference: these calls come from the CPU thread, so the qemu_cpu_kick calls will send a signal to the running thread and it will be processed synchronously, just like a call to cpu_exit. The only difference is in the overhead, but neither call to cpu_exit (now qemu_cpu_kick) is in a hot path. Signed-off-by: Paolo Bonzini --- cpus.c | 17 ++++++++--------- gdbstub.c | 2 +- hw/ppc/spapr_rtas.c | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/cpus.c b/cpus.c index 783ef00..8243b2c 100644 --- a/cpus.c +++ b/cpus.c @@ -1101,6 +1101,12 @@ static void qemu_cpu_kick_thread(CPUState *cpu) #ifndef _WIN32 int err; + if (!tcg_enabled()) { + if (cpu->thread_kicked) { + return; + } + cpu->thread_kicked = true; + } err = pthread_kill(cpu->thread->thread, SIG_IPI); if (err) { fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); @@ -1138,21 +1144,14 @@ static void qemu_cpu_kick_thread(CPUState *cpu) void qemu_cpu_kick(CPUState *cpu) { qemu_cond_broadcast(cpu->halt_cond); - if (!tcg_enabled() && !cpu->thread_kicked) { - qemu_cpu_kick_thread(cpu); - cpu->thread_kicked = true; - } + qemu_cpu_kick_thread(cpu); } void qemu_cpu_kick_self(void) { #ifndef _WIN32 assert(current_cpu); - - if (!current_cpu->thread_kicked) { - qemu_cpu_kick_thread(current_cpu); - current_cpu->thread_kicked = true; - } + qemu_cpu_kick_thread(current_cpu); #else abort(); #endif diff --git a/gdbstub.c b/gdbstub.c index ffe7e6e..a5a173a 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1362,7 +1362,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...) is still in the running state, which can cause packets to be dropped and state transition 'T' packets to be sent while the syscall is still being processed. */ - cpu_exit(s->c_cpu); + qemu_cpu_kick(s->c_cpu); #endif } diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 2986f94..9869bc9 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -214,7 +214,7 @@ static void rtas_stop_self(PowerPCCPU *cpu, sPAPRMachineState *spapr, CPUPPCState *env = &cpu->env; cs->halted = 1; - cpu_exit(cs); + qemu_cpu_kick(cs); /* * While stopping a CPU, the guest calls H_CPPR which * effectively disables interrupts on XICS level. -- 2.4.3