qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 4/7] [s390] reset avail and used index on reboot


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH 4/7] [s390] reset avail and used index on reboot
Date: Thu, 26 Apr 2012 15:16:00 +0200

On 23.04.2012, at 11:52, Christian Borntraeger wrote:

> From: Jens Freimann <address@hidden>
> 
> reset the guest vring avail/used idx fields, otherwise it's possible
> that old values remain in memory which would cause a reboot to fail
> with a "Guest moved used index" message
> 
> Signed-off-by: Jens Freimann <address@hidden>
> Signed-off-by: Christian Borntraeger <address@hidden>
> ---
> hw/s390-virtio-bus.c |    7 +++++++
> hw/s390-virtio-bus.h |    2 ++
> 2 files changed, 9 insertions(+)
> 
> diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
> index 74419b3..084bac1 100644
> --- a/hw/s390-virtio-bus.c
> +++ b/hw/s390-virtio-bus.c
> @@ -225,6 +225,7 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
> {
>     VirtIOS390Bus *bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus);
>     ram_addr_t cur_offs;
> +    target_phys_addr_t idx_addr;
>     uint8_t num_vq;
>     int i;
> 
> @@ -250,6 +251,12 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
>         vring = s390_virtio_next_ring(bus);
>         virtio_queue_set_addr(dev->vdev, i, vring);
>         virtio_queue_set_vector(dev->vdev, i, i);
> +        idx_addr = virtio_queue_get_avail_addr(dev->vdev, i) +
> +                     VIRTIO_VRING_AVAIL_IDX_OFFS;
> +        stw_phys(idx_addr, 0);
> +        idx_addr = virtio_queue_get_used_addr(dev->vdev, i) +
> +                     VIRTIO_VRING_USED_IDX_OFFS;
> +        stw_phys(idx_addr, 0);

Are you sure this is correct to do in the sync callback? The idea of "sync" was 
to have a callback that can be called every time config information changes.

That could even be something as simple as a byte changing in the virtio device 
specific config space. But because we don't get callbacks when the guest 
accesses them, we need to synchronize it with real memory.


Alex

>         stq_be_phys(vq + VIRTIO_VQCONFIG_OFFS_ADDRESS, vring);
>         stw_be_phys(vq + VIRTIO_VQCONFIG_OFFS_NUM, 
> virtio_queue_get_num(dev->vdev, i));
>     }
> diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
> index 0e60bc0..8deec1e 100644
> --- a/hw/s390-virtio-bus.h
> +++ b/hw/s390-virtio-bus.h
> @@ -34,6 +34,8 @@
> #define VIRTIO_VQCONFIG_LEN           24
> 
> #define VIRTIO_RING_LEN                       (TARGET_PAGE_SIZE * 3)
> +#define VIRTIO_VRING_AVAIL_IDX_OFFS 2
> +#define VIRTIO_VRING_USED_IDX_OFFS 2
> #define S390_DEVICE_PAGES             512
> 
> #define VIRTIO_PARAM_MASK               0xff
> -- 
> 1.7.9.6
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]