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).

But also, taking a slightly wider look:

>  static void qemu_tcg_rr_wait_io_event(CPUState *cpu)
>  {
>      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();
>      }
>  
>      start_tcg_kick_timer();
>  
>      qemu_wait_io_event_common(cpu);
> -
> -    qemu_mutex_unlock_iothread();
>  }
>  

You are adding a qemu_mutex_lock_iothread to a function that wasn't
there before.  Either it was broken before, or it is now.

Paolo

Reply via email to