|
@@ -1912,12 +1912,6 @@ static noinline struct module *load_module(void __user *umod,
|
|
|
if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- /* Create stop_machine threads since the error path relies on
|
|
|
- * a non-failing stop_machine call. */
|
|
|
- err = stop_machine_create();
|
|
|
- if (err)
|
|
|
- goto free_hdr;
|
|
|
-
|
|
|
if (copy_from_user(hdr, umod, len) != 0) {
|
|
|
err = -EFAULT;
|
|
|
goto free_hdr;
|
|
@@ -2303,12 +2297,13 @@ static noinline struct module *load_module(void __user *umod,
|
|
|
/* Get rid of temporary copy */
|
|
|
vfree(hdr);
|
|
|
|
|
|
- stop_machine_destroy();
|
|
|
/* Done! */
|
|
|
return mod;
|
|
|
|
|
|
unlink:
|
|
|
- stop_machine(__unlink_module, mod, NULL);
|
|
|
+ /* Unlink carefully: kallsyms could be walking list. */
|
|
|
+ list_del_rcu(&mod->list);
|
|
|
+ synchronize_sched();
|
|
|
module_arch_cleanup(mod);
|
|
|
cleanup:
|
|
|
kobject_del(&mod->mkobj.kobj);
|
|
@@ -2331,7 +2326,6 @@ static noinline struct module *load_module(void __user *umod,
|
|
|
kfree(args);
|
|
|
free_hdr:
|
|
|
vfree(hdr);
|
|
|
- stop_machine_destroy();
|
|
|
return ERR_PTR(err);
|
|
|
|
|
|
truncated:
|