> From: Kevin Wolf [mailto:kw...@redhat.com] > Am 16.02.2016 um 12:20 hat Pavel Dovgalyuk geschrieben: > > Coroutine Replay > > bool *done = req_replayed_list_get(reqid) // NULL > > co = > req_completed_list_get(e.reqid); // NULL > > There was no yield, this context switch is impossible to happen. Same > for the switch back. > > > req_completed_list_insert(reqid, qemu_coroutine_self()); > > qemu_coroutine_yield(); > > This is the point at which a context switch happens. The only other > point in my code is the qemu_coroutine_enter() in the other function.
I've fixed aio_poll problem by disabling mutex lock for the replay_run_block_event() execution. Now virtual machine deterministically runs 4e8 instructions of Windows XP booting. But then one non-deterministic event happens. Callback after finishing coroutine may be called from different contexts. apic_update_irq() function behaves differently being called from vcpu and io threads. In one case it sets CPU_INTERRUPT_POLL and in other - nothing happens. Therefore execution becomes non-deterministic. In previous version of the patch I solved this problem by linking block events to the execution checkpoints. IO thread have its own checkpoints and vcpu - its own. Therefore apic callbacks are always called from the same thread in replay as in recording phase. Pavel Dovgalyuk