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

Reply via email to