module: drop the lock while waiting for module to complete initialization.
This fixes "gave up waiting for init of module libcrc32c." which happened at boot time due to multiple parallel module loads. The problem was a deadlock: we wait for a module to finish initializing, but we keep the module_lock mutex so it can't complete. In particular, this could reasonably happen if a module does a request_module() in its initialization routine. So we change use_module() to return an errno rather than a bool, and if it's -EBUSY we drop the lock and wait in the caller, then reaquire the lock. Reported-by: NBrandon Philips <brandon@ifup.org> Signed-off-by: NRusty Russell <rusty@rustcorp.com.au> Tested-by: NBrandon Philips <brandon@ifup.org>
Showing
想要评论请 注册 或 登录