From 78da64c7f22a1bf512187c83830b4d7c86c5c5ce Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Mon, 10 Jan 2022 12:48:20 +0530 Subject: [PATCH] i2c: Always pass vring to process_requests() For tests we can pass a non related vring to just make it run, hence no need of making it optional. Always pass the vring. Signed-off-by: Viresh Kumar --- i2c/src/vhu_i2c.rs | 56 +++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/i2c/src/vhu_i2c.rs b/i2c/src/vhu_i2c.rs index 9ee9129..76360ee 100644 --- a/i2c/src/vhu_i2c.rs +++ b/i2c/src/vhu_i2c.rs @@ -114,7 +114,7 @@ impl VhostUserI2cBackend { fn process_requests( &self, requests: Vec, - vring: Option<&VringRwLock>, + vring: &VringRwLock, ) -> Result { let mut reqs: Vec = Vec::new(); @@ -239,10 +239,8 @@ impl VhostUserI2cBackend { .write_obj::(in_hdr, desc_in_hdr.addr()) .map_err(|_| Error::DescriptorWriteFailed)?; - if let Some(vring) = vring { - if vring.add_used(desc_chain.head_index(), len).is_err() { - warn!("Couldn't return used descriptors to the ring"); - } + if vring.add_used(desc_chain.head_index(), len).is_err() { + warn!("Couldn't return used descriptors to the ring"); } } @@ -258,7 +256,7 @@ impl VhostUserI2cBackend { .map_err(|_| Error::DescriptorNotFound)? .collect(); - if self.process_requests(requests, Some(vring))? { + if self.process_requests(requests, vring)? { // Send notification once all the requests are processed vring .signal_used_queue() @@ -518,10 +516,14 @@ mod tests { let device_config = AdapterConfig::try_from("1:4,2:32:21,5:10:23").unwrap(); let i2c_map = I2cMap::::new(&device_config).unwrap(); let backend = VhostUserI2cBackend::new(Arc::new(i2c_map)).unwrap(); + let mem = GuestMemoryAtomic::new( + GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x1000)]).unwrap(), + ); + let vring = VringRwLock::new(mem, 0x1000); // Descriptor chain size zero, shouldn't fail backend - .process_requests(Vec::::new(), None) + .process_requests(Vec::::new(), &vring) .unwrap(); // Valid single read descriptor @@ -529,7 +531,9 @@ mod tests { let desc_chain = prepare_desc_chain(GuestAddress(0), &mut buf, VIRTIO_I2C_FLAGS_M_RD, 4); let desc_chains = vec![desc_chain]; - backend.process_requests(desc_chains.clone(), None).unwrap(); + backend + .process_requests(desc_chains.clone(), &vring) + .unwrap(); validate_desc_chains(desc_chains, VIRTIO_I2C_MSG_OK); // Valid single write descriptor @@ -537,7 +541,9 @@ mod tests { let desc_chain = prepare_desc_chain(GuestAddress(0), &mut buf, 0, 4); let desc_chains = vec![desc_chain]; - backend.process_requests(desc_chains.clone(), None).unwrap(); + backend + .process_requests(desc_chains.clone(), &vring) + .unwrap(); validate_desc_chains(desc_chains, VIRTIO_I2C_MSG_OK); // Valid mixed read-write descriptors @@ -557,7 +563,9 @@ mod tests { prepare_desc_chain(GuestAddress(0), &mut buf[5], VIRTIO_I2C_FLAGS_M_RD, 4), ]; - backend.process_requests(desc_chains.clone(), None).unwrap(); + backend + .process_requests(desc_chains.clone(), &vring) + .unwrap(); validate_desc_chains(desc_chains, VIRTIO_I2C_MSG_OK); } @@ -566,6 +574,10 @@ mod tests { let device_config = AdapterConfig::try_from("1:4,2:32:21,5:10:23").unwrap(); let i2c_map = I2cMap::::new(&device_config).unwrap(); let backend = VhostUserI2cBackend::new(Arc::new(i2c_map)).unwrap(); + let mem = GuestMemoryAtomic::new( + GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x1000)]).unwrap(), + ); + let vring = VringRwLock::new(mem, 0x1000); // One descriptors let flags: Vec = vec![0]; @@ -573,7 +585,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedDescriptorCount(1) ); @@ -584,7 +596,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedDescriptorCount(4) ); @@ -599,7 +611,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedWriteOnlyDescriptor(0) ); @@ -610,7 +622,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedDescriptorSize(size_of::(), 100) ); @@ -626,7 +638,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(Some(addr), flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::DescriptorReadFailed ); @@ -641,7 +653,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedReadableDescriptor(2) ); @@ -652,7 +664,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedDescriptorSize(size_of::(), 100) ); @@ -668,7 +680,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(Some(addr), flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::DescriptorWriteFailed ); @@ -683,7 +695,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(None, flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::UnexpectedDescriptorSize(1, 0) ); @@ -699,7 +711,7 @@ mod tests { let desc_chain = prepare_desc_chain_dummy(Some(addr), flags, len); assert_eq!( backend - .process_requests(vec![desc_chain], None) + .process_requests(vec![desc_chain], &vring) .unwrap_err(), Error::DescriptorReadFailed ); @@ -709,7 +721,9 @@ mod tests { let desc_chain = prepare_desc_chain(GuestAddress(0), &mut buf, VIRTIO_I2C_FLAGS_M_RD, 4); let desc_chains = vec![desc_chain]; - backend.process_requests(desc_chains.clone(), None).unwrap(); + backend + .process_requests(desc_chains.clone(), &vring) + .unwrap(); validate_desc_chains(desc_chains, VIRTIO_I2C_MSG_ERR); }