aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/module.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/kernel/module.c b/kernel/module.c
index e8cf636e614b..1a9a3986b136 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1912,12 +1912,6 @@ static noinline struct module *load_module(void __user *umod,
1912 if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) 1912 if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL)
1913 return ERR_PTR(-ENOMEM); 1913 return ERR_PTR(-ENOMEM);
1914 1914
1915 /* Create stop_machine threads since the error path relies on
1916 * a non-failing stop_machine call. */
1917 err = stop_machine_create();
1918 if (err)
1919 goto free_hdr;
1920
1921 if (copy_from_user(hdr, umod, len) != 0) { 1915 if (copy_from_user(hdr, umod, len) != 0) {
1922 err = -EFAULT; 1916 err = -EFAULT;
1923 goto free_hdr; 1917 goto free_hdr;
@@ -2303,12 +2297,13 @@ static noinline struct module *load_module(void __user *umod,
2303 /* Get rid of temporary copy */ 2297 /* Get rid of temporary copy */
2304 vfree(hdr); 2298 vfree(hdr);
2305 2299
2306 stop_machine_destroy();
2307 /* Done! */ 2300 /* Done! */
2308 return mod; 2301 return mod;
2309 2302
2310 unlink: 2303 unlink:
2311 stop_machine(__unlink_module, mod, NULL); 2304 /* Unlink carefully: kallsyms could be walking list. */
2305 list_del_rcu(&mod->list);
2306 synchronize_sched();
2312 module_arch_cleanup(mod); 2307 module_arch_cleanup(mod);
2313 cleanup: 2308 cleanup:
2314 kobject_del(&mod->mkobj.kobj); 2309 kobject_del(&mod->mkobj.kobj);
@@ -2331,7 +2326,6 @@ static noinline struct module *load_module(void __user *umod,
2331 kfree(args); 2326 kfree(args);
2332 free_hdr: 2327 free_hdr:
2333 vfree(hdr); 2328 vfree(hdr);
2334 stop_machine_destroy();
2335 return ERR_PTR(err); 2329 return ERR_PTR(err);
2336 2330
2337 truncated: 2331 truncated: