Message ID | 20181025144644.15464-29-cota@braap.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [RFC,v4,01/71] cpu: convert queued work to a QSIMPLEQ | expand |
On 10/25/18 3:46 PM, Emilio G. Cota wrote: > Signed-off-by: Emilio G. Cota <cota@braap.org> > --- > accel/tcg/cpu-exec.c | 24 ++++++++++++++++++++---- > 1 file changed, 20 insertions(+), 4 deletions(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
Emilio G. Cota <cota@braap.org> writes: > Signed-off-by: Emilio G. Cota <cota@braap.org> > --- > accel/tcg/cpu-exec.c | 24 ++++++++++++++++++++---- > 1 file changed, 20 insertions(+), 4 deletions(-) > > diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c > index 870027d435..f37c9b1e94 100644 > --- a/accel/tcg/cpu-exec.c > +++ b/accel/tcg/cpu-exec.c > @@ -422,14 +422,20 @@ static inline TranslationBlock *tb_find(CPUState *cpu, > return tb; > } > > -static inline bool cpu_handle_halt(CPUState *cpu) > +static inline bool cpu_handle_halt_locked(CPUState *cpu) > { > - if (cpu->halted) { > + g_assert(cpu_mutex_locked(cpu)); > + > + if (cpu_halted(cpu)) { > #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY) > if ((cpu->interrupt_request & CPU_INTERRUPT_POLL) > && replay_interrupt()) { > X86CPU *x86_cpu = X86_CPU(cpu); > + > + cpu_mutex_unlock(cpu); > qemu_mutex_lock_iothread(); > + cpu_mutex_lock(cpu); > + I think we need a comment or reference to the locking rules for this case here. > apic_poll_irq(x86_cpu->apic_state); > cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL); > qemu_mutex_unlock_iothread(); > @@ -439,12 +445,22 @@ static inline bool cpu_handle_halt(CPUState *cpu) > return true; > } > > - cpu->halted = 0; > + cpu_halted_set(cpu, 0); > } > > return false; > } > > +static inline bool cpu_handle_halt(CPUState *cpu) > +{ > + bool ret; > + > + cpu_mutex_lock(cpu); > + ret = cpu_handle_halt_locked(cpu); > + cpu_mutex_unlock(cpu); > + return ret; > +} > + > static inline void cpu_handle_debug_exception(CPUState *cpu) > { > CPUClass *cc = CPU_GET_CLASS(cpu); > @@ -543,7 +559,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu, > } else if (interrupt_request & CPU_INTERRUPT_HALT) { > replay_interrupt(); > cpu->interrupt_request &= ~CPU_INTERRUPT_HALT; > - cpu->halted = 1; > + cpu_halted_set(cpu, 1); > cpu->exception_index = EXCP_HLT; > qemu_mutex_unlock_iothread(); > return true; -- Alex Bennée
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c index 870027d435..f37c9b1e94 100644 --- a/accel/tcg/cpu-exec.c +++ b/accel/tcg/cpu-exec.c @@ -422,14 +422,20 @@ static inline TranslationBlock *tb_find(CPUState *cpu, return tb; } -static inline bool cpu_handle_halt(CPUState *cpu) +static inline bool cpu_handle_halt_locked(CPUState *cpu) { - if (cpu->halted) { + g_assert(cpu_mutex_locked(cpu)); + + if (cpu_halted(cpu)) { #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY) if ((cpu->interrupt_request & CPU_INTERRUPT_POLL) && replay_interrupt()) { X86CPU *x86_cpu = X86_CPU(cpu); + + cpu_mutex_unlock(cpu); qemu_mutex_lock_iothread(); + cpu_mutex_lock(cpu); + apic_poll_irq(x86_cpu->apic_state); cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL); qemu_mutex_unlock_iothread(); @@ -439,12 +445,22 @@ static inline bool cpu_handle_halt(CPUState *cpu) return true; } - cpu->halted = 0; + cpu_halted_set(cpu, 0); } return false; } +static inline bool cpu_handle_halt(CPUState *cpu) +{ + bool ret; + + cpu_mutex_lock(cpu); + ret = cpu_handle_halt_locked(cpu); + cpu_mutex_unlock(cpu); + return ret; +} + static inline void cpu_handle_debug_exception(CPUState *cpu) { CPUClass *cc = CPU_GET_CLASS(cpu); @@ -543,7 +559,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu, } else if (interrupt_request & CPU_INTERRUPT_HALT) { replay_interrupt(); cpu->interrupt_request &= ~CPU_INTERRUPT_HALT; - cpu->halted = 1; + cpu_halted_set(cpu, 1); cpu->exception_index = EXCP_HLT; qemu_mutex_unlock_iothread(); return true;
Signed-off-by: Emilio G. Cota <cota@braap.org> --- accel/tcg/cpu-exec.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)