diff options
author | Dylan Reid <dgreid@chromium.org> | 2017-08-10 14:58:34 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-08-14 18:24:55 -0700 |
commit | d527d85da64ff265a8091fc9129244e02f994f0a (patch) | |
tree | 3addedc952bd5b753933957a7e52a7c623d6534a /src/hw/virtio | |
parent | c28f6a67b16d2bb8e113bfd09ec8238069fa14c0 (diff) | |
download | crosvm-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.rs | 5 |
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(); } |