summary refs log tree commit diff
path: root/devices
diff options
context:
space:
mode:
authorJakub Staron <jstaron@google.com>2019-05-13 14:59:10 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-05-23 07:35:16 -0700
commit6b7373af988c457d44d7d82bd7ef3e70968f058c (patch)
treec01c17661b3ac1e2c830df3612927bc36dbe0bb8 /devices
parentb42b645cfad3d405a1073ae549fad1effc5aa0df (diff)
downloadcrosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.tar
crosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.tar.gz
crosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.tar.bz2
crosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.tar.lz
crosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.tar.xz
crosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.tar.zst
crosvm-6b7373af988c457d44d7d82bd7ef3e70968f058c.zip
crosvm: Removes used_desc_heads arrays from various virtio devices.
BUG=None
TEST=tast run ${IP} vm.CrostiniStartEverything

Change-Id: I14bdc330bff23ef3397251a81bdf63e37c1e1dfd
Reviewed-on: https://chromium-review.googlesource.com/1611014
Commit-Ready: Jakub StaroĊ„ <jstaron@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'devices')
-rw-r--r--devices/src/virtio/balloon.rs14
-rw-r--r--devices/src/virtio/block.rs15
-rw-r--r--devices/src/virtio/input/mod.rs14
-rw-r--r--devices/src/virtio/net.rs11
-rw-r--r--devices/src/virtio/p9.rs13
-rw-r--r--devices/src/virtio/rng.rs14
-rw-r--r--devices/src/virtio/wl.rs17
7 files changed, 31 insertions, 67 deletions
diff --git a/devices/src/virtio/balloon.rs b/devices/src/virtio/balloon.rs
index 2187381..451421b 100644
--- a/devices/src/virtio/balloon.rs
+++ b/devices/src/virtio/balloon.rs
@@ -84,9 +84,8 @@ impl Worker {
             &mut self.deflate_queue
         };
 
