On 04/04/2017 07:37, Pavel Dovgalyuk wrote:
>> -        icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
>> +        /* Take into account what has run */
>> +        icount += cpu_get_icount_executed(cpu);
>>      }
>>      return icount;
> As far, as I understand, this one will return the same value in iothread
> until vCPU thread finishes cpu_exec?
> This value will not jump forward and backward, but still will not allow
> making execution deterministic.
> 
> Consider the following scenarios:
> 
> First:
> vCPU            iothread
> access HW       ----
> ...             access HW in timer
> 
> Second:
> vCPU            iothread
> ...             access HW in timer
> access HW       ----
> 
> These scenarios will generate the same order of events in the log.
> Synchronization checkpoint in iothread will try to write already
> executed instructions, but it does not have access to current_cpu
> and the icount value will point to the "past" - it will have less
> instructions than already executed.

The actual access should be covered by a lock, but I think you're right
that the two threads can be nondeterministically off by one instruction,
even if we make gen_io_start update timers_state.qemu_icount atomically.

Paolo

Reply via email to