From 900237a541a680e9097559eb67e329bfb0960d75 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Thu, 26 May 2022 13:29:27 -0700 Subject: [PATCH] devices: virtio-iommu: do not hold RefCell or lock across async Retrieve the translation response, which involves taking a mutable borrow of a RefCell as well as locking a Mutex, inside its own block so that the references are dropped before using await again. Fixes two new clippy warnings from Rust 1.61.0: - - BUG=None TEST=tools/clippy # Rust 1.61.0 Change-Id: If573af56968dceeae72a61a74f9f69dad8730364 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3671596 Tested-by: kokoro Reviewed-by: Anton Romanov Commit-Queue: Daniel Verkamp --- devices/src/virtio/iommu.rs | 40 +++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/devices/src/virtio/iommu.rs b/devices/src/virtio/iommu.rs index 42eae4657c..17d9fe8560 100644 --- a/devices/src/virtio/iommu.rs +++ b/devices/src/virtio/iommu.rs @@ -702,25 +702,27 @@ async fn handle_translate_request( iova, size, } = request_tube.next().await.map_err(IommuError::Tube)?; - if let Some(mapper) = endpoints.borrow_mut().get(&endpoint_id) { - response_tubes - .get(&endpoint_id) - .unwrap() - .send( - mapper - .lock() - .translate(iova, size) - .map_err(|e| { - error!("Failed to handle TranslateRequest: {}", e); - e - }) - .ok(), - ) - .await - .map_err(IommuError::Tube)?; - } else { - error!("endpoint_id {} not found", endpoint_id) - } + let translate_response: Option> = + if let Some(mapper) = endpoints.borrow_mut().get(&endpoint_id) { + mapper + .lock() + .translate(iova, size) + .map_err(|e| { + error!("Failed to handle TranslateRequest: {}", e); + e + }) + .ok() + } else { + error!("endpoint_id {} not found", endpoint_id); + continue; + }; + + response_tubes + .get(&endpoint_id) + .unwrap() + .send(translate_response) + .await + .map_err(IommuError::Tube)?; } }