|
@@ -365,6 +365,50 @@ int virtqueue_add_sgs(struct virtqueue *_vq,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(virtqueue_add_sgs);
|
|
|
|
|
|
+/**
|
|
|
+ * virtqueue_add_outbuf - expose output buffers to other end
|
|
|
+ * @vq: the struct virtqueue we're talking about.
|
|
|
+ * @sgs: array of scatterlists (need not be terminated!)
|
|
|
+ * @num: the number of scatterlists readable by other side
|
|
|
+ * @data: the token identifying the buffer.
|
|
|
+ * @gfp: how to do memory allocations (if necessary).
|
|
|
+ *
|
|
|
+ * Caller must ensure we don't call this with other virtqueue operations
|
|
|
+ * at the same time (except where noted).
|
|
|
+ *
|
|
|
+ * Returns zero or a negative error (ie. ENOSPC, ENOMEM).
|
|
|
+ */
|
|
|
+int virtqueue_add_outbuf(struct virtqueue *vq,
|
|
|
+ struct scatterlist sg[], unsigned int num,
|
|
|
+ void *data,
|
|
|
+ gfp_t gfp)
|
|
|
+{
|
|
|
+ return virtqueue_add(vq, &sg, sg_next_arr, num, 0, 1, 0, data, gfp);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(virtqueue_add_outbuf);
|
|
|
+
|
|
|
+/**
|
|
|
+ * virtqueue_add_inbuf - expose input buffers to other end
|
|
|
+ * @vq: the struct virtqueue we're talking about.
|
|
|
+ * @sgs: array of scatterlists (need not be terminated!)
|
|
|
+ * @num: the number of scatterlists writable by other side
|
|
|
+ * @data: the token identifying the buffer.
|
|
|
+ * @gfp: how to do memory allocations (if necessary).
|
|
|
+ *
|
|
|
+ * Caller must ensure we don't call this with other virtqueue operations
|
|
|
+ * at the same time (except where noted).
|
|
|
+ *
|
|
|
+ * Returns zero or a negative error (ie. ENOSPC, ENOMEM).
|
|
|
+ */
|
|
|
+int virtqueue_add_inbuf(struct virtqueue *vq,
|
|
|
+ struct scatterlist sg[], unsigned int num,
|
|
|
+ void *data,
|
|
|
+ gfp_t gfp)
|
|
|
+{
|
|
|
+ return virtqueue_add(vq, &sg, sg_next_arr, 0, num, 0, 1, data, gfp);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(virtqueue_add_inbuf);
|
|
|
+
|
|
|
/**
|
|
|
* virtqueue_kick_prepare - first half of split virtqueue_kick call.
|
|
|
* @vq: the struct virtqueue
|