[dev][usb-bus] remove some lock contention
Change-Id: I4fcf4d0e0fc5ce26903352d2c9ab2ea482d6b1dd
diff --git a/zircon/system/dev/usb/usb-bus/usb-device.cpp b/zircon/system/dev/usb/usb-bus/usb-device.cpp
index ee8ab98..442f902 100644
--- a/zircon/system/dev/usb/usb-bus/usb-device.cpp
+++ b/zircon/system/dev/usb/usb-bus/usb-device.cpp
@@ -102,6 +102,8 @@
}
bool UsbDevice::UpdateEndpoint(Endpoint* ep, usb_request_t* completed_req) {
+ fbl::AutoLock lock(&ep->lock);
+
auto unowned = UnownedRequest(completed_req, parent_req_size_, /* allow_destruct */ false);
std::optional<size_t> completed_req_idx = ep->pending_reqs.find(&unowned);
@@ -169,8 +171,6 @@
return;
}
- fbl::AutoLock lock(&ep->lock);
-
bool do_callback = UpdateEndpoint(ep, req);
if (do_callback) {
QueueCallback(req);
@@ -178,10 +178,12 @@
}
void UsbDevice::QueueCallback(usb_request_t* req) {
- fbl::AutoLock lock(&callback_lock_);
+ {
+ fbl::AutoLock lock(&callback_lock_);
- // move original request to completed_reqs list so it can be completed on the callback_thread
- completed_reqs_.push(UnownedRequest(req, parent_req_size_));
+ // move original request to completed_reqs list so it can be completed on the callback_thread
+ completed_reqs_.push(UnownedRequest(req, parent_req_size_));
+ }
sync_completion_signal(&callback_thread_completion_);
}
diff --git a/zircon/system/dev/usb/usb-bus/usb-device.h b/zircon/system/dev/usb/usb-bus/usb-device.h
index 87d58bf..16bf93b 100644
--- a/zircon/system/dev/usb/usb-bus/usb-device.h
+++ b/zircon/system/dev/usb/usb-bus/usb-device.h
@@ -130,7 +130,7 @@
// get a callback. If that prior request has also already completed,
// |out_additional_callback| will be populated.
// Returns true if a callback is required.
- bool UpdateEndpoint(Endpoint* ep, usb_request_t* completed_req) __TA_REQUIRES(ep->lock);
+ bool UpdateEndpoint(Endpoint* ep, usb_request_t* completed_req);
void RequestComplete(usb_request_t* req);
void QueueCallback(usb_request_t* req);