diff options
-rw-r--r-- | coverage_config_x86_64.json | 2 | ||||
-rw-r--r-- | src/vhost_user/dummy_slave.rs | 4 | ||||
-rw-r--r-- | src/vhost_user/master.rs | 23 | ||||
-rw-r--r-- | src/vhost_user/mod.rs | 5 | ||||
-rw-r--r-- | src/vhost_user/slave_req_handler.rs | 19 |
5 files changed, 52 insertions, 1 deletions
diff --git a/coverage_config_x86_64.json b/coverage_config_x86_64.json index a4ed64f..2b2c164 100644 --- a/coverage_config_x86_64.json +++ b/coverage_config_x86_64.json @@ -1 +1 @@ -{"coverage_score": 81.3, "exclude_path": "src/vhost_kern/", "crate_features": "vhost-user-master,vhost-user-slave"}
\ No newline at end of file +{"coverage_score": 81.2, "exclude_path": "src/vhost_kern/", "crate_features": "vhost-user-master,vhost-user-slave"} diff --git a/src/vhost_user/dummy_slave.rs b/src/vhost_user/dummy_slave.rs index 895537b..b2b83d2 100644 --- a/src/vhost_user/dummy_slave.rs +++ b/src/vhost_user/dummy_slave.rs @@ -252,4 +252,8 @@ impl VhostUserSlaveReqHandlerMut for DummySlaveReqHandler { fn add_mem_region(&mut self, _region: &VhostUserSingleMemoryRegion, _fd: RawFd) -> Result<()> { Ok(()) } + + fn remove_mem_region(&mut self, _region: &VhostUserSingleMemoryRegion) -> Result<()> { + Ok(()) + } } diff --git a/src/vhost_user/master.rs b/src/vhost_user/master.rs index d27e4fb..227f1d7 100644 --- a/src/vhost_user/master.rs +++ b/src/vhost_user/master.rs @@ -56,6 +56,9 @@ pub trait VhostUserMaster: VhostBackend { /// Add a new guest memory mapping for vhost to use. fn add_mem_region(&mut self, region: &VhostUserMemoryRegionInfo) -> Result<()>; + + /// Remove a guest memory mapping from vhost. + fn remove_mem_region(&mut self, region: &VhostUserMemoryRegionInfo) -> Result<()>; } fn error_code<T>(err: VhostUserError) -> Result<T> { @@ -475,6 +478,26 @@ impl VhostUserMaster for Master { let hdr = node.send_request_with_body(MasterReq::ADD_MEM_REG, &body, Some(&fds))?; node.wait_for_ack(&hdr).map_err(|e| e.into()) } + + fn remove_mem_region(&mut self, region: &VhostUserMemoryRegionInfo) -> Result<()> { + let mut node = self.node(); + if node.acked_protocol_features & VhostUserProtocolFeatures::CONFIGURE_MEM_SLOTS.bits() == 0 + { + return error_code(VhostUserError::InvalidOperation); + } + if region.memory_size == 0 { + return error_code(VhostUserError::InvalidParam); + } + + let body = VhostUserSingleMemoryRegion::new( + region.guest_phys_addr, + region.memory_size, + region.userspace_addr, + region.mmap_offset, + ); + let hdr = node.send_request_with_body(MasterReq::REM_MEM_REG, &body, None)?; + node.wait_for_ack(&hdr).map_err(|e| e.into()) + } } impl AsRawFd for Master { diff --git a/src/vhost_user/mod.rs b/src/vhost_user/mod.rs index 3158436..4e1b529 100644 --- a/src/vhost_user/mod.rs +++ b/src/vhost_user/mod.rs @@ -341,6 +341,9 @@ mod tests { // add_mem_region() slave.handle_request().unwrap(); + // remove_mem_region() + slave.handle_request().unwrap(); + sbar.wait(); }); @@ -416,6 +419,8 @@ mod tests { }; master.add_mem_region(®ion).unwrap(); + master.remove_mem_region(®ion).unwrap(); + mbar.wait(); } diff --git a/src/vhost_user/slave_req_handler.rs b/src/vhost_user/slave_req_handler.rs index 3d8d6d5..18459a2 100644 --- a/src/vhost_user/slave_req_handler.rs +++ b/src/vhost_user/slave_req_handler.rs @@ -64,6 +64,7 @@ pub trait VhostUserSlaveReqHandler { fn set_slave_req_fd(&self, _vu_req: SlaveFsCacheReq) {} fn get_max_mem_slots(&self) -> Result<u64>; fn add_mem_region(&self, region: &VhostUserSingleMemoryRegion, fd: RawFd) -> Result<()>; + fn remove_mem_region(&self, region: &VhostUserSingleMemoryRegion) -> Result<()>; } /// Services provided to the master by the slave without interior mutability. @@ -106,6 +107,7 @@ pub trait VhostUserSlaveReqHandlerMut { fn set_slave_req_fd(&mut self, _vu_req: SlaveFsCacheReq) {} fn get_max_mem_slots(&mut self) -> Result<u64>; fn add_mem_region(&mut self, region: &VhostUserSingleMemoryRegion, fd: RawFd) -> Result<()>; + fn remove_mem_region(&mut self, region: &VhostUserSingleMemoryRegion) -> Result<()>; } impl<T: VhostUserSlaveReqHandlerMut> VhostUserSlaveReqHandler for Mutex<T> { @@ -202,6 +204,10 @@ impl<T: VhostUserSlaveReqHandlerMut> VhostUserSlaveReqHandler for Mutex<T> { fn add_mem_region(&self, region: &VhostUserSingleMemoryRegion, fd: RawFd) -> Result<()> { self.lock().unwrap().add_mem_region(region, fd) } + + fn remove_mem_region(&self, region: &VhostUserSingleMemoryRegion) -> Result<()> { + self.lock().unwrap().remove_mem_region(region) + } } /// Server to handle service requests from masters from the master communication channel. @@ -462,6 +468,19 @@ impl<S: VhostUserSlaveReqHandler> SlaveReqHandler<S> { let res = self.backend.add_mem_region(&msg, fd); self.send_ack_message(&hdr, res)?; } + MasterReq::REM_MEM_REG => { + if self.acked_protocol_features + & VhostUserProtocolFeatures::CONFIGURE_MEM_SLOTS.bits() + == 0 + { + return Err(Error::InvalidOperation); + } + + let msg = + self.extract_request_body::<VhostUserSingleMemoryRegion>(&hdr, size, &buf)?; + let res = self.backend.remove_mem_region(&msg); + self.send_ack_message(&hdr, res)?; + } _ => { return Err(Error::InvalidMessage); } |