summary refs log tree commit diff
path: root/src/hw/virtio
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2017-08-10 14:58:34 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-08-14 18:24:55 -0700
commitd527d85da64ff265a8091fc9129244e02f994f0a (patch)
tree3addedc952bd5b753933957a7e52a7c623d6534a /src/hw/virtio
parentc28f6a67b16d2bb8e113bfd09ec8238069fa14c0 (diff)
downloadcrosvm-d527d85da64ff265a8091fc9129244e02f994f0a.tar
crosvm-d527d85da64ff265a8091fc9129244e02f994f0a.tar.gz
crosvm-d527d85da64ff265a8091fc9129244e02f994f0a.tar.bz2
crosvm-d527d85da64ff265a8091fc9129244e02f994f0a.tar.lz
crosvm-d527d85da64ff265a8091fc9129244e02f994f0a.tar.xz
crosvm-d527d85da64ff265a8091fc9129244e02f994f0a.tar.zst
crosvm-d527d85da64ff265a8091fc9129244e02f994f0a.zip
crosvm: Add barrier before updating used_ring index
We have to guarantee that all the descriptor writes are visible to the
guest before the index update is.

Change-Id: I35f1c8d3f5fc9a6ac54de1eb4be66e1c5ac81fc8
Signed-off-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/611215
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'src/hw/virtio')
-rw-r--r--src/hw/virtio/queue.rs5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/hw/virtio/queue.rs b/src/hw/virtio/queue.rs
index b288427..3e02e53 100644
--- a/src/hw/virtio/queue.rs
+++ b/src/hw/virtio/queue.rs
@@ -4,6 +4,7 @@
 
 use std::cmp::min;
 use std::num::Wrapping;
+use std::sync::atomic::{fence, Ordering};
 
 use sys_util::{GuestAddress, GuestMemory};
 
@@ -294,6 +295,10 @@ impl Queue {
             .unwrap();
 
         self.next_used += Wrapping(1);
+
+        // This fence ensures all descriptor writes are visible before the index update is.
+        fence(Ordering::Release);
+
         mem.write_obj_at_addr(self.next_used.0 as u16, used_ring.unchecked_add(2))
             .unwrap();
     }