summaryrefslogtreecommitdiffstats
path: root/include/linux/vringh.h
diff options
context:
space:
mode:
authorSjur Brændeland2013-03-20 04:21:24 +0100
committerRusty Russell2013-03-20 04:36:05 +0100
commit3beee86a4b9374e38dba36b44e81f1423a0d6b54 (patch)
tree5993020791a65623200b45393ccd63b342d5a933 /include/linux/vringh.h
parenttools/virtio: add vring_test. (diff)
downloadkernel-qcow2-linux-3beee86a4b9374e38dba36b44e81f1423a0d6b54.tar.gz
kernel-qcow2-linux-3beee86a4b9374e38dba36b44e81f1423a0d6b54.tar.xz
kernel-qcow2-linux-3beee86a4b9374e38dba36b44e81f1423a0d6b54.zip
virtio: Introduce vringh wrappers in virtio_config
Add wrappers for the host vrings to support loose coupling between the virtio device and driver. A new struct vringh_config_ops with the functions find_vrhs() and del_vrhs() is added to the virtio_device struct. This enables virtio drivers to manage virtio host rings without detailed knowledge of how the vrings are created and deleted. The function vringh_notify() is added so vringh clients can notify the other side that buffers are added to the used-ring. Cc: Ohad Ben-Cohen <ohad@wizery.com> Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (constified vringh_config)
Diffstat (limited to 'include/linux/vringh.h')
-rw-r--r--include/linux/vringh.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/vringh.h b/include/linux/vringh.h
index b8f086625c49..749cde28728b 100644
--- a/include/linux/vringh.h
+++ b/include/linux/vringh.h
@@ -47,6 +47,28 @@ struct vringh {
/* The vring (note: it may contain user pointers!) */
struct vring vring;
+
+ /* The function to call to notify the guest about added buffers */
+ void (*notify)(struct vringh *);
+};
+
+/**
+ * struct vringh_config_ops - ops for creating a host vring from a virtio driver
+ * @find_vrhs: find the host vrings and instantiate them
+ * vdev: the virtio_device
+ * nhvrs: the number of host vrings to find
+ * hvrs: on success, includes new host vrings
+ * callbacks: array of driver callbacks, for each host vring
+ * include a NULL entry for vqs that do not need a callback
+ * Returns 0 on success or error status
+ * @del_vrhs: free the host vrings found by find_vrhs().
+ */
+struct virtio_device;
+typedef void vrh_callback_t(struct virtio_device *, struct vringh *);
+struct vringh_config_ops {
+ int (*find_vrhs)(struct virtio_device *vdev, unsigned nhvrs,
+ struct vringh *vrhs[], vrh_callback_t *callbacks[]);
+ void (*del_vrhs)(struct virtio_device *vdev);
};
/* The memory the vring can access, and what offset to apply. */
@@ -193,4 +215,11 @@ void vringh_notify_disable_kern(struct vringh *vrh);
int vringh_need_notify_kern(struct vringh *vrh);
+/* Notify the guest about buffers added to the used ring */
+static inline void vringh_notify(struct vringh *vrh)
+{
+ if (vrh->notify)
+ vrh->notify(vrh);
+}
+
#endif /* _LINUX_VRINGH_H */