On 09/08/2016 09:49, Gonglei wrote: > (commit 80dcfb8532ae76343109a48f12ba8ca1c505c179) > Upon migration, the code use a timer based on vm_clock for 1ns > in the future from post_load to do the event send in case host_connected > differs between migration source and target. > > However, it's not guaranteed that the apic is ready to inject irqs into > the guest, and the irq line remained high, resulting in any future interrupts > going unnoticed by the guest as well. > > That's because 1) the migration coroutine is not blocked when it get EAGAIN > while reading QEMUFile. 2) The vm_clock is enabled default currently, it > doesn't > rely on the calling of vm_start(), that means vm_clock timers can run before > VCPUs are running. > > So, let's set the vm_clock disabled default, keep the initial intention of > design for vm_clock timers. > > Meanwhile, change the test-aio usecase, using QEMU_CLOCK_REALTIME instead of > QEMU_CLOCK_VIRTUAL as the block code does. > > CC: Paolo Bonzini <pbonz...@redhat.com> > CC: Dr. David Alan Gilbert <dgilb...@redhat.com> > CC: qemu-sta...@nongnu.org > Signed-off-by: Gonglei <arei.gong...@huawei.com> > --- > qemu-timer.c | 2 +- > tests/test-aio.c | 4 ++-- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/qemu-timer.c b/qemu-timer.c > index eb22e92..9299cdc 100644 > --- a/qemu-timer.c > +++ b/qemu-timer.c > @@ -129,7 +129,7 @@ static void qemu_clock_init(QEMUClockType type) > assert(main_loop_tlg.tl[type] == NULL); > > clock->type = type; > - clock->enabled = true; > + clock->enabled = (type == QEMU_CLOCK_VIRTUAL ? false : true); > clock->last = INT64_MIN; > QLIST_INIT(&clock->timerlists); > notifier_list_init(&clock->reset_notifiers); > diff --git a/tests/test-aio.c b/tests/test-aio.c > index 982339c..03aa846 100644 > --- a/tests/test-aio.c > +++ b/tests/test-aio.c > @@ -452,7 +452,7 @@ static void test_timer_schedule(void) > { > TimerTestData data = { .n = 0, .ctx = ctx, .ns = SCALE_MS * 750LL, > .max = 2, > - .clock_type = QEMU_CLOCK_VIRTUAL }; > + .clock_type = QEMU_CLOCK_REALTIME }; > EventNotifier e; > > /* aio_poll will not block to wait for timers to complete unless it has > @@ -782,7 +782,7 @@ static void test_source_timer_schedule(void) > { > TimerTestData data = { .n = 0, .ctx = ctx, .ns = SCALE_MS * 750LL, > .max = 2, > - .clock_type = QEMU_CLOCK_VIRTUAL }; > + .clock_type = QEMU_CLOCK_REALTIME }; > EventNotifier e; > int64_t expiry; > >
Good fix! I'll queue it for 2.7. Paolo