summary refs log tree commit diff
path: root/devices/src/virtio/wl.rs
diff options
context:
space:
mode:
authorChirantan Ekbote <chirantan@chromium.org>2020-05-19 19:40:20 +0900
committerCommit Bot <commit-bot@chromium.org>2020-05-28 07:14:58 +0000
commit1a9f2a5454481a511257625f985d503c45fd8246 (patch)
tree0b03744ca2137adb7fac308939fd068d4fd6ea63 /devices/src/virtio/wl.rs
parent247134fe68f32f45f7a92a7f3181c0a74f713dec (diff)
downloadcrosvm-1a9f2a5454481a511257625f985d503c45fd8246.tar
crosvm-1a9f2a5454481a511257625f985d503c45fd8246.tar.gz
crosvm-1a9f2a5454481a511257625f985d503c45fd8246.tar.bz2
crosvm-1a9f2a5454481a511257625f985d503c45fd8246.tar.lz
crosvm-1a9f2a5454481a511257625f985d503c45fd8246.tar.xz
crosvm-1a9f2a5454481a511257625f985d503c45fd8246.tar.zst
crosvm-1a9f2a5454481a511257625f985d503c45fd8246.zip
sys_util: Refactor IntoIovec
The original stated purpose of this trait was to reduce memory
allocations but having the `into_iovec` method return a Vec kind of
defeats that purpose.

Refactor the trait so that it can either convert a T into an iovec or
convert a &[T] into a &[iovec].  Implement the trait for VolatileSlice,
IoSlice, and IoSliceMut and update all the callers.

BUG=none
TEST=unit tests

Cq-Depend: chromium:2210272
Change-Id: I9d0d617a23030d241d50411f4a5a16e7cba4bcee
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2208527
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Commit-Queue: Chirantan Ekbote <chirantan@chromium.org>
Tested-by: Chirantan Ekbote <chirantan@chromium.org>
Diffstat (limited to 'devices/src/virtio/wl.rs')
-rw-r--r--devices/src/virtio/wl.rs8
1 files changed, 3 insertions, 5 deletions
diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs
index 8e94783..3a5ecee 100644
--- a/devices/src/virtio/wl.rs
+++ b/devices/src/virtio/wl.rs
@@ -730,12 +730,10 @@ impl WlVfd {
     fn send(&mut self, fds: &[RawFd], data: &mut Reader) -> WlResult<WlResp> {
         if let Some(socket) = &self.socket {
             socket
-                .send_with_fds(
-                    data.get_iovec(usize::max_value())
-                        .map_err(WlError::ParseDesc)?,
-                    fds,
-                )
+                .send_with_fds(data.get_remaining(), fds)
                 .map_err(WlError::SendVfd)?;
+            // All remaining data in `data` is now considered consumed.
+            data.consume(::std::usize::MAX);
             Ok(WlResp::Ok)
         } else if let Some((_, local_pipe)) = &mut self.local_pipe {
             // Impossible to send fds over a simple pipe.