From: Christian Borntraeger <[EMAIL PROTECTED]>

This patch implements config_changed for the s390 virtio transport.

We use the least significant bit of the interrupt parameter field
to decide, if this interrupt should call the virtio virtqueue callback
or the config_changed callback.

This method is compatible with old host and guest code. Old 64 bit guests
will not check the bit and trigger a harmless additional vring_interrupt
call. Old host code will never set this bit, this is also safe.

I dont know if we will implement 31bit guest support, but this interface 
is also 31-bit safe

Signed-off-by: Christian Borntraeger <[EMAIL PROTECTED]>
---
 drivers/s390/kvm/kvm_virtio.c |   22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

Index: kvm/drivers/s390/kvm/kvm_virtio.c
===================================================================
--- kvm.orig/drivers/s390/kvm/kvm_virtio.c
+++ kvm/drivers/s390/kvm/kvm_virtio.c
@@ -295,13 +295,29 @@ static void scan_devices(void)
  */
 static void kvm_extint_handler(u16 code)
 {
-       void *data = (void *) *(long *) __LC_PFAULT_INTPARM;
-       u16 subcode = S390_lowcore.cpu_addr;
+       struct virtqueue *vq;
+       u16 subcode;
+       int config_changed;
 
+       subcode = S390_lowcore.cpu_addr;
        if ((subcode & 0xff00) != VIRTIO_SUBCODE_64)
                return;
 
-       vring_interrupt(0, data);
+       /* The LSB is overloaded, we have to mask it */
+       vq = (struct virtqueue *) ((*(long *) __LC_PFAULT_INTPARM) & ~1UL);
+
+       /* We use the LSB of extparam, to decide, if this interrupt is a config
+        * change or a "standard" interrupt */
+       config_changed =  (*(long *)  __LC_PFAULT_INTPARM & 1);
+
+       if (config_changed) {
+               struct virtio_driver *drv;
+               drv = container_of(vq->vdev->dev.driver,
+                                  struct virtio_driver, driver);
+               if (drv->config_changed)
+                       drv->config_changed(vq->vdev);
+       } else
+               vring_interrupt(0, vq);
 }
 
 /*
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to