virtio: net: Add freeze, restore handlers to support S4
Remove all the vqs, disable napi and detach from the netdev on hibernation. Re-create vqs after restoring from a hibernated image, re-enable napi and re-attach the netdev. This keeps networking working across hibernation. Signed-off-by: Amit Shah <amit.shah@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
04486ed019
commit
0741bcb558
|
@ -1178,6 +1178,48 @@ static void __devexit virtnet_remove(struct virtio_device *vdev)
|
|||
free_netdev(vi->dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int virtnet_freeze(struct virtio_device *vdev)
|
||||
{
|
||||
struct virtnet_info *vi = vdev->priv;
|
||||
|
||||
virtqueue_disable_cb(vi->rvq);
|
||||
virtqueue_disable_cb(vi->svq);
|
||||
if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ))
|
||||
virtqueue_disable_cb(vi->cvq);
|
||||
|
||||
netif_device_detach(vi->dev);
|
||||
cancel_delayed_work_sync(&vi->refill);
|
||||
|
||||
if (netif_running(vi->dev))
|
||||
napi_disable(&vi->napi);
|
||||
|
||||
remove_vq_common(vi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int virtnet_restore(struct virtio_device *vdev)
|
||||
{
|
||||
struct virtnet_info *vi = vdev->priv;
|
||||
int err;
|
||||
|
||||
err = init_vqs(vi);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (netif_running(vi->dev))
|
||||
virtnet_napi_enable(vi);
|
||||
|
||||
netif_device_attach(vi->dev);
|
||||
|
||||
if (!try_fill_recv(vi, GFP_KERNEL))
|
||||
queue_delayed_work(system_nrt_wq, &vi->refill, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct virtio_device_id id_table[] = {
|
||||
{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
|
||||
{ 0 },
|
||||
|
@ -1202,6 +1244,10 @@ static struct virtio_driver virtio_net_driver = {
|
|||
.probe = virtnet_probe,
|
||||
.remove = __devexit_p(virtnet_remove),
|
||||
.config_changed = virtnet_config_changed,
|
||||
#ifdef CONFIG_PM
|
||||
.freeze = virtnet_freeze,
|
||||
.restore = virtnet_restore,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init init(void)
|
||||
|
|
Loading…
Reference in New Issue