From e47d854e57698d3be4579d2118f6057f9f12a17c Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Mar 2012 12:48:19 +0530 Subject: virtio: balloon: Allow stats update after restore from S4 There's no reason stats update after restore can't work. If a host requested for stats, and before servicing the request, the guest entered S4, upon restore, the stats request can still be processed and sent off to the host. Signed-off-by: Amit Shah --- drivers/virtio/virtio_balloon.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 958e5129c601..9f1bb36d67ff 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -405,14 +405,6 @@ static int virtballoon_thaw(struct virtio_device *vdev) static int virtballoon_restore(struct virtio_device *vdev) { - struct virtio_balloon *vb = vdev->priv; - - /* - * If a request wasn't complete at the time of freezing, this - * could have been set. - */ - vb->need_stats_update = 0; - return restore_common(vdev); } #endif -- cgit v1.2.3 From f38f8387cbdc4138a492ce9f2a5f04fd3cd3cf33 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Mar 2012 12:50:20 +0530 Subject: virtio: drop thaw PM operation The thaw operation was used by the balloon driver, but after the last commit there's no reason to have separate thaw and restore callbacks. Signed-off-by: Amit Shah --- drivers/virtio/virtio_balloon.c | 6 ------ drivers/virtio/virtio_pci.c | 28 +--------------------------- include/linux/virtio.h | 1 - 3 files changed, 1 insertion(+), 34 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 9f1bb36d67ff..05f0a80818a2 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -398,11 +398,6 @@ static int restore_common(struct virtio_device *vdev) return 0; } -static int virtballoon_thaw(struct virtio_device *vdev) -{ - return restore_common(vdev); -} - static int virtballoon_restore(struct virtio_device *vdev) { return restore_common(vdev); @@ -426,7 +421,6 @@ static struct virtio_driver virtio_balloon_driver = { #ifdef CONFIG_PM .freeze = virtballoon_freeze, .restore = virtballoon_restore, - .thaw = virtballoon_thaw, #endif }; diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 635e1efb3792..a35a402dfd78 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -773,32 +773,6 @@ static int restore_common(struct device *dev) return ret; } -static int virtio_pci_thaw(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; - - ret = restore_common(dev); - if (ret) - return ret; - - drv = container_of(vp_dev->vdev.dev.driver, - struct virtio_driver, driver); - - if (drv && drv->thaw) - ret = drv->thaw(&vp_dev->vdev); - else if (drv && drv->restore) - ret = drv->restore(&vp_dev->vdev); - - /* Finally, tell the device we're all set */ - if (!ret) - vp_set_status(&vp_dev->vdev, vp_dev->saved_status); - - return ret; -} - static int virtio_pci_restore(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); @@ -824,7 +798,7 @@ static const struct dev_pm_ops virtio_pci_pm_ops = { .suspend = virtio_pci_suspend, .resume = virtio_pci_resume, .freeze = virtio_pci_freeze, - .thaw = virtio_pci_thaw, + .thaw = virtio_pci_restore, .restore = virtio_pci_restore, .poweroff = virtio_pci_suspend, }; diff --git a/include/linux/virtio.h b/include/linux/virtio.h index d0018d27c281..8efd28ae5597 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -96,7 +96,6 @@ struct virtio_driver { void (*config_changed)(struct virtio_device *dev); #ifdef CONFIG_PM int (*freeze)(struct virtio_device *dev); - int (*thaw)(struct virtio_device *dev); int (*restore)(struct virtio_device *dev); #endif }; -- cgit v1.2.3 From 0517fdd156c46c23501451158c6b0ff9fb7236d1 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Mar 2012 12:54:43 +0530 Subject: virtio-pci: drop restore_common() restore_common() was shared between restore and thaw callbacks. With thaw gone, we don't need restore_common() anymore. Signed-off-by: Amit Shah --- drivers/virtio/virtio_pci.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index a35a402dfd78..982d6c9a2bf0 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -758,33 +758,24 @@ static int virtio_pci_freeze(struct device *dev) return ret; } -static int restore_common(struct device *dev) +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; int ret; + drv = container_of(vp_dev->vdev.dev.driver, + struct virtio_driver, driver); + ret = pci_enable_device(pci_dev); if (ret) return ret; + pci_set_master(pci_dev); vp_finalize_features(&vp_dev->vdev); - return ret; -} - -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; - int ret; - - drv = container_of(vp_dev->vdev.dev.driver, - struct virtio_driver, driver); - - ret = restore_common(dev); - if (!ret && drv && drv->restore) + if (drv && drv->restore) ret = drv->restore(&vp_dev->vdev); /* Finally, tell the device we're all set */ -- cgit v1.2.3 From 04c2322bee841121cfdd7f284e1d4274e9e60e33 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Mar 2012 12:51:41 +0530 Subject: virtio-pci: S3 support There's no difference in supporting S3 and S4 for virtio devices: the vqs have to be re-created as the device has to be assumed to be reset at restore-time. Since S4 already handles this situation, we can directly use the same code and callbacks for S3 support. Signed-off-by: Amit Shah --- drivers/virtio/virtio_pci.c | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 982d6c9a2bf0..0fa4f8551c3a 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -720,24 +720,6 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev) } #ifdef CONFIG_PM -static int virtio_pci_suspend(struct device *dev) -{ - struct pci_dev *pci_dev = to_pci_dev(dev); - - pci_save_state(pci_dev); - pci_set_power_state(pci_dev, PCI_D3hot); - return 0; -} - -static int virtio_pci_resume(struct device *dev) -{ - struct pci_dev *pci_dev = to_pci_dev(dev); - - pci_restore_state(pci_dev); - pci_set_power_state(pci_dev, PCI_D0); - return 0; -} - static int virtio_pci_freeze(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); @@ -786,12 +768,12 @@ static int virtio_pci_restore(struct device *dev) } static const struct dev_pm_ops virtio_pci_pm_ops = { - .suspend = virtio_pci_suspend, - .resume = virtio_pci_resume, + .suspend = virtio_pci_freeze, + .resume = virtio_pci_restore, .freeze = virtio_pci_freeze, .thaw = virtio_pci_restore, .restore = virtio_pci_restore, - .poweroff = virtio_pci_suspend, + .poweroff = virtio_pci_freeze, }; #endif -- cgit v1.2.3 From f878d0be229ab129bc4b224191f217106a4b0bc1 Mon Sep 17 00:00:00 2001 From: Amit Shah Date: Thu, 29 Mar 2012 12:58:05 +0530 Subject: virtio-pci: switch to PM ops macro to initialise PM functions Use the SET_SYSTEM_SLEEP_PM_OPS macro to initialise the suspend/resume functions in the new PM API. Signed-off-by: Amit Shah --- drivers/virtio/virtio_pci.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 0fa4f8551c3a..2e03d416b9af 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -768,12 +768,7 @@ static int virtio_pci_restore(struct device *dev) } static const struct dev_pm_ops virtio_pci_pm_ops = { - .suspend = virtio_pci_freeze, - .resume = virtio_pci_restore, - .freeze = virtio_pci_freeze, - .thaw = virtio_pci_restore, - .restore = virtio_pci_restore, - .poweroff = virtio_pci_freeze, + SET_SYSTEM_SLEEP_PM_OPS(virtio_pci_freeze, virtio_pci_restore) }; #endif -- cgit v1.2.3