[PATCH v2 03/15] virtio-pci: move freeze/restore to virtio core

2014-10-06 Thread Michael S. Tsirkin
This is in preparation to extending config changed event handling
in core.
Wrapping these in an API also seems to make for a cleaner code.

Signed-off-by: Michael S. Tsirkin m...@redhat.com
---
 include/linux/virtio.h  |  6 +
 drivers/virtio/virtio.c | 53 +++
 drivers/virtio/virtio_pci.c | 55 ++---
 3 files changed, 61 insertions(+), 53 deletions(-)

diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index 3c19bd3..8df7ba8 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -78,6 +78,7 @@ bool virtqueue_is_broken(struct virtqueue *vq);
 /**
  * virtio_device - representation of a device using virtio
  * @index: unique position on the virtio bus
+ * @failed: saved value for CONFIG_S_FAILED bit (for restore)
  * @dev: underlying device.
  * @id: the device type identification (used to match it with a driver).
  * @config: the configuration ops for this device.
@@ -88,6 +89,7 @@ bool virtqueue_is_broken(struct virtqueue *vq);
  */
 struct virtio_device {
int index;
+   bool failed;
struct device dev;
struct virtio_device_id id;
const struct virtio_config_ops *config;
@@ -109,6 +111,10 @@ void unregister_virtio_device(struct virtio_device *dev);
 void virtio_break_device(struct virtio_device *dev);
 
 void virtio_config_changed(struct virtio_device *dev);
+#ifdef CONFIG_PM_SLEEP
+int virtio_device_freeze(struct virtio_device *dev);
+int virtio_device_restore(struct virtio_device *dev);
+#endif
 
 /**
  * virtio_driver - operations for a virtio I/O driver
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index 3980687..657f817 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -248,6 +248,59 @@ void virtio_config_changed(struct virtio_device *dev)
 }
 EXPORT_SYMBOL_GPL(virtio_config_changed);
 
+#ifdef CONFIG_PM_SLEEP
+int virtio_device_freeze(struct virtio_device *dev)
+{
+   struct virtio_driver *drv = drv_to_virtio(dev-dev.driver);
+
+   dev-failed = dev-config-get_status(dev)  VIRTIO_CONFIG_S_FAILED;
+
+   if (drv  drv-freeze)
+   return drv-freeze(dev);
+
+   return 0;
+}
+EXPORT_SYMBOL_GPL(virtio_device_freeze);
+
+int virtio_device_restore(struct virtio_device *dev)
+{
+   struct virtio_driver *drv = drv_to_virtio(dev-dev.driver);
+
+   /* We always start by resetting the device, in case a previous
+* driver messed it up. */
+   dev-config-reset(dev);
+
+   /* Acknowledge that we've seen the device. */
+   add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE);
+
+   /* Maybe driver failed before freeze.
+* Restore the failed status, for debugging. */
+   if (dev-failed)
+   add_status(dev, VIRTIO_CONFIG_S_FAILED);
+
+   if (!drv)
+   return 0;
+
+   /* We have a driver! */
+   add_status(dev, VIRTIO_CONFIG_S_DRIVER);
+
+   dev-config-finalize_features(dev);
+
+   if (drv-restore) {
+   int ret = drv-restore(dev);
+   if (ret) {
+   add_status(dev, VIRTIO_CONFIG_S_FAILED);
+   return ret;
+   }
+   /* Finally, tell the device we're all set */
+   add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
+   }
+
+   return 0;
+}
+EXPORT_SYMBOL_GPL(virtio_device_restore);
+#endif
+
 static int virtio_init(void)
 {
if (bus_register(virtio_bus) != 0)
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
index 58cbf6e..d34ebfa 100644
--- a/drivers/virtio/virtio_pci.c
+++ b/drivers/virtio/virtio_pci.c
@@ -57,9 +57,6 @@ struct virtio_pci_device
/* Vectors allocated, excluding per-vq vectors if any */
unsigned msix_used_vectors;
 
-   /* Status saved during hibernate/restore */
-   u8 saved_status;
-
/* Whether we have vector per vq */
bool per_vq_vectors;
 };
