module: drop the lock while waiting for module to complete initialization.
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 19 May 2010 23:33:39 +0000 (17:33 -0600)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 19 May 2010 08:03:39 +0000 (17:33 +0930)
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: Brandon Philips <brandon@ifup.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Tested-by: Brandon Philips <brandon@ifup.org>
kernel/module.c

diff --cc kernel/module.c
Simple merge