On Mon, Sep 19, 2016 at 14:50:56 +0200, Paolo Bonzini wrote:
> It is not necessary to hold qemu_cpu_list_mutex throughout the
> exclusive section, because no other exclusive section can run
> while pending_cpus != 0.
> 
> exclusive_idle() is called in cpu_exec_start(), and that prevents
> any CPUs created after start_exclusive() from entering cpu_exec()
> during an exclusive section.
> 
> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
> ---
>  cpus-common.c              | 6 ++++++
>  docs/tcg-exclusive.promela | 4 +++-
>  include/qom/cpu.h          | 4 ----
>  3 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/cpus-common.c b/cpus-common.c
> index 9225c65..6adc982 100644
> --- a/cpus-common.c
> +++ b/cpus-common.c
> @@ -191,11 +191,17 @@ void start_exclusive(void)
>      if (pending_cpus > 1) {
>          qemu_cond_wait(&exclusive_cond, &qemu_cpu_list_mutex);
>      }
> +
> +    /* Can release mutex, no one will enter another exclusive
> +     * section until end_exclusive resets pending_cpus to 0.
> +     */
> +    qemu_mutex_unlock(&qemu_cpu_list_mutex);
>  }
>  
>  /* Finish an exclusive operation.  Releases qemu_cpu_list_mutex.  */
>  void end_exclusive(void)
>  {
> +    qemu_mutex_lock(&qemu_cpu_list_mutex);
>      pending_cpus = 0;
>      qemu_cond_broadcast(&exclusive_resume);
>      qemu_mutex_unlock(&qemu_cpu_list_mutex);

The comments at the top of both start_exclusive and end_exclusive
should be updated.

                E.

Reply via email to