]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - kernel/module.c
Merge tag 'sunxi-late-for-4.2' of https://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / kernel / module.c
index b4994adf7187df1515cec8be2e64c2dd905947d9..3e0e19763d246a998acb109c6979e4df593e3958 100644 (file)
@@ -18,7 +18,7 @@
 */
 #include <linux/export.h>
 #include <linux/moduleloader.h>
-#include <linux/ftrace_event.h>
+#include <linux/trace_events.h>
 #include <linux/init.h>
 #include <linux/kallsyms.h>
 #include <linux/file.h>
@@ -3258,7 +3258,7 @@ static noinline int do_init_module(struct module *mod)
         *
         * http://thread.gmane.org/gmane.linux.kernel/1420814
         */
-       if (current->flags & PF_USED_ASYNC)
+       if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
                async_synchronize_full();
 
        mutex_lock(&module_mutex);
@@ -3391,10 +3391,19 @@ out:
        return err;
 }
 
-static int unknown_module_param_cb(char *param, char *val, const char *modname)
+static int unknown_module_param_cb(char *param, char *val, const char *modname,
+                                  void *arg)
 {
+       struct module *mod = arg;
+       int ret;
+
+       if (strcmp(param, "async_probe") == 0) {
+               mod->async_probe_requested = true;
+               return 0;
+       }
+
        /* Check for magic 'dyndbg' arg */
-       int ret = ddebug_dyndbg_module_param_cb(param, val, modname);
+       ret = ddebug_dyndbg_module_param_cb(param, val, modname);
        if (ret != 0)
                pr_warn("%s: unknown parameter '%s' ignored\n", modname, param);
        return 0;
@@ -3498,7 +3507,8 @@ static int load_module(struct load_info *info, const char __user *uargs,
 
        /* Module is ready to execute: parsing args may do that. */
        after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
-                                 -32768, 32767, unknown_module_param_cb);
+                                 -32768, 32767, NULL,
+                                 unknown_module_param_cb);
        if (IS_ERR(after_dashes)) {
                err = PTR_ERR(after_dashes);
                goto bug_cleanup;
@@ -3526,6 +3536,9 @@ static int load_module(struct load_info *info, const char __user *uargs,
        module_bug_cleanup(mod);
        mutex_unlock(&module_mutex);
 
+       blocking_notifier_call_chain(&module_notify_list,
+                                    MODULE_STATE_GOING, mod);
+
        /* we can't deallocate the module until we clear memory protection */
        unset_module_init_ro_nx(mod);
        unset_module_core_ro_nx(mod);