-        let mut used_desc_heads = [0; QUEUE_SIZE as usize];
-        let mut used_count = 0;
-        for avail_desc in queue.iter(&self.mem) {
+        let mut needs_interrupt = false;
+        while let Some(avail_desc) = queue.pop(&self.mem) {
             if inflate && valid_inflate_desc(&avail_desc) {
                 let num_addrs = avail_desc.len / 4;
                 for i in 0..num_addrs as usize {
@@ -112,14 +111,11 @@ impl Worker {
                 }
             }
 
-            used_desc_heads[used_count] = avail_desc.index;
-            used_count += 1;
+            queue.add_used(&self.mem, avail_desc.index, 0);
+            needs_interrupt = true;
         }
 
-        for &desc_index in &used_desc_heads[..used_count] {
-            queue.add_used(&self.mem, desc_index, 0);
-        }
-        used_count > 0
+        needs_interrupt
     }
 
     fn signal_used_queue(&self) {
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index ef9b145..b0b5c2f 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -618,9 +618,8 @@ impl<T: DiskFile> Worker<T> {
 
         let disk_size = self.disk_size.lock();
 
-        let mut used_desc_heads = [(0, 0); QUEUE_SIZE as usize];
-        let mut used_count = 0;
-        for avail_desc in queue.iter(&self.mem) {
+        let mut needs_interrupt = false;
+        while let Some(avail_desc) = queue.pop(&self.mem) {
             let len;
             match Request::parse(&avail_desc, &self.mem) {
                 Ok(request) => {
@@ -653,14 +652,12 @@ impl<T: DiskFile> Worker<T> {
                     len = 0;
                 }
             }
-            used_desc_heads[used_count] = (avail_desc.index, len);
-            used_count += 1;
-        }
 
-        for &(desc_index, len) in &used_desc_heads[..used_count] {
-            queue.add_used(&self.mem, desc_index, len);
+            queue.add_used(&self.mem, avail_desc.index, len);
+            needs_interrupt = true;
         }
-        used_count > 0
+
+        needs_interrupt
     }
 
     fn resize(&mut self, new_size: u64) -> DiskControlResult {
diff --git a/devices/src/virtio/input/mod.rs b/devices/src/virtio/input/mod.rs
index a57776f..4d9c904 100644
--- a/devices/src/virtio/input/mod.rs
+++ b/devices/src/virtio/input/mod.rs
@@ -444,9 +444,8 @@ impl<T: EventSource> Worker<T> {
     fn process_status_queue(&mut self) -> Result<bool> {
         let queue = &mut self.status_queue;
 
-        let mut used_desc_heads = [(0, 0); EVENT_QUEUE_SIZE as usize];
-        let mut used_count = 0;
-        for avail_desc in queue.iter(&self.guest_memory) {
+        let mut needs_interrupt = false;
+        while let Some(avail_desc) = queue.pop(&self.guest_memory) {
             if !avail_desc.is_read_only() {
                 panic!("Received a writable descriptor on status queue");
             }
@@ -462,14 +461,11 @@ impl<T: EventSource> Worker<T> {
                     .map_err(InputError::EventsWriteError)?;
             }
 
-            used_desc_heads[used_count] = (avail_desc.index, len);
-            used_count += 1;
+            queue.add_used(&self.guest_memory, avail_desc.index, len as u32);
+            needs_interrupt = true;
         }
 
-        for &(desc_index, len) in &used_desc_heads[..used_count] {
-            queue.add_used(&self.guest_memory, desc_index, len as u32);
-        }
-        Ok(used_count > 0)
+        Ok(needs_interrupt)
     }
 
     fn run(
diff --git a/devices/src/virtio/net.rs b/devices/src/virtio/net.rs
index 332dfff..61a82cc 100644
--- a/devices/src/virtio/net.rs
+++ b/devices/src/virtio/net.rs
@@ -190,10 +190,8 @@ where
 
     fn process_tx(&mut self) {
         let mut frame = [0u8; MAX_BUFFER_SIZE];
-        let mut used_desc_heads = [0u16; QUEUE_SIZE as usize];
-        let mut used_count = 0;
 
-        for avail_desc in self.tx_queue.iter(&self.mem) {
+        while let Some(avail_desc) = self.tx_queue.pop(&self.mem) {
             let head_index = avail_desc.index;
             let mut next_desc = Some(avail_desc);
             let mut read_count = 0;
@@ -227,12 +225,7 @@ where
                 }
             };
 
-            used_desc_heads[used_count] = head_index;
-            used_count += 1;
-        }
-
-        for &desc_index in &used_desc_heads[..used_count] {
-            self.tx_queue.add_used(&self.mem, desc_index, 0);
+            self.tx_queue.add_used(&self.mem, head_index, 0);
         }
 
         self.signal_used_queue();
diff --git a/devices/src/virtio/p9.rs b/devices/src/virtio/p9.rs
index 6bfa41c..b5d0842 100644
--- a/devices/src/virtio/p9.rs
+++ b/devices/src/virtio/p9.rs
@@ -222,10 +222,7 @@ impl Worker {
     }
 
     fn process_queue(&mut self) -> P9Result<()> {
-        let mut used_desc_heads = [(0, 0); QUEUE_SIZE as usize];
-        let mut used_count = 0;
-
-        for avail_desc in self.queue.iter(&self.mem) {
+        while let Some(avail_desc) = self.queue.pop(&self.mem) {
             let mut reader = Reader {
                 mem: &self.mem,
                 offset: 0,
@@ -242,12 +239,8 @@ impl Worker {
                 .handle_message(&mut reader, &mut writer)
                 .map_err(P9Error::Internal)?;
 
-            used_desc_heads[used_count] = (avail_desc.index, writer.bytes_written);
-            used_count += 1;
-        }
-
-        for &(idx, count) in &used_desc_heads[..used_count] {
-            self.queue.add_used(&self.mem, idx, count);
+            self.queue
+                .add_used(&self.mem, avail_desc.index, writer.bytes_written);
         }
 
         self.signal_used_queue()?;
diff --git a/devices/src/virtio/rng.rs b/devices/src/virtio/rng.rs
index 8dda4c7..8338119 100644
--- a/devices/src/virtio/rng.rs
+++ b/devices/src/virtio/rng.rs
@@ -48,9 +48,8 @@ impl Worker {
     fn process_queue(&mut self) -> bool {
         let queue = &mut self.queue;
 
-        let mut used_desc_heads = [(0, 0); QUEUE_SIZE as usize];
-        let mut used_count = 0;
-        for avail_desc in queue.iter(&self.mem) {
+        let mut needs_interrupt = false;
+        while let Some(avail_desc) = queue.pop(&self.mem) {
             let mut len = 0;
 
             // Drivers can only read from the random device.
@@ -69,14 +68,11 @@ impl Worker {
                 }
             }
 
-            used_desc_heads[used_count] = (avail_desc.index, len);
-            used_count += 1;
+            queue.add_used(&self.mem, avail_desc.index, len);
+            needs_interrupt = true;
         }
 
-        for &(desc_index, len) in &used_desc_heads[..used_count] {
-            queue.add_used(&self.mem, desc_index, len);
-        }
-        used_count > 0
+        needs_interrupt
     }
 
     fn signal_used_queue(&self) {
diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs
index 83fcdca..4f43266 100644
--- a/devices/src/virtio/wl.rs
+++ b/devices/src/virtio/wl.rs
@@ -1584,12 +1584,8 @@ impl Worker {
                     }
                     Token::OutQueue => {
                         let _ = out_queue_evt.read();
-                        // Used to buffer filled in descriptors that will be added to the used queue
-                        // after iterating the available queue.
-                        let mut used_descs = [(0u16, 0u32); QUEUE_SIZE as usize];
-                        let mut used_descs_len = 0;
                         let min_resp_desc_len = size_of::<CtrlHeader>() as u32;
-                        for desc in self.out_queue.iter(&self.mem) {
+                        while let Some(desc) = self.out_queue.pop(&self.mem) {
                             // Expects that each descriptor chain is made of one "in" followed by
                             // one "out" descriptor.
                             if !desc.is_write_only() {
@@ -1612,19 +1608,16 @@ impl Worker {
                                         let used_len =
                                             encode_resp(resp_mem, resp).unwrap_or_default();
 
-                                        used_descs[used_descs_len] = (desc.index, used_len);
+                                        self.out_queue.add_used(&self.mem, desc.index, used_len);
+                                        signal_used = true;
                                     }
                                 }
                             } else {
                                 // Chains that are unusable get sent straight back to the used
                                 // queue.
-                                used_descs[used_descs_len] = (desc.index, 0);
+                                self.out_queue.add_used(&self.mem, desc.index, 0);
+                                signal_used = true;
                             }
-                            used_descs_len += 1;
-                        }
-                        for &(index, len) in &used_descs[..used_descs_len] {
-                            signal_used = true;
-                            self.out_queue.add_used(&self.mem, index, len);
                         }
                     }
                     Token::Kill => break 'poll,