@@ -764,16 +761,9 @@ static int virtio_pci_freeze(struct device *dev)
 {
struct pci_dev *pci_dev = to_pci_dev(dev);
struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
-   struct virtio_driver *drv;
int ret;
 
-   drv = container_of(vp_dev-vdev.dev.driver,
-  struct virtio_driver, driver);
-
-   ret = 0;
-   vp_dev-saved_status = vp_get_status(vp_dev-vdev);
-   if (drv  drv-freeze)
-   ret = drv-freeze(vp_dev-vdev);
+   ret = virtio_device_freeze(vp_dev-vdev);
 
if (!ret)
pci_disable_device(pci_dev);
@@ -784,55 +774,14 @@ static int virtio_pci_restore(struct device *dev)
 {
struct pci_dev *pci_dev = to_pci_dev(dev);
struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
-   struct virtio_driver *drv;
-   unsigned status = 0;
int ret;
 
-   drv = container_of(vp_dev-vdev.dev.driver,
-  struct virtio_driver, driver);
-
ret = 

Re: [PATCH v2 03/15] virtio-pci: move freeze/restore to virtio core

2014-10-06 Thread Cornelia Huck
On Mon, 6 Oct 2014 18:10:51 +0300
Michael S. Tsirkin m...@redhat.com wrote:

 This is in preparation to extending config changed event handling
 in core.
 Wrapping these in an API also seems to make for a cleaner code.
 
 Signed-off-by: Michael S. Tsirkin m...@redhat.com
 ---
  include/linux/virtio.h  |  6 +
  drivers/virtio/virtio.c | 53 +++
  drivers/virtio/virtio_pci.c | 55 
 ++---
  3 files changed, 61 insertions(+), 53 deletions(-)
 
 diff --git a/include/linux/virtio.h b/include/linux/virtio.h
 index 3c19bd3..8df7ba8 100644
 --- a/include/linux/virtio.h
 +++ b/include/linux/virtio.h
 @@ -78,6 +78,7 @@ bool virtqueue_is_broken(struct virtqueue *vq);
  /**
   * virtio_device - representation of a device using virtio
   * @index: unique position on the virtio bus
 + * @failed: saved value for CONFIG_S_FAILED bit (for restore)

Have you considered s/failed/saved_failed/ ?

   * @dev: underlying device.
   * @id: the device type identification (used to match it with a driver).
   * @config: the configuration ops for this device.

Otherwise, my

Reviewed-by: Cornelia Huck cornelia.h...@de.ibm.com

still stands.

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH v2 03/15] virtio-pci: move freeze/restore to virtio core

2014-10-06 Thread Michael S. Tsirkin
On Mon, Oct 06, 2014 at 05:20:55PM +0200, Cornelia Huck wrote:
 On Mon, 6 Oct 2014 18:10:51 +0300
 Michael S. Tsirkin m...@redhat.com wrote:
 
  This is in preparation to extending config changed event handling
  in core.
  Wrapping these in an API also seems to make for a cleaner code.
  
  Signed-off-by: Michael S. Tsirkin m...@redhat.com
  ---
   include/linux/virtio.h  |  6 +
   drivers/virtio/virtio.c | 53 
  +++
   drivers/virtio/virtio_pci.c | 55 
  ++---
   3 files changed, 61 insertions(+), 53 deletions(-)
  
  diff --git a/include/linux/virtio.h b/include/linux/virtio.h
  index 3c19bd3..8df7ba8 100644
  --- a/include/linux/virtio.h
  +++ b/include/linux/virtio.h
  @@ -78,6 +78,7 @@ bool virtqueue_is_broken(struct virtqueue *vq);
   /**
* virtio_device - representation of a device using virtio
* @index: unique position on the virtio bus
  + * @failed: saved value for CONFIG_S_FAILED bit (for restore)
 
 Have you considered s/failed/saved_failed/ ?

I kind of prefer the shorter name, your reviewed tag made me think
you don't cosider this too important?

* @dev: underlying device.
* @id: the device type identification (used to match it with a driver).
* @config: the configuration ops for this device.
 
 Otherwise, my
 
 Reviewed-by: Cornelia Huck cornelia.h...@de.ibm.com
 
 still stands.
___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


Re: [PATCH v2 03/15] virtio-pci: move freeze/restore to virtio core

2014-10-06 Thread Cornelia Huck
On Mon, 6 Oct 2014 18:26:55 +0300
Michael S. Tsirkin m...@redhat.com wrote:

 On Mon, Oct 06, 2014 at 05:20:55PM +0200, Cornelia Huck wrote:
  On Mon, 6 Oct 2014 18:10:51 +0300
  Michael S. Tsirkin m...@redhat.com wrote:
  
   This is in preparation to extending config changed event handling
   in core.
   Wrapping these in an API also seems to make for a cleaner code.
   
   Signed-off-by: Michael S. Tsirkin m...@redhat.com
   ---
include/linux/virtio.h  |  6 +
drivers/virtio/virtio.c | 53 
   +++
drivers/virtio/virtio_pci.c | 55 
   ++---
3 files changed, 61 insertions(+), 53 deletions(-)
   
   diff --git a/include/linux/virtio.h b/include/linux/virtio.h
   index 3c19bd3..8df7ba8 100644
   --- a/include/linux/virtio.h
   +++ b/include/linux/virtio.h
   @@ -78,6 +78,7 @@ bool virtqueue_is_broken(struct virtqueue *vq);
/**
 * virtio_device - representation of a device using virtio
 * @index: unique position on the virtio bus
   + * @failed: saved value for CONFIG_S_FAILED bit (for restore)
  
  Have you considered s/failed/saved_failed/ ?
 
 I kind of prefer the shorter name, your reviewed tag made me think
 you don't cosider this too important?

Indeed; if you prefer the short name, just keep it.
 
 * @dev: underlying device.
 * @id: the device type identification (used to match it with a driver).
 * @config: the configuration ops for this device.
  
  Otherwise, my
  
  Reviewed-by: Cornelia Huck cornelia.h...@de.ibm.com
  
  still stands.
 

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization