From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Gao Junhao Date: Thu, 30 May 2019 11:22:02 +0000 Subject: [PATCH] vbs: set memory barrier for virtio_vq When virtio backend driver gets avail_idx or sets used_idx, memory barrier can make sure of sequence of reading and writing. It can guarantee the accuracy of avail_idx and used_idx. Change-Id: I4eb4a34395c215d297b24fb993dbedccfa5d95ce Tracked-On: projectacrn/acrn-hypervisor#3207 Signed-off-by: Gao Junhao Reviewed-by: Yu Wang Reviewed-by: Zhao Yakui --- drivers/vbs/vq.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/vbs/vq.c b/drivers/vbs/vq.c index 3a714441f11a..180d1b223d28 100644 --- a/drivers/vbs/vq.c +++ b/drivers/vbs/vq.c @@ -145,6 +145,7 @@ int virtio_vq_getchain(struct virtio_vq_info *vq, uint16_t *pidx, dev = vq->dev; name = dev->name; + rmb(); /* * Note: it's the responsibility of the guest not to * update vq->vq_avail->va_idx until all of the descriptors @@ -288,6 +289,8 @@ void virtio_vq_relchain(struct virtio_vq_info *vq, uint16_t idx, vue = &vuh->ring[uidx++ & mask]; vue->id = idx; vue->len = iolen; + /* Make sure buffer is written before we update index. */ + wmb(); vuh->idx = uidx; } EXPORT_SYMBOL(virtio_vq_relchain); @@ -322,6 +325,7 @@ void virtio_vq_endchains(struct virtio_vq_info *vq, int used_all_avail) * In any case, though, if NOTIFY_ON_EMPTY is set and the * entire avail was processed, we need to interrupt always. */ + mb(); dev = vq->dev; old_idx = vq->save_used; vq->save_used = new_idx = vq->used->idx; -- https://clearlinux.org