[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 23/38] cpu-exec: grab iothread lock during interrupt h
From: |
Emilio G. Cota |
Subject: |
[Qemu-devel] [RFC 23/38] cpu-exec: grab iothread lock during interrupt handling |
Date: |
Sun, 23 Aug 2015 20:23:52 -0400 |
Signed-off-by: Emilio G. Cota <address@hidden>
---
cpu-exec.c | 34 ++++++++++++++++++++++++++++------
include/qom/cpu.h | 1 +
2 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/cpu-exec.c b/cpu-exec.c
index fd57b9c..a1700ac 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -371,6 +371,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)
@@ -452,12 +475,8 @@ 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. */
interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK;
@@ -503,6 +522,8 @@ int cpu_exec(CPUState *cpu)
the program flow was changed */
next_tb = 0;
}
+
+ cpu_exit_loop_lock_reset(cpu);
}
if (unlikely(cpu->exit_request)) {
cpu->exception_index = EXCP_INTERRUPT;
@@ -609,6 +630,7 @@ int cpu_exec(CPUState *cpu)
env = &x86_cpu->env;
#endif
tb_lock_reset();
+ cpu_exit_loop_lock_reset(cpu);
}
} /* for(;;) */
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 1d97b63..dbe0438 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -270,6 +270,7 @@ struct CPUState {
bool created;
bool stop;
bool stopped;
+ bool cpu_loop_exit_locked;
volatile sig_atomic_t exit_request;
uint32_t interrupt_request;
int singlestep_enabled;
--
1.9.1
- [Qemu-devel] [RFC 17/38] aie: add target helpers, (continued)
- [Qemu-devel] [RFC 29/38] tcg: export have_tb_lock, Emilio G. Cota, 2015/08/23
- [Qemu-devel] [RFC 25/38] cpu: add barriers around cpu->tcg_exit_req, Emilio G. Cota, 2015/08/23
- [Qemu-devel] [RFC 23/38] cpu-exec: grab iothread lock during interrupt handling,
Emilio G. Cota <=
- [Qemu-devel] [RFC 24/38] cpu-exec: reset mmap_lock after exiting the CPU loop, Emilio G. Cota, 2015/08/23
- [Qemu-devel] [RFC 09/38] rcu: fix comment with s/rcu_gp_lock/rcu_registry_lock/, Emilio G. Cota, 2015/08/23
- [Qemu-devel] [RFC 30/38] translate-all: add tb_lock assertions, Emilio G. Cota, 2015/08/23
- [Qemu-devel] [RFC 26/38] cpu: protect tb_jmp_cache with seqlock, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 36/38] cputlb: use tcg_sched_work for tlb_flush_page_all, Emilio G. Cota, 2015/08/23