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 /include | |
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 'include')
-rw-r--r-- | include/linux/virtio.h | 5 | ||||
-rw-r--r-- | include/linux/virtio_config.h | 4 |
2 files changed, 4 insertions, 5 deletions
diff --git a/include/linux/virtio.h b/include/linux/virtio.h index 78408d5237c1..260d1fcf29a4 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h | |||
@@ -45,9 +45,6 @@ struct virtqueue | |||
45 | * vq: the struct virtqueue we're talking about. | 45 | * vq: the struct virtqueue we're talking about. |
46 | * This returns "false" (and doesn't re-enable) if there are pending | 46 | * This returns "false" (and doesn't re-enable) if there are pending |
47 | * buffers in the queue, to avoid a race. | 47 | * buffers in the queue, to avoid a race. |
48 | * @shutdown: "unadd" all buffers. | ||
49 | * vq: the struct virtqueue we're talking about. | ||
50 | * Remove everything from the queue. | ||
51 | * | 48 | * |
52 | * Locking rules are straightforward: the driver is responsible for | 49 | * Locking rules are straightforward: the driver is responsible for |
53 | * locking. No two operations may be invoked simultaneously. | 50 | * locking. No two operations may be invoked simultaneously. |
@@ -67,8 +64,6 @@ struct virtqueue_ops { | |||
67 | 64 | ||
68 | void (*disable_cb)(struct virtqueue *vq); | 65 | void (*disable_cb)(struct virtqueue *vq); |
69 | bool (*enable_cb)(struct virtqueue *vq); | 66 | bool (*enable_cb)(struct virtqueue *vq); |
70 | |||
71 | void (*shutdown)(struct virtqueue *vq); | ||
72 | }; | 67 | }; |
73 | 68 | ||
74 | /** | 69 | /** |
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index 81f828ac8f47..d581b2914b34 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h | |||
@@ -43,6 +43,9 @@ struct virtio_device; | |||
43 | * @set_status: write the status byte | 43 | * @set_status: write the status byte |
44 | * vdev: the virtio_device | 44 | * vdev: the virtio_device |
45 | * status: the new status byte | 45 | * status: the new status byte |
46 | * @reset: reset the device | ||
47 | * vdev: the virtio device | ||
48 | * After this, status and feature negotiation must be done again | ||
46 | * @find_vq: find a virtqueue and instantiate it. | 49 | * @find_vq: find a virtqueue and instantiate it. |
47 | * vdev: the virtio_device | 50 | * vdev: the virtio_device |
48 | * index: the 0-based virtqueue number in case there's more than one. | 51 | * index: the 0-based virtqueue number in case there's more than one. |
@@ -59,6 +62,7 @@ struct virtio_config_ops | |||
59 | const void *buf, unsigned len); | 62 | const void *buf, unsigned len); |
60 | u8 (*get_status)(struct virtio_device *vdev); | 63 | u8 (*get_status)(struct virtio_device *vdev); |
61 | void (*set_status)(struct virtio_device *vdev, u8 status); | 64 | void (*set_status)(struct virtio_device *vdev, u8 status); |
65 | void (*reset)(struct virtio_device *vdev); | ||
62 | struct virtqueue *(*find_vq)(struct virtio_device *vdev, | 66 | struct virtqueue *(*find_vq)(struct virtio_device *vdev, |
63 | unsigned index, | 67 | unsigned index, |
64 | void (*callback)(struct virtqueue *)); | 68 | void (*callback)(struct virtqueue *)); |