diff options
Diffstat (limited to 'kernel/kmod.c')
| -rw-r--r-- | kernel/kmod.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/kmod.c b/kernel/kmod.c index 1c317e38683..ecd42b484db 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -38,6 +38,7 @@  #include <linux/suspend.h>  #include <linux/rwsem.h>  #include <linux/ptrace.h> +#include <linux/async.h>  #include <asm/uaccess.h>  #include <trace/events/module.h> @@ -130,6 +131,14 @@ int __request_module(bool wait, const char *fmt, ...)  #define MAX_KMOD_CONCURRENT 50	/* Completely arbitrary value - KAO */  	static int kmod_loop_msg; +	/* +	 * We don't allow synchronous module loading from async.  Module +	 * init may invoke async_synchronize_full() which will end up +	 * waiting for this task which already is waiting for the module +	 * loading to complete, leading to a deadlock. +	 */ +	WARN_ON_ONCE(wait && current_is_async()); +  	va_start(args, fmt);  	ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);  	va_end(args);  |