> From: Paolo Bonzini [mailto:[email protected]]
> On 19/01/2018 09:44, Pavel Dovgalyuk wrote:
> > while (all_cpu_threads_idle()) {
> > + qemu_mutex_lock_iothread();
> > stop_tcg_kick_timer();
> > qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
> > + qemu_mutex_unlock_iothread();
> > }
>
> cpu_has_work cannot be called outside BQL yet. You first need to access
> cpu->interrupt_request with atomics.
>
> In general, testing the condition outside the mutex is a very dangerous
> pattern (and I'm usually the one who enjoys dangerous patterns).
It means, that I'll have to fix all the has_work function to avoid races,
because x86_cpu_has_work may have them?
static bool x86_cpu_has_work(CPUState *cs)
{
X86CPU *cpu = X86_CPU(cs);
CPUX86State *env = &cpu->env;
return ((cs->interrupt_request & (CPU_INTERRUPT_HARD |
CPU_INTERRUPT_POLL)) &&
(env->eflags & IF_MASK)) ||
(cs->interrupt_request & (CPU_INTERRUPT_NMI |
CPU_INTERRUPT_INIT |
CPU_INTERRUPT_SIPI |
CPU_INTERRUPT_MCE)) ||
((cs->interrupt_request & CPU_INTERRUPT_SMI) &&
!(env->hflags & HF_SMM_MASK));
}
Pavel Dovgalyuk