* [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel.
@ 2009-02-15 18:20 Andreas Robinson
2009-02-15 18:20 ` [RFC PATCH 1/6] New option: Static linking of external modules Andreas Robinson
` (6 more replies)
0 siblings, 7 replies; 46+ messages in thread
From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw)
To: sam, rusty; +Cc: linux-kernel
Hi guys,
as you know, systems with custom kernels boot faster, since they don't
need an initramfs or have to install modules. But, building a custom
kernel it is not really practical if you are releasing a distro, for
example.
This patchset aims to eventually solve that problem. It lets you link
external modules statically to the kernel and achive much the same
effect as changing the configuration and recompiling. You only need a
small part of a precompiled kernel tree (20-30MB, debug syms stripped)
and it's fast (15 seconds or less on an ordinary desktop PC).
Status: "Works for me", but has a bunch of TODOs (see below).
However, I hope you can comment on the bits that are done so far.
Thanks,
Andreas
Patches
-------
The patches are against 2.6.29-rc5.
The implementation is quite straightforward. I hope you think the commit
messages in the patches are clear enough.
TODOs
-----
- A makefile target that copies and prunes the tree to minimal
size. Work in progress.
- Arch-specific changes to kbuild. X86 is done though still ugly so
it is not included yet. I need to work some more on it first.
- Documentation.
- Proper testing.
How to use this thing in its current state
------------------------------------------
- Enable the new configuration option and build the kernel.
- Install and reboot.
- Collect the pathnames of the loaded modules in a text file
in the order you want the kernel to initialize them.
I use the this script. It is a bit slow, but works well
enough. (When I remember to run updatedb first.)
-------------8<----------------------------------
#!/bin/sh
k_ver="2.6.29-rc4"
for module in `tac /proc/modules`
do
modname=`echo $module | cut -f 1 -d ' ' | sed -e s/[-_]/[-_]?/g`
locate --regex /lib/modules/$k_ver/.*/$modname.ko
done
-------------8<----------------------------------
- Preprocess the modules named in the text file
(called modules.lst here). Run from the kernel tree root:
scripts/ld_extmodules.sh modules.lst output.o
- Relink the kernel:
e.g make vmlinux L=1 EXTOBJ=output.o
or
make bzImage L=1 EXTOBJ=output.o
- Install it.
- Move the linked modules from /lib/modules/*
to some other location and run depmod.
This has to be done so that udev won't try to
insert them a second time.
- Enjoy.
^ permalink raw reply [flat|nested] 46+ messages in thread* [RFC PATCH 1/6] New option: Static linking of external modules 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson @ 2009-02-15 18:20 ` Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 2/6] module: add module ELF section with module_init() pointer Andreas Robinson ` (5 subsequent siblings) 6 siblings, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw) To: sam, rusty; +Cc: linux-kernel Define configuration option CONFIG_MODULE_STATIC. --- init/Kconfig | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/init/Kconfig b/init/Kconfig index f068071..dc0f5aa 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1042,6 +1042,27 @@ config MODULE_SRCVERSION_ALL the version). With this option, such a "srcversion" field will be created for all modules. If unsure, say N. +config MODULE_STATIC + bool "Static module linking support (EXPERIMENTAL)" + depends on EXPERIMENTAL + help + Your computer will start slightly faster if device drivers are + built into the kernel rather than loaded as modules during the + boot process. + + However, a specialized kernel is impractical to build if the target + hardware configuration is unknown before installation, such as is + the case with generic Linux distributions. + + If you say Y here, you can build external modules into the kernel, + quickly and without a compiler and with less disk space needed + compared to a fully compiled kernel source tree. Note that your + modules must also be built with this option enabled. + + See <file:/Documentation/...TODO...> for more details. + + If unsure, say N. + endif # MODULES config INIT_ALL_POSSIBLE -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* [RFC PATCH 2/6] module: add module ELF section with module_init() pointer 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 1/6] New option: Static linking of external modules Andreas Robinson @ 2009-02-15 18:20 ` Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 3/6] module: always prefix module parameters with the module name Andreas Robinson ` (4 subsequent siblings) 6 siblings, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw) To: sam, rusty; +Cc: linux-kernel The linker script will append this section to the end of the list of initcalls so that init/main.c:do_initcalls() can find it. --- include/asm-generic/vmlinux.lds.h | 3 ++- include/linux/init.h | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index c61fab1..d3c0787 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -428,7 +428,8 @@ *(.initcall6.init) \ *(.initcall6s.init) \ *(.initcall7.init) \ - *(.initcall7s.init) + *(.initcall7s.init) \ + *(.mod_initcall.init) #define PERCPU(align) \ . = ALIGN(align); \ diff --git a/include/linux/init.h b/include/linux/init.h index 68cb026..62b854f 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -284,11 +284,20 @@ void __init parse_early_param(void); #define security_initcall(fn) module_init(fn) +#ifdef CONFIG_MODULE_STATIC +#define module_initcall(fn) \ + static initcall_t __initcall_##fn \ + __used __section(.mod_initcall.init) = fn +#else +#define module_initcall(fn) +#endif + /* Each module must use one module_init(). */ #define module_init(initfn) \ static inline initcall_t __inittest(void) \ { return initfn; } \ - int init_module(void) __attribute__((alias(#initfn))); + int init_module(void) __attribute__((alias(#initfn))); \ + module_initcall(initfn); /* This is only required if you want to be unloadable. */ #define module_exit(exitfn) \ -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* [RFC PATCH 3/6] module: always prefix module parameters with the module name 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 1/6] New option: Static linking of external modules Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 2/6] module: add module ELF section with module_init() pointer Andreas Robinson @ 2009-02-15 18:20 ` Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 4/6] kbuild: allow linking of an external object into vmlinux Andreas Robinson ` (3 subsequent siblings) 6 siblings, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw) To: sam, rusty; +Cc: linux-kernel The parameters in statically linked modules now end up in the proper sysfs directories, ie /sys/module/<modname>/parameter/* --- include/linux/moduleparam.h | 2 +- kernel/params.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index e4af339..0cb2867 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -7,7 +7,7 @@ /* You can override this manually, but generally this should match the module name. */ -#ifdef MODULE +#if defined(MODULE) && !defined(CONFIG_MODULE_STATIC) #define MODULE_PARAM_PREFIX /* empty */ #else #define MODULE_PARAM_PREFIX KBUILD_MODNAME "." diff --git a/kernel/params.c b/kernel/params.c index a1e3025..22af6ee 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -518,6 +518,19 @@ static void free_module_param_attrs(struct module_kobject *mk) mk->mp = NULL; } +#ifdef CONFIG_MODULE_STATIC +static const char *skip_param_modname(const char *name) +{ + const char *dot = strchr(name, '.'); + return (!dot) ? name : dot + 1; +} +#else +static const char *skip_param_modname(const char *name) +{ + return name; +} +#endif + /* * module_param_sysfs_setup - setup sysfs support for one module * @mod: module @@ -535,9 +548,11 @@ int module_param_sysfs_setup(struct module *mod, bool params = false; for (i = 0; i < num_params; i++) { + const char *name; if (kparam[i].perm == 0) continue; - err = add_sysfs_param(&mod->mkobj, &kparam[i], kparam[i].name); + name = skip_param_modname(kparam[i].name); + err = add_sysfs_param(&mod->mkobj, &kparam[i], name); if (err) return err; params = true; -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* [RFC PATCH 4/6] kbuild: allow linking of an external object into vmlinux 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson ` (2 preceding siblings ...) 2009-02-15 18:20 ` [RFC PATCH 3/6] module: always prefix module parameters with the module name Andreas Robinson @ 2009-02-15 18:20 ` Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 5/6] scripts: new module preprocessor for static linking Andreas Robinson ` (2 subsequent siblings) 6 siblings, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw) To: sam, rusty; +Cc: linux-kernel --- Makefile | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 22d7584..921d6b4 100644 --- a/Makefile +++ b/Makefile @@ -651,7 +651,8 @@ libs-y := $(libs-y1) $(libs-y2) # Build vmlinux # --------------------------------------------------------------------------- # vmlinux is built from the objects selected by $(vmlinux-init) and -# $(vmlinux-main). Most are built-in.o files from top-level directories +# $(vmlinux-main) and an optional object $(EXTOBJ) specified when +# running make. Most are built-in.o files from top-level directories # in the kernel tree, others are specified in arch/$(ARCH)/Makefile. # Ordering when linking is important, and $(vmlinux-init) must be first. # @@ -664,6 +665,8 @@ libs-y := $(libs-y1) $(libs-y2) # +--< $(vmlinux-main) # | +--< driver/built-in.o mm/built-in.o + more # | +# +--< $(EXTOBJ) (optional) +# | # +-< kallsyms.o (see description in CONFIG_KALLSYMS section) # # vmlinux version (uname -v) cannot be updated during normal @@ -686,7 +689,7 @@ export KBUILD_VMLINUX_OBJS := $(vmlinux-all) quiet_cmd_vmlinux__ ?= LD $@ cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \ -T $(vmlinux-lds) $(vmlinux-init) \ - --start-group $(vmlinux-main) --end-group \ + --start-group $(vmlinux-main) $(EXTOBJ) --end-group \ $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^) # Generate new vmlinux version -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* [RFC PATCH 5/6] scripts: new module preprocessor for static linking 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson ` (3 preceding siblings ...) 2009-02-15 18:20 ` [RFC PATCH 4/6] kbuild: allow linking of an external object into vmlinux Andreas Robinson @ 2009-02-15 18:20 ` Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 6/6] kbuild: enable relinking of vmlinux without full kernel tree Andreas Robinson 2009-02-16 22:51 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell 6 siblings, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw) To: sam, rusty; +Cc: linux-kernel This script strips unneeded sections, resolves duplicate symbols and concatenates multiple modules into a single object file suitable for linking with vmlinux. Problem: Debug symbols must be stripped or else objcopy won't remove any sections. --- scripts/ld_extmodules.sh | 149 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 149 insertions(+), 0 deletions(-) create mode 100755 scripts/ld_extmodules.sh diff --git a/scripts/ld_extmodules.sh b/scripts/ld_extmodules.sh new file mode 100755 index 0000000..6049bfd --- /dev/null +++ b/scripts/ld_extmodules.sh @@ -0,0 +1,149 @@ +#!/bin/sh +# Copyright (C) 2009 Andreas Robinson <andr345@gmail.com> +# +# Released under the terms of the GNU GPL v2 or later. + +# Usage ############################### + +if [ "$#" -ne "2" ] +then + +cat << EOF + +Prepare and link a set of modules for static linking with the kernel. + +Usage: `basename $0` <modules.lst> <output.o> + +<modules.lst> List of modules to link, in insertion order. + This is a plain text file with one pathname per line. +<output.o> Output object file. + You can use modinfo or "readelf -p .modinfo" to read + the table of contents. + +If the target architecture differs from your host, you must set the +CROSS_COMPILE environment variable. It is used as a prefix for the +binutil commands. + +EOF + +exit 1 +fi + +#CROSS_COMPILE= +LD=${CROSS_COMPILE}ld +NM=${CROSS_COMPILE}nm +STRIP=${CROSS_COMPILE}strip +OBJCOPY=${CROSS_COMPILE}objcopy +OBJDUMP=${CROSS_COMPILE}objdump +READELF=${CROSS_COMPILE}readelf + +# Helper functions #################### + +# Simple "modinfo -F". No need to depend on module-init-tools. +# $1 = module +# $2 = field name. +my_modinfo() +{ + ${READELF} $1 -p .modinfo | grep -o "$2=.*" | sed s/"$2="//g +} + +# Returns true if module $1 has a GPL compatible license. +# If a module has more than one license tag, (some do), +# this function will only look at the first one. +is_gpl_compatible() +{ + license=`my_modinfo $1 license | head -n 1` + [ "$license" = "GPL" ] || + [ "$license" = "GPL v2" ] || + [ "$license" = "GPL and additional rights" ] || + [ "$license" = "Dual BSD/GPL" ] || + [ "$license" = "Dual MIT/GPL" ] || + [ "$license" = "Dual MPL/GPL" ] +} + +# Returns true if ELF-file $1 has a section named $2 . +have_section() +{ + [ "`${OBJDUMP} -h $1 | grep -o $2`" != "" ] +} + +# Main ################################ + +rm -f .tmp_mod* $2 + +cat $1 | while read module; +do + # Cull unhandled files + + if [ ! -f "$module" ] + then + echo Skipped: $module - file not found. + continue + fi + + if ! have_section $module .gnu.linkonce.this_module + then + echo Skipped: $module - not a kernel module. + continue + fi + + if ! is_gpl_compatible $module + then + echo Skipped: $module - not GPL compatible. + continue + fi + + if ! have_section $module .mod_initcall.init + then + echo "Warning: `basename $module` has no " \ + ".mod_initcall.init section." + echo " The kernel will not call this " \ + "module's init function." + fi + + # Add to table of contents. (module pathname and srcversion.) + printf "module=$module `my_modinfo $module srcversion`\0" \ + >> .tmp_mod_toc.txt + + # Prepare module for linking with the kernel + + ${NM} $module 2> /dev/null | \ + grep -o "__mod_.*_device_table" > .tmp_mod_devtbl + + ${LD} -r --defsym __this_module=0 $module -o .tmp_mod1.o + + ${OBJCOPY} --strip-debug \ + --remove-section .gnu.linkonce.this_module \ + --remove-section .modinfo \ + --localize-symbol init_module \ + --localize-symbol cleanup_module \ + --localize-symbol __this_module \ + .tmp_mod1.o + + if [ ! -f .tmp_mod1.o ] + then + echo Skipped: $module - objcopy failed. + continue + fi + + if [ -s .tmp_mod_devtbl ] + then + ${OBJCOPY} --strip-symbols .tmp_mod_devtbl .tmp_mod1.o + fi + + # Merge modules into one file. + + if [ ! -f $2 ]; then + mv .tmp_mod1.o $2 + else + ${LD} -r $2 .tmp_mod1.o -o .tmp_mod2.o + mv .tmp_mod2.o $2 + fi + + echo Merged: $module +done + +# Insert table of contents + +${OBJCOPY} --add-section .modinfo=.tmp_mod_toc.txt $2 + -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* [RFC PATCH 6/6] kbuild: enable relinking of vmlinux without full kernel tree 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson ` (4 preceding siblings ...) 2009-02-15 18:20 ` [RFC PATCH 5/6] scripts: new module preprocessor for static linking Andreas Robinson @ 2009-02-15 18:20 ` Andreas Robinson 2009-02-16 22:51 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell 6 siblings, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-15 18:20 UTC (permalink / raw) To: sam, rusty; +Cc: linux-kernel A make parameter "L=1" enables relinking vmlinux from existing objects. Make will only look at toplevel built-in.o and lib.a. The source and lower-level objects are ignored. --- Makefile | 29 ++++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletions(-) diff --git a/Makefile b/Makefile index 921d6b4..74a5e5f 100644 --- a/Makefile +++ b/Makefile @@ -75,6 +75,17 @@ ifdef M endif endif +# Use 'make L=1' to skip compilation and relink the existing +# objects. All objects must exist. + +ifdef L + ifeq ("$(origin L)", "command line") + KBUILD_RELINK := $(L) + endif +endif +ifndef KBUILD_RELINK + KBUILD_RELINK := 0 +endif # kbuild supports saving output files in a separate directory. # To locate output files in a separate directory two syntaxes are supported. @@ -257,7 +268,7 @@ ifeq ($(MAKECMDGOALS),) endif export KBUILD_MODULES KBUILD_BUILTIN -export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD +export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD KBUILD_RELINK # Beautify output # --------------------------------------------------------------------------- @@ -459,12 +470,14 @@ else # targets and others. In general all targets except *config targets. ifeq ($(KBUILD_EXTMOD),) +ifeq ($(KBUILD_RELINK),0) # Additional helpers built in scripts/ # Carefully list dependencies so we do not try to build scripts twice # in parallel PHONY += scripts scripts: scripts_basic include/config/auto.conf $(Q)$(MAKE) $(build)=$(@) +endif # KBUILD_RELINK # Objects we will link into vmlinux / subdirs we need to visit init-y := init/ @@ -692,6 +705,7 @@ quiet_cmd_vmlinux__ ?= LD $@ --start-group $(vmlinux-main) $(EXTOBJ) --end-group \ $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o FORCE ,$^) +ifeq ($(KBUILD_RELINK),0) # Generate new vmlinux version quiet_cmd_vmlinux_version = GEN .version cmd_vmlinux_version = set -e; \ @@ -703,6 +717,7 @@ quiet_cmd_vmlinux_version = GEN .version expr 0$$(cat .old_version) + 1 >.version; \ fi; \ $(MAKE) $(build)=init +endif # Generate System.map quiet_cmd_sysmap = SYSMAP @@ -851,6 +866,13 @@ modpost-init := $(filter-out init/built-in.o, $(vmlinux-init)) vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE $(call if_changed_rule,vmlinux-modpost) +relinked-objs := $(vmlinux-init) $(vmlinux-main) $(vmlinux-lds) + +ifeq ($(KBUILD_RELINK),1) +$(relinked-objs): FORCE + $(call if_changed,touch) +else # The endif is way down. Search for next KBUILD_RELINK. + # The actual objects are generated when descending, # make sure no implicit rule kicks in $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; @@ -1234,6 +1256,7 @@ distclean: mrproper -o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \ -type f -print | xargs rm -f +endif # KBUILD_RELINK # Packaging of the kernel to various formats # --------------------------------------------------------------------------- @@ -1316,6 +1339,7 @@ help: @echo ' make O=dir [targets] Locate all output files in "dir", including .config' @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' @echo ' make C=2 [targets] Force check of all c source with $$CHECK' + @echo ' make L=1 [targets] Skip compilation and relink existing objects.' @echo '' @echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'For further info see the ./README file' @@ -1556,6 +1580,9 @@ a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \ quiet_cmd_as_o_S = AS $@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< +quiet_cmd_touch = TOUCH $@ +cmd_touch = if [ -f $@ ]; then touch $@; else echo $@ missing.; exit 1; fi + # read all saved command lines targets := $(wildcard $(sort $(targets))) -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson ` (5 preceding siblings ...) 2009-02-15 18:20 ` [RFC PATCH 6/6] kbuild: enable relinking of vmlinux without full kernel tree Andreas Robinson @ 2009-02-16 22:51 ` Rusty Russell 2009-02-17 10:42 ` Andreas Robinson 6 siblings, 1 reply; 46+ messages in thread From: Rusty Russell @ 2009-02-16 22:51 UTC (permalink / raw) To: Andreas Robinson; +Cc: sam, linux-kernel On Monday 16 February 2009 04:50:22 Andreas Robinson wrote: > Hi guys, > > as you know, systems with custom kernels boot faster, since they don't > need an initramfs or have to install modules. But, building a custom > kernel it is not really practical if you are releasing a distro, for > example. Hi Andreas, This isn't crazy. But you'd need to benchmark against the minimal userspace solution: a binary with all the modules built into it which calls sys_init_module on each one, then does the root swizzle or whatever. I think you'd find the difference to be in the noise. Thanks, Rusty. ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-16 22:51 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell @ 2009-02-17 10:42 ` Andreas Robinson 2009-02-17 11:53 ` Kay Sievers 0 siblings, 1 reply; 46+ messages in thread From: Andreas Robinson @ 2009-02-17 10:42 UTC (permalink / raw) To: Rusty Russell; +Cc: sam, linux-kernel On Mon, Feb 16, 2009 at 11:51 PM, Rusty Russell <rusty@rustcorp.com.au> wrote: > Hi Andreas, > > This isn't crazy. But you'd need to benchmark against the minimal > userspace solution: a binary with all the modules built into > it which calls sys_init_module on each one, then does the root swizzle > or whatever. > > I think you'd find the difference to be in the noise. Hi Rusty, your're right and I'll get right on it. Cheers, Andreas > > Thanks, > Rusty. > ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-17 10:42 ` Andreas Robinson @ 2009-02-17 11:53 ` Kay Sievers 2009-02-18 4:58 ` Rusty Russell 0 siblings, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-17 11:53 UTC (permalink / raw) To: Andreas Robinson; +Cc: Rusty Russell, sam, linux-kernel On Tue, Feb 17, 2009 at 11:42, Andreas Robinson <andr345@gmail.com> wrote: > On Mon, Feb 16, 2009 at 11:51 PM, Rusty Russell <rusty@rustcorp.com.au> wrote: >> >> This isn't crazy. But you'd need to benchmark against the minimal >> userspace solution: a binary with all the modules built into >> it which calls sys_init_module on each one, then does the root swizzle >> or whatever. >> >> I think you'd find the difference to be in the noise. Usual distro setups load like 100+ modules on every bootup. Modprobing and symbol-resolving is serialized and uses stop_machine(), so there might be some significant difference here when loading a huge number of modules individually. Monolithic versus modular kernels usually make about 2+ seconds difference on a recent laptop. > your're right and I'll get right on it. For distros it's probably more interesting not to get rid of the initramfs, but possibly have the mkinitrd/mkinitramfs tool to pre-link all the usual modules if faster bootup is expected. Having only the few modules pre-linked which are usually included in the initramfs, might, as Rusty expects, not make that much difference. Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-17 11:53 ` Kay Sievers @ 2009-02-18 4:58 ` Rusty Russell 2009-02-18 9:15 ` Kay Sievers 0 siblings, 1 reply; 46+ messages in thread From: Rusty Russell @ 2009-02-18 4:58 UTC (permalink / raw) To: Kay Sievers; +Cc: Andreas Robinson, sam, linux-kernel On Tuesday 17 February 2009 22:23:25 Kay Sievers wrote: > Monolithic versus modular kernels usually > make about 2+ seconds difference on a recent laptop. Thanks for the fact injection. How about a megamodule then? Cheers, Rusty. ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-18 4:58 ` Rusty Russell @ 2009-02-18 9:15 ` Kay Sievers 2009-02-18 10:25 ` Andreas Robinson 2009-02-18 11:57 ` Rusty Russell 0 siblings, 2 replies; 46+ messages in thread From: Kay Sievers @ 2009-02-18 9:15 UTC (permalink / raw) To: Rusty Russell; +Cc: Andreas Robinson, sam, linux-kernel On Wed, Feb 18, 2009 at 05:58, Rusty Russell <rusty@rustcorp.com.au> wrote: > On Tuesday 17 February 2009 22:23:25 Kay Sievers wrote: >> Monolithic versus modular kernels usually >> make about 2+ seconds difference on a recent laptop. > > Thanks for the fact injection. How about a megamodule then? Sounds interesting. The ability to load multiple modules with a single call may help, if such a call could be handled faster than individual calls. Modprobe's modules added by dependencies of the requested module, or modprobe -a could probably use such a facility. Or do you think, the time the kernel needs to be locked can be minimized somehow, so we get more parallelism and less serialization? The current load_module() wraps ~400 lines of pretty heavy code in stop_machine(), if we could possibly make that window smaller, so that multiple instances could prepare some of the work in parallel, and only a fraction of the current work would need to be serialized? If that could be improved for the common distro case of running ~90 modprobe calls on bootup, many of them running in parallel, linking ~100 modules in, all in a time-frame of ~2-3 seconds -- that maybe would attack the real "problem"? Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-18 9:15 ` Kay Sievers @ 2009-02-18 10:25 ` Andreas Robinson 2009-02-20 0:37 ` Andreas Robinson 2009-02-18 11:57 ` Rusty Russell 1 sibling, 1 reply; 46+ messages in thread From: Andreas Robinson @ 2009-02-18 10:25 UTC (permalink / raw) To: Kay Sievers; +Cc: Rusty Russell, sam, linux-kernel It is not in the patchset, but I have code for inserting megamodules already. So, I can benchmark and compare these setups: - Monolithic kernel without initramfs. - Generic with initramfs. insmod'ing all modules. (95 of them in this case.) - Generic with initramfs, insmod'ing a megamodule. Is there anything else I ought to test? Time is a bit short today, but I hope to have the results tomorrow night (CET) at the latest. /Andreas ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-18 10:25 ` Andreas Robinson @ 2009-02-20 0:37 ` Andreas Robinson 2009-02-20 1:55 ` Kay Sievers 2009-02-24 1:27 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell 0 siblings, 2 replies; 46+ messages in thread From: Andreas Robinson @ 2009-02-20 0:37 UTC (permalink / raw) To: Kay Sievers; +Cc: Rusty Russell, sam, linux-kernel Ok, I've run some tests now and the results are not quite what I expected. There are 3 cases: Case 1 used a monolithic kernel with a full set of 95 inked-in external modules. Case 2 loaded a single mega-module (same set of 95 modules of course) while case 3 looped through a list of pathnames and called insmod on each one. The test machine boots the monolithic kernel in 6.27 seconds. This is about 0.5 seconds faster than the other two cases, that were roughly equal. The setup: HP pavillion dv6300 laptop, TL-56 Turion 64 X2 CPU @1.8GHz, 5400 RPM 2.5" Seagate SATA drive Linux 2.6.29-rc5, with the .config derived from the generic Ubuntu 8.10 kernel. All three cases had a minimal initramfs with busybox, insmod and an init script that only inserted modules and then halted. IOW, no root fs was mounted. The results: 1. Monolithic: 6.27 s, (0.22). bzImg=3419 kB ramfs=515 kB 2. Megamodule: 6.80 s, (0.16). bzImg=2297 kB ramfs=1783 kB 3. Insmod list: 6.83 s, (0.07). bzImg=2297 kB ramfs=1942 kB 10 samples were taken in each case. Standard deviations are in parenthesis. The measured times are printk timestamps from a dummy module inserted last. Reading these benchmark results I can only conclude that my work is useless and life has no meaning. So, what's missing or been done wrong here? I expected the difference between monolithic and modular to be greater to be honest. Cheers, Andreas ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 0:37 ` Andreas Robinson @ 2009-02-20 1:55 ` Kay Sievers 2009-02-21 11:43 ` Andreas Robinson 2009-02-24 1:27 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell 1 sibling, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-20 1:55 UTC (permalink / raw) To: Andreas Robinson; +Cc: Rusty Russell, sam, linux-kernel On Fri, Feb 20, 2009 at 01:37, Andreas Robinson <andr345@gmail.com> wrote: > Ok, I've run some tests now and the results are not quite what I expected. > > There are 3 cases: > > Case 1 used a monolithic kernel with a full set of 95 inked-in > external modules. > Case 2 loaded a single mega-module (same set of 95 modules of course) > while case 3 looped through a list of pathnames and called insmod on > each one. > > The test machine boots the monolithic kernel in 6.27 seconds. This is > about 0.5 seconds faster than the other two cases, that were roughly > equal. > > The setup: > > HP pavillion dv6300 laptop, > TL-56 Turion 64 X2 CPU @1.8GHz, 5400 RPM 2.5" Seagate SATA drive > > Linux 2.6.29-rc5, with the .config derived from the generic Ubuntu 8.10 kernel. > > All three cases had a minimal initramfs with busybox, insmod and an > init script that only inserted modules and then halted. IOW, no root > fs was mounted. > > The results: > > 1. Monolithic: 6.27 s, (0.22). bzImg=3419 kB ramfs=515 kB > 2. Megamodule: 6.80 s, (0.16). bzImg=2297 kB ramfs=1783 kB > 3. Insmod list: 6.83 s, (0.07). bzImg=2297 kB ramfs=1942 kB > > 10 samples were taken in each case. Standard deviations are in parenthesis. > The measured times are printk timestamps from a dummy module inserted last. > > Reading these benchmark results I can only conclude that my work is > useless and life has no meaning. > > So, what's missing or been done wrong here? I expected the difference > between monolithic and modular to be greater to be honest. How do you compare the monolithic kernel? What are the 6.27 seconds here? The time to boot into /sbin/init without any module load? I wouldn't be surprised if you just wait in the kernel for some hardware, driven by a built-in module, to init. Do you use current git and the "fastboot" commandline option? I don't think the megamodule will help us much, unless we change the kernel to parallelize something here, or save some other overhead. It should not be different from the serial insmods, if the data is not sprinkled over the disk, which an initramfs isn't. And the fragmentation problem should not be solved with a mega-module. :) The general problem is that todays distros start like 100 modprobes in 2 seconds, which does not really compare to a sequential insmod test. I'm pretty sure, for real-world numbers we need to load them in parallel, and look at the kernel side, if we can minimize the locked code area, so we can do as much as possible in parallel. Only if that is addressed, I think, we can get useful numbers how much time we really spend in in-kernel linking and can start evaluating if pre-linking modules would make sense, or not. Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 1:55 ` Kay Sievers @ 2009-02-21 11:43 ` Andreas Robinson 2009-03-02 14:32 ` Andreas Robinson 0 siblings, 1 reply; 46+ messages in thread From: Andreas Robinson @ 2009-02-21 11:43 UTC (permalink / raw) To: Kay Sievers; +Cc: Rusty Russell, sam, linux-kernel On Fri, 2009-02-20 at 02:55 +0100, Kay Sievers wrote: > On Fri, Feb 20, 2009 at 01:37, Andreas Robinson <andr345@gmail.com> wrote: [...] > > So, what's missing or been done wrong here? I expected the difference > > between monolithic and modular to be greater to be honest. > > How do you compare the monolithic kernel? What are the 6.27 seconds > here? The time to boot into /sbin/init without any module load? It is a wall-time comparison testing how long it takes until all drivers are initialized. The last driver to be initialized is a dummy module that merely prints a timestamp in its init function. That's where the 6.27 seconds come from. So, the initramfs should have no impact on the monolithic case as it is not accessed until after the initcalls. > I wouldn't be surprised if you just wait in the kernel for some > hardware, driven by a built-in module, to init. Do you use current git > and the "fastboot" commandline option? Current git, yes. Fastboot, no, I didn't know it existed! Adding fastboot, there are dramatic improvements; monolithic boot time is now 3.08 seconds, megamodule is 3.37 and insmod list 3.85. So you are right to not be surprised. :) > I don't think the megamodule will help us much, unless we change the > kernel to parallelize something here, or save some other overhead. It > should not be different from the serial insmods, if the data is not > sprinkled over the disk, which an initramfs isn't. And the > fragmentation problem should not be solved with a mega-module. :) > > The general problem is that todays distros start like 100 modprobes in > 2 seconds, which does not really compare to a sequential insmod test. > > I'm pretty sure, for real-world numbers we need to load them in > parallel, and look at the kernel side, if we can minimize the locked > code area, so we can do as much as possible in parallel. > > Only if that is addressed, I think, we can get useful numbers how much > time we really spend in in-kernel linking and can start evaluating if > pre-linking modules would make sense, or not. Understood. I will parallelize things, add Rusty's patch and see where we end up! Cheers, Andreas > > Thanks, > Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-21 11:43 ` Andreas Robinson @ 2009-03-02 14:32 ` Andreas Robinson 2009-03-02 15:59 ` Kay Sievers 2009-03-02 16:20 ` Arjan van de Ven 0 siblings, 2 replies; 46+ messages in thread From: Andreas Robinson @ 2009-03-02 14:32 UTC (permalink / raw) To: Kay Sievers; +Cc: Rusty Russell, sam, linux-kernel I have finished testing parallel module loading. It looks like a small kernel with a minimal initramfs and running several instances of insmod or modprobe in parallel has the best complexity to performance ratio. Testing shows that a megamodule is slightly slower than parallel insmods, so it's not really an option anymore. A monolithic kernel with parallelized initcalls is better - about 200 ms faster than parallel insmods on my test system. However, it comes with a fairly large set of changes: * First, you need a 200-line patch in init/main.c (do_initcalls() and friends) * Then the built-in module dependencies must be calculated properly, eg with a modified depmod, and added to the build process. * Finally "soft" dependencies, i.e dependencies that are not implied by symbol use, have to be formalized and moved into the kernel somehow. Right now they're only defined in "install" commands in modprobe.conf. So, what do you think, should I keep going? IMHO, the slower userspace implementation is acceptable since it's so much simpler. Thanks, Andreas ------------------------ Here are the test results: Setup: HP Pavillion DV6300 laptop. AMD Turion TL-56 @ 1.8GHz CPU. In a benchmark at Tomshardware, the CPU have scores similar to an Intel core duo T2300. http://www.tomshardware.com/reviews/dual-core-notebook-cpus-explored,1553-11.html Results: Configuration | T | stddev (n = 10) ------------------------------------+--------+-------- [1] Serial monolithic kernel | 3.08 s | 0.08 [2] Megamodule, serial initcalls | 3.26 s | 0.05 [3] Megamodule, parallel initcalls | 2.27 s | 0.01 [4] Parallel insmods w/ mutex patch | 2.20 s | 0.01 <- best choice [5] Parallel monolithic kernel | 2.02 s | <- estimate only T = Time from kernel startup until all module initcalls have executed, i.e when init can mount the root filesystem. [1] Monolithic 2.6.29-rc5 with fastboot cmdline option. No initramfs. [2] 94 modules linked into one megamodule. The megamodule executed module initcalls sequentially. All files were on a minimal initramfs. The kernel had fastboot enabled. [3] 94 modules inserted with custom insmod, in parallel. (Dependencies were accounted for.) Minimal initramfs, fastboot. [4] Like [2], but initcalls ran in parallel. (Dependencies were accounted for.) Minimal initramfs, fastboot. Rusty's module loader mutex-patch is applied. [5] This is an estimation based on how much faster [3] would be if load_module() took no time at all. T5 = T3 - (T2 - T1). That is, I assume T2-T1 is the time spent in load_module(). Note: By minimal initramfs, I mean one such that it, plus small kernel, is roughly the same size as the equivalent monolithic kernel. The only executable on it is init, written in C. There are no shell scripts, busybox, progress bars or unused modules. ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-02 14:32 ` Andreas Robinson @ 2009-03-02 15:59 ` Kay Sievers 2009-03-02 16:20 ` Arjan van de Ven 1 sibling, 0 replies; 46+ messages in thread From: Kay Sievers @ 2009-03-02 15:59 UTC (permalink / raw) To: Andreas Robinson; +Cc: Rusty Russell, sam, linux-kernel On Mon, Mar 2, 2009 at 15:32, Andreas Robinson <andr345@gmail.com> wrote: > I have finished testing parallel module loading. It looks like a small > kernel with a minimal initramfs and running several instances of insmod > or modprobe in parallel has the best complexity to performance ratio. > > Testing shows that a megamodule is slightly slower than parallel > insmods, so it's not really an option anymore. That's what I expected, that we would need more changes, to make a mega-module working, because we need parallel code execution here. > A monolithic kernel with parallelized initcalls is better - about 200 ms > faster than parallel insmods on my test system. However, it comes with a > fairly large set of changes: > > * First, you need a 200-line patch in init/main.c (do_initcalls() and > friends) > > * Then the built-in module dependencies must be calculated properly, eg > with a modified depmod, and added to the build process. > > * Finally "soft" dependencies, i.e dependencies that are not implied by > symbol use, have to be formalized and moved into the kernel somehow. > Right now they're only defined in "install" commands in modprobe.conf. > > So, what do you think, should I keep going? IMHO, the slower userspace > implementation is acceptable since it's so much simpler. I think so too, and think we are fine using the current standard tools. Also the recent modprobe changes make modprobe very fast by using a binary index to resolve aliases. I think, we can leave the stuff as it is. Seems with the queued stop-machine()-removal patch, and possibly with the minimized-mutex patch Rusty did, we are fine for now -- at least with the current numbers, and from a distro's point of view. Most of the "module load delay" distros see, are likely caused by I/O loading the module from disk into the kernel, at least that's what my profiles show. I did all the recent tests (which is a real world udev coldplug) with a ramfs mount containing a copy of the module directory, before running the module autoloader. I can link 40 modules in 0.26 seconds into the kernel with the recent kernel patches. Thanks for all your testing, it was really helpful, and your patches have been the reason we've found the stop-machine problem. I'm glad that we have real numbers now to point people to. It seems, that we don't need to start fiddling around with hacks in userspace or initramfs tools. Thanks a lot, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-02 14:32 ` Andreas Robinson 2009-03-02 15:59 ` Kay Sievers @ 2009-03-02 16:20 ` Arjan van de Ven 2009-03-02 16:29 ` Kay Sievers 2009-03-06 7:05 ` fastboot kernel parameter Sitsofe Wheeler 1 sibling, 2 replies; 46+ messages in thread From: Arjan van de Ven @ 2009-03-02 16:20 UTC (permalink / raw) To: Andreas Robinson; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel > A monolithic kernel with parallelized initcalls is better - about 200 > ms faster than parallel insmods on my test system. However, it comes > with a fairly large set of changes: > > * First, you need a 200-line patch in init/main.c (do_initcalls() and > friends) why? We already have async function calls; and those speed up my boot (when enabled) significantly, by doing much of the kernel/driver init in parallel. My server box boots the whole kernel (including all drivers; I build verything in) in 0.56 seconds, and my net books do it in around 1.0 seconds. > > * Then the built-in module dependencies must be calculated properly, > eg with a modified depmod, and added to the build process. nope not if done right > So, what do you think, should I keep going? IMHO, the slower userspace > implementation is acceptable since it's so much simpler. I would strongly suggest that you turn on the async function calls and look at the boot graph of the resulting kernel boot... if you send that to me I can also take a look and make suggestions.... ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-02 16:20 ` Arjan van de Ven @ 2009-03-02 16:29 ` Kay Sievers 2009-03-02 18:27 ` Arjan van de Ven 2009-03-06 7:05 ` fastboot kernel parameter Sitsofe Wheeler 1 sibling, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-03-02 16:29 UTC (permalink / raw) To: Arjan van de Ven; +Cc: Andreas Robinson, Rusty Russell, sam, linux-kernel On Mon, Mar 2, 2009 at 17:20, Arjan van de Ven <arjan@infradead.org> wrote: >> A monolithic kernel with parallelized initcalls is better - about 200 >> ms faster than parallel insmods on my test system. However, it comes >> with a fairly large set of changes: >> >> * First, you need a 200-line patch in init/main.c (do_initcalls() and >> friends) > > why? > We already have async function calls; and those speed up my boot (when > enabled) significantly, by doing much of the kernel/driver init in > parallel. > > My server box boots the whole kernel (including all drivers; I build > verything in) in 0.56 seconds, and my net books do it in around 1.0 > seconds. > >> >> * Then the built-in module dependencies must be calculated properly, >> eg with a modified depmod, and added to the build process. > > nope not if done right > >> So, what do you think, should I keep going? IMHO, the slower userspace >> implementation is acceptable since it's so much simpler. > > I would strongly suggest that you turn on the async function calls and > look at the boot graph of the resulting kernel boot... if you send > that to me I can also take a look and make suggestions.... The "fastboot" kernel commandline option was used, as mentioned in the mail. Is there anything else? Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-02 16:29 ` Kay Sievers @ 2009-03-02 18:27 ` Arjan van de Ven 2009-03-02 21:41 ` Andreas Robinson 2009-03-04 18:47 ` Andreas Robinson 0 siblings, 2 replies; 46+ messages in thread From: Arjan van de Ven @ 2009-03-02 18:27 UTC (permalink / raw) To: Kay Sievers; +Cc: Andreas Robinson, Rusty Russell, sam, linux-kernel On Mon, 2 Mar 2009 17:29:57 +0100 Kay Sievers <kay.sievers@vrfy.org> wrote: > On Mon, Mar 2, 2009 at 17:20, Arjan van de Ven <arjan@infradead.org> > wrote: > >> A monolithic kernel with parallelized initcalls is better - about > >> 200 ms faster than parallel insmods on my test system. However, it > >> comes with a fairly large set of changes: > >> > >> * First, you need a 200-line patch in init/main.c (do_initcalls() > >> and friends) > > > > why? > > We already have async function calls; and those speed up my boot > > (when enabled) significantly, by doing much of the kernel/driver > > init in parallel. > > > > My server box boots the whole kernel (including all drivers; I build > > verything in) in 0.56 seconds, and my net books do it in around 1.0 > > seconds. > > > >> > >> * Then the built-in module dependencies must be calculated > >> properly, eg with a modified depmod, and added to the build > >> process. > > > > nope not if done right > > > >> So, what do you think, should I keep going? IMHO, the slower > >> userspace implementation is acceptable since it's so much simpler. > > > > I would strongly suggest that you turn on the async function calls > > and look at the boot graph of the resulting kernel boot... if you > > send that to me I can also take a look and make suggestions.... > > The "fastboot" kernel commandline option was used, as mentioned in the > mail. Is there anything else? there is some sata level enabling needed depending on the system; I'd love to see the bootgraph (scripts/bootgraph.pl) for the boot; that shows exactly what happens when and for how long. -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-02 18:27 ` Arjan van de Ven @ 2009-03-02 21:41 ` Andreas Robinson 2009-03-04 18:47 ` Andreas Robinson 1 sibling, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-03-02 21:41 UTC (permalink / raw) To: Arjan van de Ven; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel > there is some sata level enabling needed depending on the system; > I'd love to see the bootgraph (scripts/bootgraph.pl) for the boot; > that shows exactly what happens when and for how long. Hmm, I was going to send you a reply tonight, but it seems I've run out of time. I'll get back to you as soon as possible, probably tomorrow. Cheers, Andreas ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-02 18:27 ` Arjan van de Ven 2009-03-02 21:41 ` Andreas Robinson @ 2009-03-04 18:47 ` Andreas Robinson 2009-03-06 0:18 ` Arjan van de Ven 1 sibling, 1 reply; 46+ messages in thread From: Andreas Robinson @ 2009-03-04 18:47 UTC (permalink / raw) To: Arjan van de Ven; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel [-- Attachment #1: Type: text/plain, Size: 2354 bytes --] On Mon, 2009-03-02 at 10:27 -0800, Arjan van de Ven wrote: > On Mon, 2 Mar 2009 17:29:57 +0100 > Kay Sievers <kay.sievers@vrfy.org> wrote: > > > On Mon, Mar 2, 2009 at 17:20, Arjan van de Ven <arjan@infradead.org> > > wrote: [...] > > > I would strongly suggest that you turn on the async function calls > > > and look at the boot graph of the resulting kernel boot... if you > > > send that to me I can also take a look and make suggestions.... > > > > The "fastboot" kernel commandline option was used, as mentioned in the > > mail. Is there anything else? > > there is some sata level enabling needed depending on the system; > I'd love to see the bootgraph (scripts/bootgraph.pl) for the boot; > that shows exactly what happens when and for how long. > Well, this was certainly an eye opener. I can only say thanks for pointing out bootgraph! You asked for one graph, but Rusty suggested that I compare insmod and modprobe (though in another context), so I did more than one. The (somewhat messy) combined result from booting four initramfs images with slightly different setups is attached. All of them install the 94 modules needed on the test system and all use 2.6.29-rc6 configured like a Ubuntu 8.10 generic kernel. The module mutex minimizing patch is added, but not the stop_machine patch. (The merge failed due to my own patches. I need to have a look at it again.) Fastboot is enabled. bootgraph.pl was tweaked to, among other things, not stop until when a dummy module was inserted. This happened after udev had settled and just before chaining to the file system on the hard drive. 1: (top row, light blue). This installed modules using udev 124 and modprobe 3.3pre11 that are shipped with Ubuntu 8.10. 2: (second row, light green). This installed modules using the latest versions of udev (139) and modprobe (3.7pre6) from the git repos. 3: (third row, light yellow). This used a multithreaded insmod. It employs a very simple method to spawn child processes, so it looks different from the others and had to be compressed vertically to fit. (And four processes hang until all initcalls are done and the parent process dies, so it's kind of buggy too.) 4: (bottom row, pink). This is the megamodule, only added out of curiosity. It really is multithreaded, but it doesn't use do_one_initcall() so you can't see anything. [-- Attachment #2: bootgraph.svg --] [-- Type: image/svg+xml, Size: 69661 bytes --] ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-04 18:47 ` Andreas Robinson @ 2009-03-06 0:18 ` Arjan van de Ven 2009-03-06 15:15 ` Andreas Robinson 0 siblings, 1 reply; 46+ messages in thread From: Arjan van de Ven @ 2009-03-06 0:18 UTC (permalink / raw) To: Andreas Robinson; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel On Wed, 04 Mar 2009 19:47:10 +0100 Andreas Robinson <andr345@gmail.com> wrote: the only thing I can say (the graphs are a bit complex to read) is that you are loading a LOT of very expensive modules that bring you no functionality. Also I'd love to have seen the scenario where the modules were just build into the kernel; that gives usually a more reliable indication of what is going on... -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-06 0:18 ` Arjan van de Ven @ 2009-03-06 15:15 ` Andreas Robinson 2009-03-06 15:45 ` Arjan van de Ven 0 siblings, 1 reply; 46+ messages in thread From: Andreas Robinson @ 2009-03-06 15:15 UTC (permalink / raw) To: Arjan van de Ven; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel On Thu, 2009-03-05 at 16:18 -0800, Arjan van de Ven wrote: > On Wed, 04 Mar 2009 19:47:10 +0100 > Andreas Robinson <andr345@gmail.com> wrote: > > the only thing I can say (the graphs are a bit complex to read) is that > you are loading a LOT of very expensive modules that bring you no > functionality. Well, yes. It is the generic Ubuntu kernel booting in all its bloaty glory. :) But this is what most users are stuck with. The distro vendors won't change their ways because they want their stuff to run on anything. So I'm not trying to build a custom kernel just for me. I want to find ways to have any distro optimize itself to boot in 5-10 seconds on any computer it has been installed on, without manual configuration. > Also I'd love to have seen the scenario where the modules were just > build into the kernel; that gives usually a more reliable indication of > what is going on... Alright, I'm on it. Cheers, Andreas ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-06 15:15 ` Andreas Robinson @ 2009-03-06 15:45 ` Arjan van de Ven 2009-03-08 10:47 ` Andreas Robinson 0 siblings, 1 reply; 46+ messages in thread From: Arjan van de Ven @ 2009-03-06 15:45 UTC (permalink / raw) To: Andreas Robinson; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel On Fri, 06 Mar 2009 16:15:43 +0100 Andreas Robinson <andr345@gmail.com> wrote: > On Thu, 2009-03-05 at 16:18 -0800, Arjan van de Ven wrote: > > On Wed, 04 Mar 2009 19:47:10 +0100 > > Andreas Robinson <andr345@gmail.com> wrote: > > > > the only thing I can say (the graphs are a bit complex to read) is > > that you are loading a LOT of very expensive modules that bring you > > no functionality. > > Well, yes. It is the generic Ubuntu kernel booting in all its bloaty > glory. :) But this is what most users are stuck with. The distro > vendors won't change their ways because they want their stuff to run > on anything. the problem is that you are also having things that just don't make sense; even for the generalized case... but I guess that is for Ubuntu to resolve. I don't see the machines I run (with Fedora) exhibit this same issue; while there are a bunch of modules, none of the ones that are expensive-and-useless in your charts are there. -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-06 15:45 ` Arjan van de Ven @ 2009-03-08 10:47 ` Andreas Robinson 2009-03-08 16:01 ` Arjan van de Ven 0 siblings, 1 reply; 46+ messages in thread From: Andreas Robinson @ 2009-03-08 10:47 UTC (permalink / raw) To: Arjan van de Ven; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel [-- Attachment #1: Type: text/plain, Size: 1963 bytes --] On Fri, 2009-03-06 at 07:45 -0800, Arjan van de Ven wrote: > On Fri, 06 Mar 2009 16:15:43 +0100 > Andreas Robinson <andr345@gmail.com> wrote: > > > On Thu, 2009-03-05 at 16:18 -0800, Arjan van de Ven wrote: > > > On Wed, 04 Mar 2009 19:47:10 +0100 > > > Andreas Robinson <andr345@gmail.com> wrote: > > > > > > the only thing I can say (the graphs are a bit complex to read) is > > > that you are loading a LOT of very expensive modules that bring you > > > no functionality. > > > > Well, yes. It is the generic Ubuntu kernel booting in all its bloaty > > glory. :) But this is what most users are stuck with. The distro > > vendors won't change their ways because they want their stuff to run > > on anything. > > the problem is that you are also having things that just don't make > sense; even for the generalized case... > > but I guess that is for Ubuntu to resolve. I don't see the machines I > run (with Fedora) exhibit this same issue; while there are a bunch of > modules, none of the ones that are expensive-and-useless in your charts > are there. I think they will. Fast boot is one of the "essential" goals for Jaunty and Karmic. Anyway, attached is a bootchart for a cleaned up kernel with the important (AFAIK) drivers built in. >From this, I've found some tasks that I can set myself to. They would obviously be the topic of other threads: * Make the nforce2 ethernet driver (init_nic) initialize itself asynchronously, if possible. * New config option: Separate initramfs decompression and file-system calls. Decompress as early as possible in a separate thread. * Don't unpack initramfs twice. If CONFIG_BLK_DEV_RAM is set, the kernel decompresses the ramdisk just to see if it's a cpio archive or not, and then throws away the result. * See what can be done about pci_init(), if anything. If there's anything else regarding fastboot you think would make more sense to work on first, please let me know. Thanks, Andreas [-- Attachment #2: hp_bg.svg --] [-- Type: image/svg+xml, Size: 14687 bytes --] ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-08 10:47 ` Andreas Robinson @ 2009-03-08 16:01 ` Arjan van de Ven 2009-03-08 20:13 ` [PATCH] sata_nv: add a module parameter to enable async scanning Andreas Robinson 2009-03-09 17:12 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Will Newton 0 siblings, 2 replies; 46+ messages in thread From: Arjan van de Ven @ 2009-03-08 16:01 UTC (permalink / raw) To: Andreas Robinson; +Cc: Kay Sievers, Rusty Russell, sam, linux-kernel On Sun, 08 Mar 2009 11:47:17 +0100 Andreas Robinson <andr345@gmail.com> wrote: > > but I guess that is for Ubuntu to resolve. I don't see the machines > > I run (with Fedora) exhibit this same issue; while there are a > > bunch of modules, none of the ones that are expensive-and-useless > > in your charts are there. > > I think they will. Fast boot is one of the "essential" goals for > Jaunty and Karmic. > > Anyway, attached is a bootchart for a cleaned up kernel with the > important (AFAIK) drivers built in. thanks; very useful overview! > > >From this, I've found some tasks that I can set myself to. They would > obviously be the topic of other threads: > > * Make the nforce2 ethernet driver (init_nic) initialize itself > asynchronously, if possible. I looked at doing this generically and it is really hard. BUT.. one of the options is to move work from the init to the "ifconfig up" code... In addition, for 2.6.30, I have a patch pending to move sata init before the network init, which can help hide it some > > * New config option: Separate initramfs decompression and > file-system calls. Decompress as early as possible in a > separate thread. interesting idea! > > * Don't unpack initramfs twice. If CONFIG_BLK_DEV_RAM is > set, the kernel decompresses the ramdisk just to see if > it's a cpio archive or not, and then throws away the result. I actually have a patch for it stuck away somewhere; I thought it was sent upstream but apparently it was not. I'll dig it out and dust it off. Note: Having a smaller initrd (like Fedora does, they make the initrd only have the modules the specific machine needs) will save a bunch of time... what isn't there you don't have to decompress either. > > * See what can be done about pci_init(), if anything. > > If there's anything else regarding fastboot you think would make more > sense to work on first, please let me know. One thing to mention is that fastinit for sata... I only did AHCI (because all my machines have that). Your machine looks like it has something different than AHCI, so maybe the sata controller can use some work ;-) (a sata driver needs to opt into parallel scanning via a flag) SATA init tends to be one of the things that are fix time per drive; and so working on that first to at least ONLY get that is worth it, it's a huge chunk of time (more than half the total time in your bootchart) -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH] sata_nv: add a module parameter to enable async scanning 2009-03-08 16:01 ` Arjan van de Ven @ 2009-03-08 20:13 ` Andreas Robinson 2009-03-09 17:12 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Will Newton 1 sibling, 0 replies; 46+ messages in thread From: Andreas Robinson @ 2009-03-08 20:13 UTC (permalink / raw) To: Arjan van de Ven; +Cc: linux-kernel On Sun, 2009-03-08 at 09:01 -0700, Arjan van de Ven wrote: > One thing to mention is that fastinit for sata... I only did AHCI > (because all my machines have that). Your machine looks like it has > something different than AHCI, so maybe the sata controller can use > some work ;-) > (a sata driver needs to opt into parallel scanning via a flag) > > SATA init tends to be one of the things that are fix time per drive; > and so working on that first to at least ONLY get that is worth it, > it's a huge chunk of time (more than half the total time in your > bootchart) Something like the patch below, mabye? :-) Before: [ 3.056308] Freeing unused kernel memory: 364k freed After: [ 2.411417] Freeing unused kernel memory: 364k freed The chipset is nforce2 (drivers/ata/sata_nv.c). I couldn't find anything like the SSS flag documented in the code, and register specs from nvidia are as rare as hen's teeth... So I only added the module parameter to force parallel scans. I named it parallel_scan instead of ignore_sss though, since there might not be an SSS-flag to ignore. /Andreas >From a5b090856173782308c8f61de84085be9a9b73ba Mon Sep 17 00:00:00 2001 From: Andreas Robinson <andr345@gmail.com> Date: Sun, 8 Mar 2009 20:44:16 +0100 Subject: [PATCH] sata_nv: add a module parameter to enable async scanning This parameter (parallel_scan) forces the OS to scan for disks asynchronously/in parallel, to reduce boot time. It might cause problems (brown-outs, blown fuses) in multi-drive systems, if the PSU is unable to handle several drives spinning up simultaneously. It ought to be safe in single-drive systems. Signed-off-by: Andreas Robinson <andr345@gmail.com> --- drivers/ata/sata_nv.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 55a8eed..e8aba2f 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -579,6 +579,7 @@ MODULE_VERSION(DRV_VERSION); static int adma_enabled; static int swncq_enabled = 1; +static int parallel_scan = 0; static void nv_adma_register_mode(struct ata_port *ap) { @@ -2427,6 +2428,9 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) } else if (type == SWNCQ) nv_swncq_host_init(host); + if (parallel_scan) + host->flags |= ATA_HOST_PARALLEL_SCAN; + pci_set_master(pdev); return ata_host_activate(host, pdev->irq, ipriv->irq_handler, IRQF_SHARED, ipriv->sht); @@ -2526,4 +2530,6 @@ module_param_named(adma, adma_enabled, bool, 0444); MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: true)"); module_param_named(swncq, swncq_enabled, bool, 0444); MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)"); +module_param_named(parallel_scan, parallel_scan, bool, 0444); +MODULE_PARM_DESC(parallel_scan, "Force parallel host scan (Default: false)"); -- 1.5.6.3 ^ permalink raw reply related [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-03-08 16:01 ` Arjan van de Ven 2009-03-08 20:13 ` [PATCH] sata_nv: add a module parameter to enable async scanning Andreas Robinson @ 2009-03-09 17:12 ` Will Newton 1 sibling, 0 replies; 46+ messages in thread From: Will Newton @ 2009-03-09 17:12 UTC (permalink / raw) To: Arjan van de Ven Cc: Andreas Robinson, Kay Sievers, Rusty Russell, sam, linux-kernel On Sun, Mar 8, 2009 at 4:01 PM, Arjan van de Ven <arjan@infradead.org> wrote: >> * Don't unpack initramfs twice. If CONFIG_BLK_DEV_RAM is >> set, the kernel decompresses the ramdisk just to see if >> it's a cpio archive or not, and then throws away the result. > > I actually have a patch for it stuck away somewhere; I thought it was > sent upstream but apparently it was not. I'll dig it out and dust it > off. Please do. It's a big win in relative terms compared to the rest of the boot for small systems. ^ permalink raw reply [flat|nested] 46+ messages in thread
* fastboot kernel parameter 2009-03-02 16:20 ` Arjan van de Ven 2009-03-02 16:29 ` Kay Sievers @ 2009-03-06 7:05 ` Sitsofe Wheeler 2009-03-06 11:23 ` Arjan van de Ven 1 sibling, 1 reply; 46+ messages in thread From: Sitsofe Wheeler @ 2009-03-06 7:05 UTC (permalink / raw) To: Arjan van de Ven Cc: Andreas Robinson, Kay Sievers, Rusty Russell, sam, linux-kernel On Mon, Mar 02, 2009 at 08:20:03AM -0800, Arjan van de Ven wrote: > > I would strongly suggest that you turn on the async function calls and Are async calls only turned on if you boot with the "fastboot" commandline parameter? If so could a mention of it be added to kernel-parameters as I don't see anything about it when I glanced at http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/kernel-parameters.txt;h=54f21a5c262b02ef6cb4718f72b8357693197cf3;hb=HEAD ... -- Sitsofe | http://sucs.org/~sits/ ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: fastboot kernel parameter 2009-03-06 7:05 ` fastboot kernel parameter Sitsofe Wheeler @ 2009-03-06 11:23 ` Arjan van de Ven 0 siblings, 0 replies; 46+ messages in thread From: Arjan van de Ven @ 2009-03-06 11:23 UTC (permalink / raw) To: Sitsofe Wheeler Cc: Andreas Robinson, Kay Sievers, Rusty Russell, sam, linux-kernel On Fri, 6 Mar 2009 07:05:23 +0000 Sitsofe Wheeler <sitsofe@yahoo.com> wrote: > On Mon, Mar 02, 2009 at 08:20:03AM -0800, Arjan van de Ven wrote: > > > > I would strongly suggest that you turn on the async function calls > > and > > Are async calls only turned on if you boot with the "fastboot" > commandline parameter? If so could a mention of it be added to > kernel-parameters as I don't see anything about it when I glanced at > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/kernel-parameters.txt;h=54f21a5c262b02ef6cb4718f72b8357693197cf3;hb=HEAD > ... > that's because it's going away again in 2.6.30.... -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 0:37 ` Andreas Robinson 2009-02-20 1:55 ` Kay Sievers @ 2009-02-24 1:27 ` Rusty Russell 1 sibling, 0 replies; 46+ messages in thread From: Rusty Russell @ 2009-02-24 1:27 UTC (permalink / raw) To: Andreas Robinson; +Cc: Kay Sievers, sam, linux-kernel On Friday 20 February 2009 11:07:05 Andreas Robinson wrote: > 1. Monolithic: 6.27 s, (0.22). bzImg=3419 kB ramfs=515 kB > 2. Megamodule: 6.80 s, (0.16). bzImg=2297 kB ramfs=1783 kB > 3. Insmod list: 6.83 s, (0.07). bzImg=2297 kB ramfs=1942 kB > > 10 samples were taken in each case. Standard deviations are in parenthesis. > The measured times are printk timestamps from a dummy module inserted last. > > Reading these benchmark results I can only conclude that my work is > useless and life has no meaning. I know that feeling! Performance work tends to be like that. I assume this is an unpatched kernel, or did you apply some of the stop_machine prevention / lock reduction patches? > So, what's missing or been done wrong here? I expected the difference > between monolithic and modular to be greater to be honest. modprobe vs insmod? You could try copying /lib/modules/`uname -r`/modules.* and using modprobe, see if the slowdown is actually there. Thanks for chasing this! Rusty. Rusty. ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-18 9:15 ` Kay Sievers 2009-02-18 10:25 ` Andreas Robinson @ 2009-02-18 11:57 ` Rusty Russell 2009-02-18 13:57 ` Kay Sievers 1 sibling, 1 reply; 46+ messages in thread From: Rusty Russell @ 2009-02-18 11:57 UTC (permalink / raw) To: Kay Sievers; +Cc: Andreas Robinson, sam, linux-kernel, Jon Masters On Wednesday 18 February 2009 19:45:21 Kay Sievers wrote: > On Wed, Feb 18, 2009 at 05:58, Rusty Russell <rusty@rustcorp.com.au> wrote: > > On Tuesday 17 February 2009 22:23:25 Kay Sievers wrote: > >> Monolithic versus modular kernels usually > >> make about 2+ seconds difference on a recent laptop. > > > > Thanks for the fact injection. How about a megamodule then? > > Sounds interesting. The ability to load multiple modules with a single > call may help, if such a call could be handled faster than individual > calls. Modprobe's modules added by dependencies of the requested > module, or modprobe -a could probably use such a facility. Naah, just create the megamodule in userspace. It's not terribly hard: you create a new init which calls all the individual inits, and rename the module. You don't supply an "exit" so it can't be unloaded, and for bonus points remove the .exit sections which will never be used. I'm handwaving a little, but it would get you all the benefits with no kernel changes. Andreas is definitely capable of creating such a thing: it's easier than what he did with linking in modules! > The current load_module() wraps ~400 lines of pretty heavy code in > stop_machine(), if we could possibly make that window smaller, so that > multiple instances could prepare some of the work in parallel, and > only a fraction of the current work would need to be serialized? Module load doesn't use stop_machine (on non-error). I'm not sure where the code is spending time. We could shuffle things around so most of load_module doesn't run under the lock, but before that can you tell me if we still lose 2-3 seconds on a UP kernel? If so, it's not locking, I'd guess it's probably modprobe userspace and reading in the modules from disk, not sys_init_module at all. Cheers, Rusty. ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-18 11:57 ` Rusty Russell @ 2009-02-18 13:57 ` Kay Sievers 2009-02-19 11:15 ` Rusty Russell 0 siblings, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-18 13:57 UTC (permalink / raw) To: Rusty Russell; +Cc: Andreas Robinson, sam, linux-kernel, Jon Masters On Wed, Feb 18, 2009 at 12:57, Rusty Russell <rusty@rustcorp.com.au> wrote: > On Wednesday 18 February 2009 19:45:21 Kay Sievers wrote: >> The current load_module() wraps ~400 lines of pretty heavy code in >> stop_machine(), if we could possibly make that window smaller, so that >> multiple instances could prepare some of the work in parallel, and >> only a fraction of the current work would need to be serialized? > > Module load doesn't use stop_machine (on non-error). I see, right. It's only the mutex serializing all module loading work. > I'm not sure where the code is spending time. We could shuffle things around > so most of load_module doesn't run under the lock, but before that can you tell > me if we still lose 2-3 seconds on a UP kernel? I tried only my dual core laptop with my "small" kernel and 50 modules, not the crazy distro setup. I've added stuff like: ktime_t in, delta; unsigned long long duration; in = ktime_get(); ... delta = ktime_sub(ktime_get(), in); duration = (unsigned long long) delta.tv64 >> 10; printk("XXX: loading %p (%Ld usecs)\n", umod, duration); across init_module() and some modules wait for 200-500 milliseconds to get the lock released, some larger modules spend 50 milliseconds in load_module(), many of them around 20 milliseconds. > If so, it's not locking, I'd guess it's probably modprobe userspace and reading in > the modules from disk, not sys_init_module at all. Bootcharts suggest that it's not I/O bound. We also see this on fast SSDs and with pre-loading files into RAM. Older modprobe versions did some heavy fnmatch() over an insanely large distro module.alias file, which was very CPU expensive, but that got changed recently. Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-18 13:57 ` Kay Sievers @ 2009-02-19 11:15 ` Rusty Russell 2009-02-19 11:41 ` Kay Sievers 0 siblings, 1 reply; 46+ messages in thread From: Rusty Russell @ 2009-02-19 11:15 UTC (permalink / raw) To: Kay Sievers; +Cc: Andreas Robinson, sam, linux-kernel, Jon Masters On Thursday 19 February 2009 00:27:58 Kay Sievers wrote: > some modules wait for 200-500 milliseconds to > get the lock released, some larger modules spend 50 milliseconds in > load_module(), many of them around 20 milliseconds. OK, this is an untested hack (don't try unloading modules, not sure symbol resolution isn't racy now I've killed the lock). Does it change the numbers? Thanks! Rusty. diff --git a/kernel/module.c b/kernel/module.c --- a/kernel/module.c +++ b/kernel/module.c @@ -2020,10 +2020,13 @@ static noinline struct module *load_modu } #endif if (pcpuindex) { + mutex_lock(&module_mutex); + /* We have a special allocation for this section. */ percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, sechdrs[pcpuindex].sh_addralign, mod->name); + mutex_unlock(&module_mutex); if (!percpu) { err = -ENOMEM; goto free_percpu; @@ -2317,19 +2320,10 @@ SYSCALL_DEFINE3(init_module, void __user if (!capable(CAP_SYS_MODULE)) return -EPERM; - /* Only one module load at a time, please */ - if (mutex_lock_interruptible(&module_mutex) != 0) - return -EINTR; - /* Do all the hard work */ mod = load_module(umod, len, uargs); - if (IS_ERR(mod)) { - mutex_unlock(&module_mutex); + if (IS_ERR(mod)) return PTR_ERR(mod); - } - - /* Drop lock so they can recurse */ - mutex_unlock(&module_mutex); blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_COMING, mod); ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-19 11:15 ` Rusty Russell @ 2009-02-19 11:41 ` Kay Sievers 2009-02-19 20:48 ` Kay Sievers 0 siblings, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-19 11:41 UTC (permalink / raw) To: Rusty Russell; +Cc: Andreas Robinson, sam, linux-kernel, Jon Masters On Thu, Feb 19, 2009 at 12:15, Rusty Russell <rusty@rustcorp.com.au> wrote: > On Thursday 19 February 2009 00:27:58 Kay Sievers wrote: >> some modules wait for 200-500 milliseconds to >> get the lock released, some larger modules spend 50 milliseconds in >> load_module(), many of them around 20 milliseconds. > > OK, this is an untested hack (don't try unloading modules, not sure symbol > resolution isn't racy now I've killed the lock). Does it change the numbers? That changes it dramatically. The numbers from the sycall until the linked-in module are now down to 15-25 milliseconds, and for a few large modules 50-100. (One crazy exception is ipv6, which takes 620 milliseconds to link, no idea what it needs to do.) I'll compare a few bootup times with and without the patch, and come back later today with the real numbers. Thanks a lot, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-19 11:41 ` Kay Sievers @ 2009-02-19 20:48 ` Kay Sievers 2009-02-19 21:59 ` Kay Sievers 0 siblings, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-19 20:48 UTC (permalink / raw) To: Rusty Russell; +Cc: Andreas Robinson, sam, linux-kernel, Jon Masters On Thu, Feb 19, 2009 at 12:41, Kay Sievers <kay.sievers@vrfy.org> wrote: > On Thu, Feb 19, 2009 at 12:15, Rusty Russell <rusty@rustcorp.com.au> wrote: >> On Thursday 19 February 2009 00:27:58 Kay Sievers wrote: >>> some modules wait for 200-500 milliseconds to >>> get the lock released, some larger modules spend 50 milliseconds in >>> load_module(), many of them around 20 milliseconds. >> >> OK, this is an untested hack (don't try unloading modules, not sure symbol >> resolution isn't racy now I've killed the lock). Does it change the numbers? > > That changes it dramatically. The numbers from the sycall until the > linked-in module are now down to 15-25 milliseconds, and for a few > large modules 50-100. > > (One crazy exception is ipv6, which takes 620 milliseconds to link, no > idea what it needs to do.) Sorry, this was caused by I/O wait from disk for that huge module, and gets to reasonable numbers by putting all modules into RAM before loading them. > I'll compare a few bootup times with and without the patch, and come > back later today with the real numbers. The whole massive parallel modprobe happens during udev coldplug. I tried a 2GHz Dual Core laptop, and a setup without initramfs here, which loads ~40 modules. All the kernel modules are copied to a ramfs mount before the coldplug is started. I measured the time from the first modprobe that happened in the kernel to the loading of "dummy", which I manually trigger from the udev boot script, and which gets called right after udev has settled and handled all events. With the mutex it takes 1.8 seconds, without it, it takes 1.3 seconds. If I comment out the creation of the stop_machine() threads, it gets down to 1.1 seconds. With the mutex, I see code waiting for up to 180 milliseconds waiting for the mutex, the average between 20-40 milliseconds. Without the mutex the largest time to link is 30 milliseconds, and most of them are around 5-10 milliseconds. Without the mutex and the stop_machine() creation, the flow of tracing output looks like real work and, depending on the actual module, they spend time in various stages of linking, relocation and so on, there are no long delays for any of the modules, like I see with the current code. It would be great, if we can safely minimize the time spent in the mutex. Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-19 20:48 ` Kay Sievers @ 2009-02-19 21:59 ` Kay Sievers 2009-02-20 0:58 ` Rusty Russell 0 siblings, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-19 21:59 UTC (permalink / raw) To: Rusty Russell; +Cc: Andreas Robinson, sam, linux-kernel, Jon Masters On Thu, Feb 19, 2009 at 21:48, Kay Sievers <kay.sievers@vrfy.org> wrote: > On Thu, Feb 19, 2009 at 12:41, Kay Sievers <kay.sievers@vrfy.org> wrote: >> On Thu, Feb 19, 2009 at 12:15, Rusty Russell <rusty@rustcorp.com.au> wrote: >>> On Thursday 19 February 2009 00:27:58 Kay Sievers wrote: >>>> some modules wait for 200-500 milliseconds to >>>> get the lock released, some larger modules spend 50 milliseconds in >>>> load_module(), many of them around 20 milliseconds. >>> >>> OK, this is an untested hack (don't try unloading modules, not sure symbol >>> resolution isn't racy now I've killed the lock). Does it change the numbers? >> >> That changes it dramatically. The numbers from the sycall until the >> linked-in module are now down to 15-25 milliseconds, and for a few >> large modules 50-100. >> >> (One crazy exception is ipv6, which takes 620 milliseconds to link, no >> idea what it needs to do.) > > Sorry, this was caused by I/O wait from disk for that huge module, and > gets to reasonable numbers by putting all modules into RAM before > loading them. > >> I'll compare a few bootup times with and without the patch, and come >> back later today with the real numbers. > > The whole massive parallel modprobe happens during udev coldplug. I > tried a 2GHz Dual Core laptop, and a setup without initramfs here, > which loads ~40 modules. All the kernel modules are copied to a ramfs > mount before the coldplug is started. > > I measured the time from the first modprobe that happened in the > kernel to the loading of "dummy", which I manually trigger from the > udev boot script, and which gets called right after udev has settled > and handled all events. > > With the mutex it takes 1.8 seconds, without it, it takes 1.3 seconds. > If I comment out the creation of the stop_machine() threads, it gets > down to 1.1 seconds. > > With the mutex, I see code waiting for up to 180 milliseconds waiting > for the mutex, the average between 20-40 milliseconds. > > Without the mutex the largest time to link is 30 milliseconds, and > most of them are around 5-10 milliseconds. > > Without the mutex and the stop_machine() creation, the flow of tracing > output looks like real work and, depending on the actual module, they > spend time in various stages of linking, relocation and so on, there > are no long delays for any of the modules, like I see with the current > code. > > It would be great, if we can safely minimize the time spent in the mutex. Further testing revealed, if I only comment out the stop_machine() preparation, which is used in an error case, I get almost the same improvement, even with the original mutex in place. Without the mutex it's still a bit better, maybe it would be much better if we have more CPUs, but all the long delays are gone only with removing the stop_machine() preparation. Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-19 21:59 ` Kay Sievers @ 2009-02-20 0:58 ` Rusty Russell 2009-02-20 1:33 ` Kay Sievers 2009-02-20 11:32 ` Rusty Russell 0 siblings, 2 replies; 46+ messages in thread From: Rusty Russell @ 2009-02-20 0:58 UTC (permalink / raw) To: Kay Sievers Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Friday 20 February 2009 08:29:48 Kay Sievers wrote: > Further testing revealed, if I only comment out the stop_machine() > preparation, which is used in an error case, I get almost the same > improvement, even with the original mutex in place. Without the mutex > it's still a bit better, maybe it would be much better if we have more > CPUs, but all the long delays are gone only with removing the > stop_machine() preparation. Hmm, interesting. The reason that reducing the lock coverage had this effect is because stop_machine_create() just bumps a refcount if someone is already between ...create() and ...destroy(). So, now we've found the problem, let's fix it, then re-visit mutex reduction. module: don't use stop_machine on module load Kay Sievers <kay.sievers@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@rustcorp.com.au> 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(&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: ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 0:58 ` Rusty Russell @ 2009-02-20 1:33 ` Kay Sievers 2009-02-24 1:39 ` Rusty Russell 2009-02-20 11:32 ` Rusty Russell 1 sibling, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-20 1:33 UTC (permalink / raw) To: Rusty Russell Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Fri, Feb 20, 2009 at 01:58, Rusty Russell <rusty@rustcorp.com.au> wrote: > On Friday 20 February 2009 08:29:48 Kay Sievers wrote: >> Further testing revealed, if I only comment out the stop_machine() >> preparation, which is used in an error case, I get almost the same >> improvement, even with the original mutex in place. Without the mutex >> it's still a bit better, maybe it would be much better if we have more >> CPUs, but all the long delays are gone only with removing the >> stop_machine() preparation. > > Hmm, interesting. The reason that reducing the lock coverage had this effect > is because stop_machine_create() just bumps a refcount if someone is already > between ...create() and ...destroy(). > > So, now we've found the problem, let's fix it, then re-visit mutex reduction. > > module: don't use stop_machine on module load > > Kay Sievers <kay.sievers@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()). Sounds good. With that, no module takes more than 40 millisecs to link now, most of them are between 3 and 8 millisecs. Coldplug loads 39 modules, I end up having 50 loaded, but they are after the udev coldplug settle time. The 39 modules get linked into the kernel in 281 millisecs, which sounds pretty good. That looks very different to the numbers without this patch and the otherwise same setup, where we get heavy noise in the traces and many delays of up to 200 millisecs until linking, most of them taking 30+ millisecs. Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 1:33 ` Kay Sievers @ 2009-02-24 1:39 ` Rusty Russell 0 siblings, 0 replies; 46+ messages in thread From: Rusty Russell @ 2009-02-24 1:39 UTC (permalink / raw) To: Kay Sievers Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Friday 20 February 2009 12:03:57 Kay Sievers wrote: > That looks very different to the numbers without this patch and the > otherwise same setup, where we get heavy noise in the traces and many > delays of up to 200 millisecs until linking, most of them taking 30+ > millisecs. Hi Kay, I've added quotes from your mail and a Tested-by: from you. It will go in tomorrow's linux-next. Thanks! Rusty. ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 0:58 ` Rusty Russell 2009-02-20 1:33 ` Kay Sievers @ 2009-02-20 11:32 ` Rusty Russell 2009-02-23 16:42 ` Kay Sievers 1 sibling, 1 reply; 46+ messages in thread From: Rusty Russell @ 2009-02-20 11:32 UTC (permalink / raw) To: Kay Sievers Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Friday 20 February 2009 11:28:55 Rusty Russell wrote: > + /* Unlink carefully: kallsyms could be walking list. */ > + __list_del(&mod->list); > + synchronize_sched(); That should be list_del_rcu() of course. Rusty. module: don't use stop_machine on module load Kay Sievers <kay.sievers@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@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: ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-20 11:32 ` Rusty Russell @ 2009-02-23 16:42 ` Kay Sievers 2009-02-25 7:03 ` Rusty Russell 0 siblings, 1 reply; 46+ messages in thread From: Kay Sievers @ 2009-02-23 16:42 UTC (permalink / raw) To: Rusty Russell Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Fri, Feb 20, 2009 at 12:32, Rusty Russell <rusty@rustcorp.com.au> wrote: > On Friday 20 February 2009 11:28:55 Rusty Russell wrote: >> + /* Unlink carefully: kallsyms could be walking list. */ >> + __list_del(&mod->list); >> + synchronize_sched(); > > That should be list_del_rcu() of course. Rusty, are you taking care, that this patch gets merged somewhere, and shows up in -next? I still get a ~10% improvement without the mutex, and traces show some parallelism from different modprobe processes. Any idea how to safely minimize the time we need to hold it? Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-23 16:42 ` Kay Sievers @ 2009-02-25 7:03 ` Rusty Russell 2009-02-25 18:12 ` Kay Sievers 0 siblings, 1 reply; 46+ messages in thread From: Rusty Russell @ 2009-02-25 7:03 UTC (permalink / raw) To: Kay Sievers Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Tuesday 24 February 2009 03:12:28 Kay Sievers wrote: > Rusty, > are you taking care, that this patch gets merged somewhere, and shows > up in -next? Yep, already done. > I still get a ~10% improvement without the mutex, and traces show some > parallelism from different modprobe processes. Any idea how to safely > minimize the time we need to hold it? OK, let's do that then. <hack hack> Here's a backported version which you should be able to simply apply; it'll be good to check that we still win... Thanks! Rusty. diff --git a/kernel/module.c b/kernel/module.c --- a/kernel/module.c +++ b/kernel/module.c @@ -75,7 +75,8 @@ static DECLARE_WAIT_QUEUE_HEAD(module_wq static BLOCKING_NOTIFIER_HEAD(module_notify_list); -/* Bounds of module allocation, for speeding __module_text_address */ +/* Bounds of module allocation, for speeding __module_address. + * Protected by module_mutex. */ static unsigned long module_addr_min = -1UL, module_addr_max = 0; int register_module_notifier(struct notifier_block * nb) @@ -328,7 +329,7 @@ static bool find_symbol_in_section(const } /* Find a symbol, return value, (optional) crc and (optional) module - * which owns it */ + * which owns it. Needs preempt disabled or module_mutex. */ static unsigned long find_symbol(const char *name, struct module **owner, const unsigned long **crc, @@ -408,8 +409,9 @@ static void *percpu_modalloc(unsigned lo { unsigned long extra; unsigned int i; - void *ptr; + void *ptr = NULL; + mutex_lock(&module_mutex); if (align > PAGE_SIZE) { printk(KERN_WARNING "%s: per-cpu alignment %li > %li\n", name, align, PAGE_SIZE); @@ -434,24 +436,32 @@ static void *percpu_modalloc(unsigned lo ptr += extra; /* Split block if warranted */ - if (pcpu_size[i] - size > sizeof(unsigned long)) - if (!split_block(i, size)) - return NULL; + if (pcpu_size[i] - size > sizeof(unsigned long)) { + if (!split_block(i, size)) { + ptr = NULL; + break; + } + } /* Mark allocated */ pcpu_size[i] = -pcpu_size[i]; - return ptr; + break; } + mutex_unlock(&module_mutex); - printk(KERN_WARNING "Could not allocate %lu bytes percpu data\n", - size); - return NULL; + if (!ptr) + printk(KERN_WARNING + "Could not allocate %lu bytes percpu data\n", size); + return ptr; } static void percpu_modfree(void *freeme) { unsigned int i; - void *ptr = __per_cpu_start + block_size(pcpu_size[0]); + void *ptr; + + mutex_lock(&module_mutex); + ptr = __per_cpu_start + block_size(pcpu_size[0]); /* First entry is core kernel percpu data. */ for (i = 1; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { @@ -478,6 +488,7 @@ static void percpu_modfree(void *freeme) memmove(&pcpu_size[i+1], &pcpu_size[i+2], (pcpu_num_used - (i+1)) * sizeof(pcpu_size[0])); } + mutex_unlock(&module_mutex); } static unsigned int find_pcpusec(Elf_Ehdr *hdr, @@ -606,7 +617,7 @@ static int already_uses(struct module *a return 0; } -/* Module a uses b */ +/* Module a uses b: caller needs module_mutex() */ static int use_module(struct module *a, struct module *b) { struct module_use *use; @@ -646,6 +657,7 @@ static void module_unload_free(struct mo { struct module *i; + mutex_lock(&module_mutex); list_for_each_entry(i, &modules, list) { struct module_use *use; @@ -661,6 +673,7 @@ static void module_unload_free(struct mo } } } + mutex_unlock(&module_mutex); } #ifdef CONFIG_MODULE_FORCE_UNLOAD @@ -823,9 +836,13 @@ SYSCALL_DEFINE2(delete_module, const cha /* Store the name of the last unloaded module for diagnostic purposes */ strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); unregister_dynamic_debug_module(mod->name); + + /* free_module doesn't want module_mutex held by caller. */ + mutex_unlock(&module_mutex); free_module(mod); + goto out_stop; - out: +out: mutex_unlock(&module_mutex); out_stop: stop_machine_destroy(); @@ -1062,8 +1079,7 @@ static inline int same_magic(const char } #endif /* CONFIG_MODVERSIONS */ -/* Resolve a symbol for this module. I.e. if we find one, record usage. - Must be holding module_mutex. */ +/* Resolve a symbol for this module. I.e. if we find one, record usage. */ static unsigned long resolve_symbol(Elf_Shdr *sechdrs, unsigned int versindex, const char *name, @@ -1073,6 +1089,7 @@ static unsigned long resolve_symbol(Elf_ unsigned long ret; const unsigned long *crc; + mutex_lock(&module_mutex); ret = find_symbol(name, &owner, &crc, !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true); if (!IS_ERR_VALUE(ret)) { @@ -1082,6 +1099,7 @@ static unsigned long resolve_symbol(Elf_ !use_module(mod, owner)) ret = -EINVAL; } + mutex_unlock(&module_mutex); return ret; } @@ -1442,11 +1460,14 @@ static int __unlink_module(void *_mod) return 0; } -/* Free a module, remove from lists, etc (must hold module_mutex). */ +/* Free a module, remove from lists, etc. */ static void free_module(struct module *mod) { /* Delete from various lists */ + mutex_lock(&module_mutex); stop_machine(__unlink_module, mod, NULL); + mutex_unlock(&module_mutex); + remove_notes_attrs(mod); remove_sect_attrs(mod); mod_kobject_remove(mod); @@ -1520,14 +1541,19 @@ static int verify_export_symbols(struct for (i = 0; i < ARRAY_SIZE(arr); i++) { for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) { + + /* Stopping preemption makes find_symbol safe. */ + preempt_disable(); if (!IS_ERR_VALUE(find_symbol(s->name, &owner, NULL, true, false))) { + preempt_enable(); printk(KERN_ERR "%s: exports duplicate symbol %s" " (owned by %s)\n", mod->name, s->name, module_name(owner)); return -ENOEXEC; } + preempt_enable(); } } return 0; @@ -1850,11 +1876,13 @@ static void *module_alloc_update_bounds( void *ret = module_alloc(size); if (ret) { + mutex_lock(&module_mutex); /* Update module bounds. */ if ((unsigned long)ret < module_addr_min) module_addr_min = (unsigned long)ret; if ((unsigned long)ret + size > module_addr_max) module_addr_max = (unsigned long)ret + size; + mutex_unlock(&module_mutex); } return ret; } @@ -2256,7 +2284,9 @@ static noinline struct module *load_modu * function to insert in a way safe to concurrent readers. * The mutex protects against concurrent writers. */ + mutex_lock(&module_mutex); list_add_rcu(&mod->list, &modules); + mutex_unlock(&module_mutex); err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL); if (err < 0) @@ -2275,8 +2305,10 @@ static noinline struct module *load_modu return mod; unlink: + mutex_lock(&module_mutex); /* Unlink carefully: kallsyms could be walking list. */ list_del_rcu(&mod->list); + mutex_unlock(&module_mutex); synchronize_sched(); module_arch_cleanup(mod); cleanup: @@ -2317,19 +2349,10 @@ SYSCALL_DEFINE3(init_module, void __user if (!capable(CAP_SYS_MODULE)) return -EPERM; - /* Only one module load at a time, please */ - if (mutex_lock_interruptible(&module_mutex) != 0) - return -EINTR; - /* Do all the hard work */ mod = load_module(umod, len, uargs); - if (IS_ERR(mod)) { - mutex_unlock(&module_mutex); + if (IS_ERR(mod)) return PTR_ERR(mod); - } - - /* Drop lock so they can recurse */ - mutex_unlock(&module_mutex); blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_COMING, mod); @@ -2345,9 +2368,7 @@ SYSCALL_DEFINE3(init_module, void __user module_put(mod); blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_GOING, mod); - mutex_lock(&module_mutex); free_module(mod); - mutex_unlock(&module_mutex); wake_up(&module_wq); return ret; } @@ -2366,14 +2387,15 @@ SYSCALL_DEFINE3(init_module, void __user blocking_notifier_call_chain(&module_notify_list, MODULE_STATE_LIVE, mod); - mutex_lock(&module_mutex); + /* Be a little careful here: an oops may look at this mem right now. */ + mod->init_size = 0; + mod->init_text_size = 0; + wmb(); + module_free(mod, mod->module_init); + mod->module_init = NULL; + /* Drop initial reference. */ module_put(mod); - module_free(mod, mod->module_init); - mod->module_init = NULL; - mod->init_size = 0; - mod->init_text_size = 0; - mutex_unlock(&module_mutex); return 0; } ^ permalink raw reply [flat|nested] 46+ messages in thread
* Re: [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel. 2009-02-25 7:03 ` Rusty Russell @ 2009-02-25 18:12 ` Kay Sievers 0 siblings, 0 replies; 46+ messages in thread From: Kay Sievers @ 2009-02-25 18:12 UTC (permalink / raw) To: Rusty Russell Cc: Andreas Robinson, sam, linux-kernel, Jon Masters, heiko.carstens On Wed, Feb 25, 2009 at 08:03, Rusty Russell <rusty@rustcorp.com.au> wrote: > On Tuesday 24 February 2009 03:12:28 Kay Sievers wrote: >> Rusty, >> are you taking care, that this patch gets merged somewhere, and shows >> up in -next? > > Yep, already done. Nice. Thanks! >> I still get a ~10% improvement without the mutex, and traces show some >> parallelism from different modprobe processes. Any idea how to safely >> minimize the time we need to hold it? > > OK, let's do that then. > > <hack hack> > > Here's a backported version which you should be able to simply apply; it'll > be good to check that we still win... It's a little bit faster, and the traces show a bit less serialization and more overlapping code execution. The difference is very small though, and hard to notice -- loading of all the 39 modules triggered by a udev coldplug run finishes after 0.23 seconds. After calling init, the last of these modules goes "live" after 0.26 seconds. Most of the time the modules need is spent in simplify_symbols(). Thanks, Kay ^ permalink raw reply [flat|nested] 46+ messages in thread
end of thread, other threads:[~2009-03-09 17:12 UTC | newest] Thread overview: 46+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-02-15 18:20 [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 1/6] New option: Static linking of external modules Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 2/6] module: add module ELF section with module_init() pointer Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 3/6] module: always prefix module parameters with the module name Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 4/6] kbuild: allow linking of an external object into vmlinux Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 5/6] scripts: new module preprocessor for static linking Andreas Robinson 2009-02-15 18:20 ` [RFC PATCH 6/6] kbuild: enable relinking of vmlinux without full kernel tree Andreas Robinson 2009-02-16 22:51 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell 2009-02-17 10:42 ` Andreas Robinson 2009-02-17 11:53 ` Kay Sievers 2009-02-18 4:58 ` Rusty Russell 2009-02-18 9:15 ` Kay Sievers 2009-02-18 10:25 ` Andreas Robinson 2009-02-20 0:37 ` Andreas Robinson 2009-02-20 1:55 ` Kay Sievers 2009-02-21 11:43 ` Andreas Robinson 2009-03-02 14:32 ` Andreas Robinson 2009-03-02 15:59 ` Kay Sievers 2009-03-02 16:20 ` Arjan van de Ven 2009-03-02 16:29 ` Kay Sievers 2009-03-02 18:27 ` Arjan van de Ven 2009-03-02 21:41 ` Andreas Robinson 2009-03-04 18:47 ` Andreas Robinson 2009-03-06 0:18 ` Arjan van de Ven 2009-03-06 15:15 ` Andreas Robinson 2009-03-06 15:45 ` Arjan van de Ven 2009-03-08 10:47 ` Andreas Robinson 2009-03-08 16:01 ` Arjan van de Ven 2009-03-08 20:13 ` [PATCH] sata_nv: add a module parameter to enable async scanning Andreas Robinson 2009-03-09 17:12 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Will Newton 2009-03-06 7:05 ` fastboot kernel parameter Sitsofe Wheeler 2009-03-06 11:23 ` Arjan van de Ven 2009-02-24 1:27 ` [RFC PATCH 0/6] module, kbuild: Faster boot with custom kernel Rusty Russell 2009-02-18 11:57 ` Rusty Russell 2009-02-18 13:57 ` Kay Sievers 2009-02-19 11:15 ` Rusty Russell 2009-02-19 11:41 ` Kay Sievers 2009-02-19 20:48 ` Kay Sievers 2009-02-19 21:59 ` Kay Sievers 2009-02-20 0:58 ` Rusty Russell 2009-02-20 1:33 ` Kay Sievers 2009-02-24 1:39 ` Rusty Russell 2009-02-20 11:32 ` Rusty Russell 2009-02-23 16:42 ` Kay Sievers 2009-02-25 7:03 ` Rusty Russell 2009-02-25 18:12 ` Kay Sievers
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox