[PATCH] module: don't use stop_machine on module load
Tim Gardner
tim.gardner at canonical.com
Tue Feb 24 14:05:12 UTC 2009
Scott James Remnant wrote:
> Kay Sievers <kay.sievers at vrfy.org> discovered that boot times are slowed
> by about half a second because all the stop_machine_create() calls,
> and he only probes about 40 modules (I have 125 loaded on this laptop).
>
> We only do stop_machine_create() so we can unlink the module if
> something goes wrong, but it's overkill (and buggy anyway: if
> stop_machine_create() fails we still call stop_machine_destroy()).
>
> Since we are only protecting against kallsyms (esp. oops) walking the
> list, synchronize_sched() is sufficient (synchronize_rcu() is probably
> sufficient, but we're not in a hurry).
>
> Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
> ---
> kernel/module.c | 12 +++---------
> 1 file changed, 3 insertions(+), 9 deletions(-)
>
> diff --git a/kernel/module.c b/kernel/module.c
> --- a/kernel/module.c
> +++ b/kernel/module.c
> @@ -1881,12 +1881,6 @@ static noinline struct module *load_modu
> 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;
> @@ -2271,12 +2265,13 @@ static noinline struct module *load_modu
> /* 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);
> @@ -2297,7 +2292,6 @@ static noinline struct module *load_modu
> kfree(args);
> free_hdr:
> vfree(hdr);
> - stop_machine_destroy();
> return ERR_PTR(err);
>
> truncated:
>
>
Can you request a pull from your local git repo? Please remember to add
proper provenance, e.g., where is Kay Sievers SOB or Tested By or
whatever. Also, the patch seems to be garbled whenever I save it as a
file from my Thunderbird client, something that has always worked in the
past. Thanks.
rtg
--
Tim Gardner tim.gardner at canonical.com
More information about the kernel-team
mailing list