|
@@ -93,8 +93,6 @@ struct vring_virtqueue
|
|
|
/* Host publishes avail event idx */
|
|
|
bool event;
|
|
|
|
|
|
- /* Number of free buffers */
|
|
|
- unsigned int num_free;
|
|
|
/* Head of free buffer list. */
|
|
|
unsigned int free_head;
|
|
|
/* Number we've added since last sync. */
|
|
@@ -106,9 +104,6 @@ struct vring_virtqueue
|
|
|
/* How to notify other side. FIXME: commonalize hcalls! */
|
|
|
void (*notify)(struct virtqueue *vq);
|
|
|
|
|
|
- /* Index of the queue */
|
|
|
- int queue_index;
|
|
|
-
|
|
|
#ifdef DEBUG
|
|
|
/* They're supposed to lock for us. */
|
|
|
unsigned int in_use;
|
|
@@ -167,7 +162,7 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
|
|
|
desc[i-1].next = 0;
|
|
|
|
|
|
/* We're about to use a buffer */
|
|
|
- vq->num_free--;
|
|
|
+ vq->vq.num_free--;
|
|
|
|
|
|
/* Use a single buffer which doesn't continue */
|
|
|
head = vq->free_head;
|
|
@@ -181,13 +176,6 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
|
|
|
return head;
|
|
|
}
|
|
|
|
|
|
-int virtqueue_get_queue_index(struct virtqueue *_vq)
|
|
|
-{
|
|
|
- struct vring_virtqueue *vq = to_vvq(_vq);
|
|
|
- return vq->queue_index;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(virtqueue_get_queue_index);
|
|
|
-
|
|
|
/**
|
|
|
* virtqueue_add_buf - expose buffer to other end
|
|
|
* @vq: the struct virtqueue we're talking about.
|
|
@@ -235,7 +223,7 @@ int virtqueue_add_buf(struct virtqueue *_vq,
|
|
|
|
|
|
/* If the host supports indirect descriptor tables, and we have multiple
|
|
|
* buffers, then go indirect. FIXME: tune this threshold */
|
|
|
- if (vq->indirect && (out + in) > 1 && vq->num_free) {
|
|
|
+ if (vq->indirect && (out + in) > 1 && vq->vq.num_free) {
|
|
|
head = vring_add_indirect(vq, sg, out, in, gfp);
|
|
|
if (likely(head >= 0))
|
|
|
goto add_head;
|
|
@@ -244,9 +232,9 @@ int virtqueue_add_buf(struct virtqueue *_vq,
|
|
|
BUG_ON(out + in > vq->vring.num);
|
|
|
BUG_ON(out + in == 0);
|
|
|
|
|
|
- if (vq->num_free < out + in) {
|
|
|
+ if (vq->vq.num_free < out + in) {
|
|
|
pr_debug("Can't add buf len %i - avail = %i\n",
|
|
|
- out + in, vq->num_free);
|
|
|
+ out + in, vq->vq.num_free);
|
|
|
/* FIXME: for historical reasons, we force a notify here if
|
|
|
* there are outgoing parts to the buffer. Presumably the
|
|
|
* host should service the ring ASAP. */
|
|
@@ -257,7 +245,7 @@ int virtqueue_add_buf(struct virtqueue *_vq,
|
|
|
}
|
|
|
|
|
|
/* We're about to use some buffers from the free list. */
|
|
|
- vq->num_free -= out + in;
|
|
|
+ vq->vq.num_free -= out + in;
|
|
|
|
|
|
head = vq->free_head;
|
|
|
for (i = vq->free_head; out; i = vq->vring.desc[i].next, out--) {
|
|
@@ -303,7 +291,7 @@ add_head:
|
|
|
pr_debug("Added buffer head %i to %p\n", head, vq);
|
|
|
END_USE(vq);
|
|
|
|
|
|
- return vq->num_free;
|
|
|
+ return vq->vq.num_free;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(virtqueue_add_buf);
|
|
|
|
|
@@ -400,13 +388,13 @@ static void detach_buf(struct vring_virtqueue *vq, unsigned int head)
|
|
|
|
|
|
while (vq->vring.desc[i].flags & VRING_DESC_F_NEXT) {
|
|
|
i = vq->vring.desc[i].next;
|
|
|
- vq->num_free++;
|
|
|
+ vq->vq.num_free++;
|
|
|
}
|
|
|
|
|
|
vq->vring.desc[i].next = vq->free_head;
|
|
|
vq->free_head = head;
|
|
|
/* Plus final descriptor */
|
|
|
- vq->num_free++;
|
|
|
+ vq->vq.num_free++;
|
|
|
}
|
|
|
|
|
|
static inline bool more_used(const struct vring_virtqueue *vq)
|
|
@@ -606,7 +594,7 @@ void *virtqueue_detach_unused_buf(struct virtqueue *_vq)
|
|
|
return buf;
|
|
|
}
|
|
|
/* That should have freed everything. */
|
|
|
- BUG_ON(vq->num_free != vq->vring.num);
|
|
|
+ BUG_ON(vq->vq.num_free != vq->vring.num);
|
|
|
|
|
|
END_USE(vq);
|
|
|
return NULL;
|
|
@@ -660,12 +648,13 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
|
|
|
vq->vq.callback = callback;
|
|
|
vq->vq.vdev = vdev;
|
|
|
vq->vq.name = name;
|
|
|
+ vq->vq.num_free = num;
|
|
|
+ vq->vq.index = index;
|
|
|
vq->notify = notify;
|
|
|
vq->weak_barriers = weak_barriers;
|
|
|
vq->broken = false;
|
|
|
vq->last_used_idx = 0;
|
|
|
vq->num_added = 0;
|
|
|
- vq->queue_index = index;
|
|
|
list_add_tail(&vq->vq.list, &vdev->vqs);
|
|
|
#ifdef DEBUG
|
|
|
vq->in_use = false;
|
|
@@ -680,7 +669,6 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
|
|
|
vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
|
|
|
|
|
|
/* Put everything in free lists. */
|
|
|
- vq->num_free = num;
|
|
|
vq->free_head = 0;
|
|
|
for (i = 0; i < num-1; i++) {
|
|
|
vq->vring.desc[i].next = i+1;
|