[PATCH uq/master 0/3] Fix MSI injection at load time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Alexander Larsson reported a migration bug where after migration
the Windows virtio-serial driver was not able to read anymore, not seeing
the data from the host.  He debugged it and noticed that after migration
the virtio-serial driver ddid not respond to any irqs.

During restore we virtio_notify() on the serial device, which eventually
raises the pci irq level to 1. However, the driver is never notified
and thus never responds to this by reading the VIRTIO_PCI_ISR, so the
irq level is never cleared, and all later virtio_notify() do nothing.

A simplified reproducer (that doesn't hang Linux,
but shows the message) is to start the VM without a backend for the
virtserialport, and to resume it with a backend, for example

$ qemu-system-x86_64 -device virtio-serial-pci -device virtserialport test.img --enable-kvm -m 512
$ qemu-system-x86_64 -device virtio-serial-pci -chardev stdio,id=vs0 -device virtserialport,chardev=vs0 test.img --enable-kvm -m 512 -incoming 'exec:cat foo.ckp'

In fact, interrupt injection fails and reports correctly "KVM: injection
failed, MSI lost".  The reason for the failure is that the LAPIC doesn't
think it's enabled, which in turn is because the LAPIC is restored after
the CPU and, when restoring the CPU, a dummy post-reset state is passed
to the in-kernel APIC.

The fix for this is to let the APIC update its in-kernel counterpart
after loading.  Patches 1 and 2 change the hard-coded references to
kvm_get_apic_state and kvm_put_apic_state to methods in APICCommonClass.
This is useful because it lets APICCommon force an update of the in-kernel
state after load (patch 3).

Patches 4 and 5 similarly add get/put methods to the IOAPIC hierarchy,
which replace pre_save/post_load.

Paolo

Paolo Bonzini (5):
  kvm: move KVM_GET_LAPIC/KVM_SET_LAPIC to hw/kvm/apic.c
  apic: add get/put methods
  apic: always update the in-kernel status after loading
  ioapic: change pre_save/post_load methods to get/put
  ioapic: unify reset callbacks

 hw/apic.h            |    2 +
 hw/apic_common.c     |   33 ++++++++++++++++++++
 hw/apic_internal.h   |    2 +
 hw/ioapic.c          |    2 -
 hw/ioapic_common.c   |   42 +++++++++++++++++---------
 hw/ioapic_internal.h |    6 +--
 hw/kvm/apic.c        |   80 ++++++++++++++++++++++++++++----------------------
 hw/kvm/ioapic.c      |   13 +-------
 kvm.h                |    3 --
 target-i386/kvm.c    |   34 +--------------------
 10 files changed, 115 insertions(+), 102 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux