On 04/04/2017 14:31, Alex Bennée wrote: > > Paolo Bonzini <pbonz...@redhat.com> writes: > >> On 04/04/2017 12:46, Alex Bennée wrote: >>>> In theory the main-loop should be sequenced before or after vCPU events >>>> because of the BQL. I'm not sure why this is not currently the case. >>> >>> It seems cpu_handle_exception doesn't take the BQL until >>> replay_exception() has done its thing. This is fixable but the function >>> is a mess so I'm trying to neaten that up first. >> >> Long term neither cpu_handle_exception nor cpu_handle_interrupt need the >> BQL at all. > > Well for record/replay they might. Otherwise we end up moving the record > stream on even though a checkpoint might be being written by the > main-loop. > > As far as the cc->do_interrupt() stuff is concerned it will be guest > dependant because you could end up in device emulation code down this > path which must be protected by the BQL - the arm_gic code being a good > example.
I think recording an event could be split in two parts: - recording the (icount, event) tuple and getting back a unique event id - waiting for all events with lower event id to be complete before starting to process this one This doesn't require the BQL, you can use a condition variable on replay_lock (but you do need to unlock/lock the BQL around it if currently taken). The complicated part is ensuring that there are no deadlocks where the I/O thread needs the VCPU thread to proceed, but the VCPU thread is waiting on the I/O thread's event processing. Paolo