diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-02-04 23:50:03 -0500 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-02-04 07:50:03 -0500 |
commit | 6e5aa7efb27aec7e55b6463fa2c8db594c4226fa (patch) | |
tree | 060a955e711ac224136157a5410e88dcdab965af /drivers/net/virtio_net.c | |
parent | b3369c1fb410fddeb38a404316c861395f6d6ae8 (diff) |
virtio: reset function
A reset function solves three problems:
1) It allows us to renegotiate features, eg. if we want to upgrade a
guest driver without rebooting the guest.
2) It gives us a clean way of shutting down virtqueues: after a reset,
we know that the buffers won't be used by the host, and
3) It helps the guest recover from messed-up drivers.
So we remove the ->shutdown hook, and the only way we now remove
feature bits is via reset.
We leave it to the driver to do the reset before it deletes queues:
the balloon driver, for example, needs to chat to the host in its
remove function.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r-- | drivers/net/virtio_net.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ec43284ffd13..6e0a9fefe6cb 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -390,13 +390,14 @@ static void virtnet_remove(struct virtio_device *vdev) | |||
390 | struct virtnet_info *vi = vdev->priv; | 390 | struct virtnet_info *vi = vdev->priv; |
391 | struct sk_buff *skb; | 391 | struct sk_buff *skb; |
392 | 392 | ||
393 | /* Stop all the virtqueues. */ | ||
394 | vdev->config->reset(vdev); | ||
395 | |||
393 | /* Free our skbs in send and recv queues, if any. */ | 396 | /* Free our skbs in send and recv queues, if any. */ |
394 | vi->rvq->vq_ops->shutdown(vi->rvq); | ||
395 | while ((skb = __skb_dequeue(&vi->recv)) != NULL) { | 397 | while ((skb = __skb_dequeue(&vi->recv)) != NULL) { |
396 | kfree_skb(skb); | 398 | kfree_skb(skb); |
397 | vi->num--; | 399 | vi->num--; |
398 | } | 400 | } |
399 | vi->svq->vq_ops->shutdown(vi->svq); | ||
400 | while ((skb = __skb_dequeue(&vi->send)) != NULL) | 401 | while ((skb = __skb_dequeue(&vi->send)) != NULL) |
401 | kfree_skb(skb); | 402 | kfree_skb(skb); |
402 | 403 | ||