diff --git a/headers/private/kernel/kdevice_manager.h b/headers/private/kernel/kdevice_manager.h index 9113773930..1f32eadcbd 100644 --- a/headers/private/kernel/kdevice_manager.h +++ b/headers/private/kernel/kdevice_manager.h @@ -7,6 +7,7 @@ #include +#include struct kernel_args; @@ -21,6 +22,8 @@ status_t device_manager_probe(const char *path, uint32 updateCycle); status_t device_manager_init(struct kernel_args *args); status_t device_manager_init_post_modules(struct kernel_args *args); +recursive_lock* device_manager_get_lock(); + #ifdef __cplusplus } #endif diff --git a/src/add-ons/kernel/bus_managers/usb/Stack.cpp b/src/add-ons/kernel/bus_managers/usb/Stack.cpp index c324858402..31d7633118 100644 --- a/src/add-ons/kernel/bus_managers/usb/Stack.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Stack.cpp @@ -11,10 +11,13 @@ #include #include #include +#include + #include "usb_private.h" #include "PhysicalMemoryAllocator.h" #include +#include Stack::Stack() @@ -214,6 +217,9 @@ Stack::ExploreThread(void *data) void Stack::Explore() { + // Acquire the device manager lock before the explore lock, to prevent lock-order inversion. + RecursiveLocker dmLocker(device_manager_get_lock()); + if (mutex_lock(&fExploreLock) != B_OK) return; diff --git a/src/system/kernel/device_manager/device_manager.cpp b/src/system/kernel/device_manager/device_manager.cpp index c0fbd0c2a8..96e88cd387 100644 --- a/src/system/kernel/device_manager/device_manager.cpp +++ b/src/system/kernel/device_manager/device_manager.cpp @@ -2489,3 +2489,10 @@ device_manager_init_post_modules(struct kernel_args* args) RecursiveLocker _(sLock); return sRootNode->Reprobe(); } + + +recursive_lock* +device_manager_get_lock() +{ + return &sLock; +}