On 21/09/2016 18:15, Emilio G. Cota wrote: > 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. >
Ok. Paolo