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 <viresh.kumar@linaro.org>
This commit is contained in:
Viresh Kumar 2022-01-10 12:48:20 +05:30
parent b783e94040
commit 78da64c7f2

View File

@ -114,7 +114,7 @@ impl<D: I2cDevice> VhostUserI2cBackend<D> {
fn process_requests(
&self,
requests: Vec<I2cDescriptorChain>,
vring: Option<&VringRwLock>,
vring: &VringRwLock,
) -> Result<bool> {
let mut reqs: Vec<I2cReq> = Vec::new();
@ -239,10 +239,8 @@ impl<D: I2cDevice> VhostUserI2cBackend<D> {
.write_obj::<VirtioI2cInHdr>(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<D: I2cDevice> VhostUserI2cBackend<D> {
.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::<DummyDevice>::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::<I2cDescriptorChain>::new(), None)
.process_requests(Vec::<I2cDescriptorChain>::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::<DummyDevice>::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<u16> = 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::<VirtioI2cOutHdr>(), 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::<u8>(), 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);
}