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 <[email protected]>
> ---
> 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.