lkml.org 
[lkml]   [2022]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 117/167] virtio_mmio: Add missing PM calls to freeze/restore
    Date
    From: Stephan Gerhold <stephan.gerhold@kernkonzept.com>

    [ Upstream commit ed7ac37fde33ccd84e4bd2b9363c191f925364c7 ]

    Most virtio drivers provide freeze/restore callbacks to finish up
    device usage before suspend and to reinitialize the virtio device after
    resume. However, these callbacks are currently only called when using
    virtio_pci. virtio_mmio does not have any PM ops defined.

    This causes problems for example after suspend to disk (hibernation),
    since the virtio devices might lose their state after the VMM is
    restarted. Calling virtio_device_freeze()/restore() ensures that
    the virtio devices are re-initialized correctly.

    Fix this by implementing the dev_pm_ops for virtio_mmio,
    similar to virtio_pci_common.

    Signed-off-by: Stephan Gerhold <stephan.gerhold@kernkonzept.com>
    Message-Id: <20220621110621.3638025-2-stephan.gerhold@kernkonzept.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/virtio/virtio_mmio.c | 23 +++++++++++++++++++++++
    1 file changed, 23 insertions(+)

    diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
    index 1dd396d4bebb..7522832529dd 100644
    --- a/drivers/virtio/virtio_mmio.c
    +++ b/drivers/virtio/virtio_mmio.c
    @@ -62,6 +62,7 @@
    #include <linux/list.h>
    #include <linux/module.h>
    #include <linux/platform_device.h>
    +#include <linux/pm.h>
    #include <linux/slab.h>
    #include <linux/spinlock.h>
    #include <linux/virtio.h>
    @@ -543,6 +544,25 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
    .get_shm_region = vm_get_shm_region,
    };

    +#ifdef CONFIG_PM_SLEEP
    +static int virtio_mmio_freeze(struct device *dev)
    +{
    + struct virtio_mmio_device *vm_dev = dev_get_drvdata(dev);
    +
    + return virtio_device_freeze(&vm_dev->vdev);
    +}
    +
    +static int virtio_mmio_restore(struct device *dev)
    +{
    + struct virtio_mmio_device *vm_dev = dev_get_drvdata(dev);
    +
    + return virtio_device_restore(&vm_dev->vdev);
    +}
    +
    +static const struct dev_pm_ops virtio_mmio_pm_ops = {
    + SET_SYSTEM_SLEEP_PM_OPS(virtio_mmio_freeze, virtio_mmio_restore)
    +};
    +#endif

    static void virtio_mmio_release_dev(struct device *_d)
    {
    @@ -786,6 +806,9 @@ static struct platform_driver virtio_mmio_driver = {
    .name = "virtio-mmio",
    .of_match_table = virtio_mmio_match,
    .acpi_match_table = ACPI_PTR(virtio_mmio_acpi_match),
    +#ifdef CONFIG_PM_SLEEP
    + .pm = &virtio_mmio_pm_ops,
    +#endif
    },
    };

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-19 14:49    [W:8.153 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site