Fix kvm migration with empty virtio-scsi controller (bz #1032208)

This commit is contained in:
Cole Robinson 2014-03-13 17:04:04 -04:00
parent a1a30f03ef
commit dbf06d5f1b
2 changed files with 64 additions and 1 deletions

View File

@ -0,0 +1,54 @@
From 5f2d17d35b2339526f3b3d580b279ea78e406a25 Mon Sep 17 00:00:00 2001
Message-Id: <5f2d17d35b2339526f3b3d580b279ea78e406a25.1394734933.git.crobinso@redhat.com>
From: Laszlo Ersek <lersek@redhat.com>
Date: Wed, 15 Jan 2014 02:48:40 +0100
Subject: [PATCH] init_virtio_scsi(): reset the HBA before freeing its virtio
ring
When init_virtio_scsi() finds no SCSI targets connected to the HBA, it
frees the virtio ring. Other code in SeaBIOS proceeds to overwrite the
area. However, the ring is in use by qemu at that point -- not only did we
report the (ACK|DRIVER|DRIVER_OK) status earlier, we even communicated
over the ring.
Of course SeaBIOS doesn't "kick" the HBA ever again, hence qemu has no
reason to look at the ring. However, when qemu uses KVM acceleration, and
ioeventfd is enabled for the HBA, then a vmstate change to "running"
(including stop->cont monitor commands and incoming migration) "forces" a
kick (see qemu commit 25db9ebe). Qemu then tries to interpret whatever
unrelated guest data is in the HBA's original ring area, as virtio
protocol. Qemu exits upon seeing the garbage.
init_virtio_scsi() should reset the HBA before allowing the virtio ring
memory to be reused. Device reset causes the hypervisor to drop its
references.
This change is justified / underpinned by pure virtio-spec compliance as
well.
Related RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1013418
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
src/hw/virtio-scsi.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/hw/virtio-scsi.c b/src/hw/virtio-scsi.c
index 4b4ec7b..48fb3e1 100644
--- a/src/hw/virtio-scsi.c
+++ b/src/hw/virtio-scsi.c
@@ -158,8 +158,10 @@ init_virtio_scsi(struct pci_device *pci)
for (tot = 0, i = 0; i < 256; i++)
tot += virtio_scsi_scan_target(pci, ioaddr, vq, i);
- if (!tot)
+ if (!tot) {
+ vp_reset(ioaddr);
goto fail;
+ }
return;
--
1.8.5.3

View File

@ -1,6 +1,6 @@
Name: seabios
Version: 1.7.4
Release: 1%{?dist}
Release: 2%{?dist}
Summary: Open-source legacy BIOS implementation
Group: Applications/Emulators
@ -15,6 +15,9 @@ Source12: config.vga.qxl
Source13: config.vga.stdvga
Source14: config.vga.vmware
# Fix kvm migration with empty virtio-scsi controller (bz #1032208)
Patch0001: 0001-init_virtio_scsi-reset-the-HBA-before-freeing-its-vi.patch
BuildRequires: python iasl
BuildRequires: binutils-x86_64-linux-gnu gcc-x86_64-linux-gnu
@ -67,6 +70,9 @@ SeaVGABIOS is an open-source VGABIOS implementation.
%prep
%setup -q
# Fix kvm migration with empty virtio-scsi controller (bz #1032208)
%patch0001 -p1
# Makefile changes version to include date and buildhost
sed -i 's,VERSION=%{version}.*,VERSION=%{version},g' Makefile
@ -147,6 +153,9 @@ install -m 0644 binaries/vgabios*.bin $RPM_BUILD_ROOT%{_datadir}/seavgabios
%changelog
* Thu Mar 13 2014 Cole Robinson <crobinso@redhat.com> - 1.7.4-2
- Fix kvm migration with empty virtio-scsi controller (bz #1032208)
* Mon Jan 06 2014 Cole Robinson <crobinso@redhat.com> - 1.7.4-1
- Rebased to version 1.7.4
- Support for obtaining ACPI tables directly from QEMU.