summary refs log tree commit diff
diff options
context:
space:
mode:
authorXiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>2020-02-03 10:03:17 +0800
committerCommit Bot <commit-bot@chromium.org>2020-02-07 15:27:25 +0000
commit5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2 (patch)
tree5853693de4d80712b63c7ca5fb1f19bf11327de8
parentbc7728f69b804f6cee6769aa9428e83a8c647bf9 (diff)
downloadcrosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.tar
crosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.tar.gz
crosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.tar.bz2
crosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.tar.lz
crosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.tar.xz
crosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.tar.zst
crosvm-5c51e052820f6f6a2e65d1bd02ff8eee6a3241a2.zip
Virtio: Add fence(Acquire) after avail_index read
Driver use virtio_wmb() before avail_index updating, here fence() is
compared with it, this guarantee that the descriptor_index is read after
avail_index.

BUG=none
TEST=run fio_read and fio_write in guest

Change-Id: I6a5e1bc7c915effd433b05aca246302c5a3e313c
Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2035079
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
-rw-r--r--devices/src/virtio/queue.rs2
1 files changed, 2 insertions, 0 deletions
diff --git a/devices/src/virtio/queue.rs b/devices/src/virtio/queue.rs
index 153449a..21cf63e 100644
--- a/devices/src/virtio/queue.rs
+++ b/devices/src/virtio/queue.rs
@@ -317,6 +317,8 @@ impl Queue {
         let queue_size = self.actual_size();
         let avail_index_addr = mem.checked_offset(self.avail_ring, 2).unwrap();
         let avail_index: u16 = mem.read_obj_from_addr(avail_index_addr).unwrap();
+        // make sure desc_index read doesn't bypass avail_index read
+        fence(Ordering::Acquire);
         let avail_len = Wrapping(avail_index) - self.next_avail;
 
         if avail_len.0 > queue_size || self.next_avail == Wrapping(avail_index) {