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.