Patchwork [5/6,S390] Implement virtio reset

login
register
mail settings
Submitter Alexander Graf
Date April 1, 2010, 4:42 p.m.
Message ID <1270140161-17216-6-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/49220/
State New
Headers show

Comments

Alexander Graf - April 1, 2010, 4:42 p.m.
The guest may issue a RESET command for virtio. So far we didn't bother
to implement it, but with my new bootloader we actually need it for Linux
to get back to a safe state.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/s390-virtio-bus.c |    3 +--
 hw/s390-virtio-bus.h |    1 +
 hw/s390-virtio.c     |    9 +++++----
 3 files changed, 7 insertions(+), 6 deletions(-)
Aurelien Jarno - April 9, 2010, 8:09 p.m.
On Thu, Apr 01, 2010 at 06:42:40PM +0200, Alexander Graf wrote:
> The guest may issue a RESET command for virtio. So far we didn't bother
> to implement it, but with my new bootloader we actually need it for Linux
> to get back to a safe state.

Thanks, applied.

> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  hw/s390-virtio-bus.c |    3 +--
>  hw/s390-virtio-bus.h |    1 +
>  hw/s390-virtio.c     |    9 +++++----
>  3 files changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
> index 9fc01e9..b52d08d 100644
> --- a/hw/s390-virtio-bus.c
> +++ b/hw/s390-virtio-bus.c
> @@ -56,7 +56,6 @@ typedef struct {
>  static const VirtIOBindings virtio_s390_bindings;
>  
>  static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev);
> -static void s390_virtio_device_sync(VirtIOS390Device *dev);
>  
>  VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size)
>  {
> @@ -185,7 +184,7 @@ static ram_addr_t s390_virtio_next_ring(VirtIOS390Bus *bus)
>      return r;
>  }
>  
> -static void s390_virtio_device_sync(VirtIOS390Device *dev)
> +void s390_virtio_device_sync(VirtIOS390Device *dev)
>  {
>      VirtIOS390Bus *bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus);
>      ram_addr_t cur_offs;
> diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
> index 0ea8f54..333fea8 100644
> --- a/hw/s390-virtio-bus.h
> +++ b/hw/s390-virtio-bus.h
> @@ -65,3 +65,4 @@ extern VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus,
>                                                      int *vq_num);
>  extern VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus,
>                                                    ram_addr_t mem);
> +extern void s390_virtio_device_sync(VirtIOS390Device *dev);
> diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
> index ad3386f..c36a8b2 100644
> --- a/hw/s390-virtio.c
> +++ b/hw/s390-virtio.c
> @@ -99,10 +99,11 @@ int s390_virtio_hypercall(CPUState *env)
>          break;
>      case KVM_S390_VIRTIO_RESET:
>      {
> -        /* Virtio_reset resets the internal addresses, so we'd have to sync
> -           them up again. We don't want to reallocate a vring though, so let's
> -           just not reset. */
> -        /* virtio_reset(dev->vdev); */
> +        VirtIOS390Device *dev;
> +
> +        dev = s390_virtio_bus_find_mem(s390_bus, mem);
> +        virtio_reset(dev->vdev);
> +        s390_virtio_device_sync(dev);
>          break;
>      }
>      case KVM_S390_VIRTIO_SET_STATUS:
> -- 
> 1.6.0.2
> 
> 
> 
>

Patch

diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index 9fc01e9..b52d08d 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -56,7 +56,6 @@  typedef struct {
 static const VirtIOBindings virtio_s390_bindings;
 
 static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev);
-static void s390_virtio_device_sync(VirtIOS390Device *dev);
 
 VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size)
 {
@@ -185,7 +184,7 @@  static ram_addr_t s390_virtio_next_ring(VirtIOS390Bus *bus)
     return r;
 }
 
-static void s390_virtio_device_sync(VirtIOS390Device *dev)
+void s390_virtio_device_sync(VirtIOS390Device *dev)
 {
     VirtIOS390Bus *bus = DO_UPCAST(VirtIOS390Bus, bus, dev->qdev.parent_bus);
     ram_addr_t cur_offs;
diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
index 0ea8f54..333fea8 100644
--- a/hw/s390-virtio-bus.h
+++ b/hw/s390-virtio-bus.h
@@ -65,3 +65,4 @@  extern VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus,
                                                     int *vq_num);
 extern VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus,
                                                   ram_addr_t mem);
+extern void s390_virtio_device_sync(VirtIOS390Device *dev);
diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
index ad3386f..c36a8b2 100644
--- a/hw/s390-virtio.c
+++ b/hw/s390-virtio.c
@@ -99,10 +99,11 @@  int s390_virtio_hypercall(CPUState *env)
         break;
     case KVM_S390_VIRTIO_RESET:
     {
-        /* Virtio_reset resets the internal addresses, so we'd have to sync
-           them up again. We don't want to reallocate a vring though, so let's
-           just not reset. */
-        /* virtio_reset(dev->vdev); */
+        VirtIOS390Device *dev;
+
+        dev = s390_virtio_bus_find_mem(s390_bus, mem);
+        virtio_reset(dev->vdev);
+        s390_virtio_device_sync(dev);
         break;
     }
     case KVM_S390_VIRTIO_SET_STATUS: