Use dependent_ptr_mb which is - on some architectures -
more light-weight than an rmb.

Signed-off-by: Michael S. Tsirkin <m...@redhat.com>
---
 drivers/virtio/virtio_ring.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 814b395007b2..2d320396eff8 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -702,6 +702,7 @@ void *virtqueue_get_buf_ctx(struct virtqueue *_vq, unsigned 
int *len,
        void *ret;
        unsigned int i;
        u16 last_used;
+       bool more;
 
        START_USE(vq);
 
@@ -710,14 +711,15 @@ void *virtqueue_get_buf_ctx(struct virtqueue *_vq, 
unsigned int *len,
                return NULL;
        }
 
-       if (!more_used(vq)) {
+       more = more_used(vq);
+       if (!more) {
                pr_debug("No more buffers in queue\n");
                END_USE(vq);
                return NULL;
        }
 
        /* Only get used array entries after they have been exposed by host. */
-       virtio_rmb(vq->weak_barriers);
+       vq = dependent_ptr_mb(vq, more);
 
        last_used = (vq->last_used_idx & (vq->vring.num - 1));
        i = virtio32_to_cpu(_vq->vdev, vq->vring.used->ring[last_used].id);
-- 
MST

Reply via email to