diff options
author | Zach Reizner <zachr@google.com> | 2018-08-23 13:34:56 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-09-17 21:34:50 -0700 |
commit | a99954cb7c076c9585aba416afdcb86f67e3676f (patch) | |
tree | 359c901223f8bb11e1227f4b71e082c0d45f4b0a /crosvm_plugin | |
parent | 4a55609f50ae6a66d0b3c255e18bd8e78a283242 (diff) | |
download | crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.tar crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.tar.gz crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.tar.bz2 crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.tar.lz crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.tar.xz crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.tar.zst crosvm-a99954cb7c076c9585aba416afdcb86f67e3676f.zip |
sys_util: remove Scm struct and sock_ctrl_msg C library
The Scm object was made to reduce the number of heap allocations in the hot paths of poll loops, at the cost of some code complexity. As it turns out, the number of file descriptors being sent or received is usually just one or limited to a fixed amount that can easily be covered with a fixed size stack allocated buffer. This change implements that solution, with heap allocation as a backup in the rare case that many file descriptors must be sent or received. This change also moves the msg and cmsg manipulation code out of C and into pure Rust. The move was necessary to allocate the correct amount of buffer space at compile time. It also improves safety by reducing the scope of unsafe code. Deleting the code for building the C library is also a nice bonus. Finally, the removal of the commonly used Scm struct required transitioning existing usage to the ScmSocket trait based methods. This includes all those changes. TEST=cargo test BUG=None Change-Id: If27ba297f5416dd9b8bc686ce740866912fa0aa0 Reviewed-on: https://chromium-review.googlesource.com/1186146 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'crosvm_plugin')
-rw-r--r-- | crosvm_plugin/src/lib.rs | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/crosvm_plugin/src/lib.rs b/crosvm_plugin/src/lib.rs index 06cb367..754f74c 100644 --- a/crosvm_plugin/src/lib.rs +++ b/crosvm_plugin/src/lib.rs @@ -40,7 +40,7 @@ use libc::{E2BIG, ENOTCONN, EINVAL, EPROTO, ENOENT}; use protobuf::{Message, ProtobufEnum, RepeatedField, parse_from_bytes}; -use sys_util::Scm; +use sys_util::ScmSocket; use kvm::dirty_log_bitmap_size; @@ -250,7 +250,6 @@ impl Drop for StatUpdater { pub struct crosvm { id_allocator: Arc<IdAllocator>, socket: UnixDatagram, - fd_messager: Scm, request_buffer: Vec<u8>, response_buffer: Vec<u8>, vcpus: Arc<Vec<crosvm_vcpu>>, @@ -261,7 +260,6 @@ impl crosvm { let mut crosvm = crosvm { id_allocator: Default::default(), socket, - fd_messager: Scm::new(MAX_DATAGRAM_FD), request_buffer: Vec::new(), response_buffer: vec![0; MAX_DATAGRAM_SIZE], vcpus: Default::default(), @@ -277,7 +275,6 @@ impl crosvm { crosvm { id_allocator, socket, - fd_messager: Scm::new(MAX_DATAGRAM_FD), request_buffer: Vec::new(), response_buffer: vec![0; MAX_DATAGRAM_SIZE], vcpus, @@ -296,16 +293,19 @@ impl crosvm { request .write_to_vec(&mut self.request_buffer) .map_err(proto_error_to_int)?; - self.fd_messager - .send(&self.socket, &[self.request_buffer.as_slice()], fds) + self.socket + .send_with_fds(self.request_buffer.as_slice(), fds) .map_err(|e| -e.errno())?; - let mut datagram_files = Vec::new(); - let msg_size = self.fd_messager - .recv(&self.socket, - &mut [&mut self.response_buffer], - &mut datagram_files) + let mut datagram_fds = [0; MAX_DATAGRAM_FD]; + let (msg_size, fd_count) = self.socket + .recv_with_fds(&mut self.response_buffer, &mut datagram_fds) .map_err(|e| -e.errno())?; + // Safe because the first fd_count fds from recv_with_fds are owned by us and valid. + let datagram_files = datagram_fds[..fd_count] + .iter() + .map(|&fd| unsafe { File::from_raw_fd(fd) }) + .collect(); let response: MainResponse = parse_from_bytes(&self.response_buffer[..msg_size]) .map_err(proto_error_to_int)?; |