From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56969) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1agx7E-0000Y0-BV for qemu-devel@nongnu.org; Fri, 18 Mar 2016 12:19:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1agx7D-0002yi-BJ for qemu-devel@nongnu.org; Fri, 18 Mar 2016 12:19:08 -0400 Received: from mail-wm0-x22d.google.com ([2a00:1450:400c:c09::22d]:37534) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1agx7D-0002ya-1S for qemu-devel@nongnu.org; Fri, 18 Mar 2016 12:19:07 -0400 Received: by mail-wm0-x22d.google.com with SMTP id p65so44382067wmp.0 for ; Fri, 18 Mar 2016 09:19:06 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Fri, 18 Mar 2016 16:18:51 +0000 Message-Id: <1458317932-1875-11-git-send-email-alex.bennee@linaro.org> In-Reply-To: <1458317932-1875-1-git-send-email-alex.bennee@linaro.org> References: <1458317932-1875-1-git-send-email-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [RFC v1 10/11] tcg: grab iothread lock in cpu-exec interrupt handling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: mttcg@listserver.greensocs.com, fred.konrad@greensocs.com, a.rigo@virtualopensystems.com, serge.fdrv@gmail.com, cota@braap.org Cc: Peter Crosthwaite , mark.burton@greensocs.com, qemu-devel@nongnu.org, pbonzini@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Richard Henderson From: "Emilio G. Cota" Signed-off-by: Emilio G. Cota Signed-off-by: Alex Bennée --- v1 (ajb) - pulled from emilio/mttcg series --- cpu-exec.c | 33 +++++++++++++++++++++++++++------ include/qom/cpu.h | 1 + 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 76891fd..6acaf25 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -351,6 +351,29 @@ static void cpu_handle_debug_exception(CPUState *cpu) cc->debug_excp_handler(cpu); } +#ifdef CONFIG_SOFTMMU +static inline void cpu_exit_loop_lock(CPUState *cpu) +{ + qemu_mutex_lock_iothread(); + cpu->cpu_loop_exit_locked = true; +} + +static inline void cpu_exit_loop_lock_reset(CPUState *cpu) +{ + if (cpu->cpu_loop_exit_locked) { + cpu->cpu_loop_exit_locked = false; + qemu_mutex_unlock_iothread(); + } +} + +#else +static inline void cpu_exit_loop_lock(CPUState *cpu) +{ } + +static inline void cpu_exit_loop_lock_reset(CPUState *cpu) +{ } +#endif + /* main execution loop */ int cpu_exec(CPUState *cpu) @@ -450,12 +473,7 @@ int cpu_exec(CPUState *cpu) for(;;) { interrupt_request = cpu->interrupt_request; if (unlikely(interrupt_request)) { - /* FIXME: this needs to take the iothread lock. - * For this we need to find all places in - * cc->cpu_exec_interrupt that can call cpu_loop_exit, - * and call qemu_unlock_iothread_mutex() there. Else, - * add a flag telling cpu_loop_exit() to unlock it. - */ + cpu_exit_loop_lock(cpu); if (unlikely(cpu->singlestep_enabled & SSTEP_NOIRQ)) { /* Mask out external interrupts for this step. */ @@ -510,6 +528,8 @@ int cpu_exec(CPUState *cpu) next_tb = 0; } + cpu_exit_loop_lock_reset(cpu); + } if (unlikely(cpu->exit_request || replay_has_interrupt())) { @@ -630,6 +650,7 @@ int cpu_exec(CPUState *cpu) cpu->can_do_io = 1; tb_lock_reset(); + cpu_exit_loop_lock_reset(cpu); } } /* for(;;) */ diff --git a/include/qom/cpu.h b/include/qom/cpu.h index d6cb7b8..954d97d 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -295,6 +295,7 @@ struct CPUState { bool crash_occurred; bool exit_request; bool tb_invalidated_flag; + bool cpu_loop_exit_locked; uint32_t interrupt_request; int singlestep_enabled; int64_t icount_extra; -- 2.7.3