From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55400) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmkBQ-0000V0-IH for qemu-devel@nongnu.org; Wed, 21 Sep 2016 12:15:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmkBJ-0005Mx-Tn for qemu-devel@nongnu.org; Wed, 21 Sep 2016 12:15:39 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:51012) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmkBI-0005KA-Ae for qemu-devel@nongnu.org; Wed, 21 Sep 2016 12:15:33 -0400 Date: Wed, 21 Sep 2016 12:15:22 -0400 From: "Emilio G. Cota" Message-ID: <20160921161522.GC13385@flamenco> References: <1474289459-15242-1-git-send-email-pbonzini@redhat.com> <1474289459-15242-14-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1474289459-15242-14-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH 13/16] cpus-common: simplify locking for start_exclusive/end_exclusive List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org, serge.fdrv@gmail.com, alex.bennee@linaro.org, sergey.fedorov@linaro.org 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 > --- > 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.