lkml.org 
[lkml]   [2011]   [Dec]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 06/11] virtio: blk: Add freeze, restore handlers to support S4
    Date
    Delete the vq and flush any pending requests from the block queue on the
    freeze callback to prepare for hibernation.

    Re-create the vq in the restore callback to resume normal function.

    Signed-off-by: Amit Shah <amit.shah@redhat.com>
    ---
    drivers/block/virtio_blk.c | 38 ++++++++++++++++++++++++++++++++++++++
    1 files changed, 38 insertions(+), 0 deletions(-)

    diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
    index 467f218..a9147a6 100644
    --- a/drivers/block/virtio_blk.c
    +++ b/drivers/block/virtio_blk.c
    @@ -568,6 +568,40 @@ static void __devexit virtblk_remove(struct virtio_device *vdev)
    ida_simple_remove(&vd_index_ida, index);
    }

    +#ifdef CONFIG_PM
    +static int virtblk_freeze(struct virtio_device *vdev)
    +{
    + struct virtio_blk *vblk = vdev->priv;
    +
    + /* Ensure we don't receive any more interrupts */
    + vdev->config->reset(vdev);
    +
    + flush_work(&vblk->config_work);
    +
    + spin_lock_irq(vblk->disk->queue->queue_lock);
    + blk_stop_queue(vblk->disk->queue);
    + spin_unlock_irq(vblk->disk->queue->queue_lock);
    + blk_sync_queue(vblk->disk->queue);
    +
    + vdev->config->del_vqs(vdev);
    + return 0;
    +}
    +
    +static int virtblk_restore(struct virtio_device *vdev)
    +{
    + struct virtio_blk *vblk = vdev->priv;
    + int ret;
    +
    + ret = init_vq(vdev->priv);
    + if (!ret) {
    + spin_lock_irq(vblk->disk->queue->queue_lock);
    + blk_start_queue(vblk->disk->queue);
    + spin_unlock_irq(vblk->disk->queue->queue_lock);
    + }
    + return ret;
    +}
    +#endif
    +
    static const struct virtio_device_id id_table[] = {
    { VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID },
    { 0 },
    @@ -593,6 +627,10 @@ static struct virtio_driver __refdata virtio_blk = {
    .probe = virtblk_probe,
    .remove = __devexit_p(virtblk_remove),
    .config_changed = virtblk_config_changed,
    +#ifdef CONFIG_PM
    + .freeze = virtblk_freeze,
    + .restore = virtblk_restore,
    +#endif
    };

    static int __init init(void)
    --
    1.7.7.3


    \
     
     \ /
      Last update: 2011-12-15 13:49    [W:4.553 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site