[SeaBIOS] [PATCH] init_virtio_scsi(): reset the HBA before freeing its virtio ring
Paolo Bonzini
pbonzini at redhat.com
Wed Jan 15 11:01:59 CET 2014
Il 15/01/2014 02:48, Laszlo Ersek ha scritto:
> 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 at 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
> @@ -154,16 +154,18 @@ init_virtio_scsi(struct pci_device *pci)
> vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
> VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK);
>
> int i, tot;
> 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;
>
> fail:
> free(vq);
> }
>
>
Thanks Laszlo!
Reviewed-by: Paolo Bonzini <pbonzini at redhat.com>
Paolo
More information about the SeaBIOS
mailing list