[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: [PATCH 05/16] virtio_ring: store mask, rather than calculating it based on num.
From: Rusty Russell <rusty@rustcorp.com.au> This matters when num needs endian conversion. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> --- drivers/virtio/virtio_ring.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 6fe2d08..45653c7 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -80,6 +80,9 @@ struct vring_virtqueue /* Last used index we've seen. */ u16 last_used_idx; + /* Mask to apply to ring indices. */ + u16 ring_mask; + /* How to notify other side. FIXME: commonalize hcalls! */ void (*notify)(struct virtqueue *vq); @@ -226,7 +229,7 @@ static inline int virtqueue_add(struct virtqueue *_vq, goto add_head; } - BUG_ON(total_sg > vq->vring.num); + BUG_ON(total_sg >= vq->ring_mask); BUG_ON(total_sg == 0); if (vq->vq.num_free < total_sg) { @@ -275,7 +278,7 @@ add_head: /* Put entry in available array (but don't update avail->idx until they * do sync). */ - avail = (vq->vring.avail->idx & (vq->vring.num-1)); + avail = (vq->vring.avail->idx & vq->ring_mask); vq->vring.avail->ring[avail] = head; /* Descriptors and available array need to be set before we expose the @@ -524,11 +527,11 @@ void *virtqueue_get_buf(struct virtqueue *_vq, unsigned int *len) /* Only get used array entries after they have been exposed by host. */ virtio_rmb(vq->weak_barriers); - last_used = (vq->last_used_idx & (vq->vring.num - 1)); + last_used = (vq->last_used_idx & vq->ring_mask); i = vq->vring.used->ring[last_used].id; *len = vq->vring.used->ring[last_used].len; - if (unlikely(i >= vq->vring.num)) { + if (unlikely(i > vq->ring_mask)) { BAD_RING(vq, "id %u out of range\n", i); return NULL; } @@ -698,7 +701,7 @@ void *virtqueue_detach_unused_buf(struct virtqueue *_vq) START_USE(vq); - for (i = 0; i < vq->vring.num; i++) { + for (i = 0; i <= vq->ring_mask; i++) { if (!vq->data[i]) continue; /* detach_buf clears data, so grab it now. */ @@ -769,6 +772,7 @@ struct virtqueue *vring_new_virtqueue(unsigned int index, vq->weak_barriers = weak_barriers; vq->broken = false; vq->last_used_idx = 0; + vq->ring_mask = num - 1; vq->num_added = 0; list_add_tail(&vq->vq.list, &vdev->vqs); #ifdef DEBUG @@ -833,7 +837,7 @@ unsigned int virtqueue_get_vring_size(struct virtqueue *_vq) struct vring_virtqueue *vq = to_vvq(_vq); - return vq->vring.num; + return (unsigned)vq->ring_mask + 1; } EXPORT_SYMBOL_GPL(virtqueue_get_vring_size); -- 1.8.1.2
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]