From da8c1a9a403aed0fa06beeeb100c3c0c50b8362c Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Fri, 22 Feb 2019 13:29:40 -0500 Subject: [PATCH] USB: Don't loop endlessly waiting for a physical buffer. This is used quite a lot in critical transfer paths, so we don't want to lock things up if no buffers are available for whatever reason. Wait 2 seconds, and if we didn't get anything by then, return B_NO_MEMORY. Possibly fixes or helps with certain USB-related lockups. --- .../kernel/bus_managers/usb/PhysicalMemoryAllocator.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/bus_managers/usb/PhysicalMemoryAllocator.cpp b/src/add-ons/kernel/bus_managers/usb/PhysicalMemoryAllocator.cpp index 2bc3db2402..a1f09e0167 100644 --- a/src/add-ons/kernel/bus_managers/usb/PhysicalMemoryAllocator.cpp +++ b/src/add-ons/kernel/bus_managers/usb/PhysicalMemoryAllocator.cpp @@ -222,7 +222,10 @@ PhysicalMemoryAllocator::Allocate(size_t size, void **logicalAddress, TRACE_ERROR(("PMA: found no free slot to store %ld bytes, waiting\n", size)); - entry.Wait(); + if (entry.Wait(B_RELATIVE_TIMEOUT, 2 * 1000 * 1000) == B_TIMED_OUT) { + TRACE_ERROR(("PMA: timed out waiting for a free slot, giving up\n")); + break; + } if (!_Lock()) return B_ERROR;