And here I was really hoping that there was a third patch in the series that added the warning...
We don't currently have a "am I an async worker" helper function for the warning to use, which is something very much up your alley. Linus On Wed, Jan 16, 2013 at 1:30 PM, Tejun Heo <t...@kernel.org> wrote: > This patch adds default module loading and uses it to load the default > block elevator. During boot, it's called right after initramfs or > initrd is made available and right before control is passed to > userland. This ensures that as long as the modules are available in > the usual places in initramfs, initrd or the root filesystem, the > default modules are loaded as soon as possible. > > This will replace the on-demand elevator module loading from elevator > init path. > > Signed-off-by: Tejun Heo <t...@kernel.org> > Cc: Jens Axboe <ax...@kernel.dk> > Cc: Arjan van de Ven <ar...@linux.intel.com> > Cc: Linus Torvalds <torva...@linux-foundation.org> > Cc: Alex Riesen <raa.l...@gmail.com> > --- > block/elevator.c | 16 ++++++++++++++++ > include/linux/elevator.h | 1 + > include/linux/init.h | 1 + > init/do_mounts_initrd.c | 3 +++ > init/initramfs.c | 8 +++++++- > init/main.c | 16 ++++++++++++++++ > 6 files changed, 44 insertions(+), 1 deletion(-) > > --- a/block/elevator.c > +++ b/block/elevator.c > @@ -136,6 +136,22 @@ static int __init elevator_setup(char *s > > __setup("elevator=", elevator_setup); > > +/* called during boot to load the elevator chosen by the elevator param */ > +void __init load_default_elevator_module(void) > +{ > + struct elevator_type *e; > + > + if (!chosen_elevator[0]) > + return; > + > + spin_lock(&elv_list_lock); > + e = elevator_find(chosen_elevator); > + spin_unlock(&elv_list_lock); > + > + if (!e) > + request_module("%s-iosched", chosen_elevator); > +} > + > static struct kobj_type elv_ktype; > > static struct elevator_queue *elevator_alloc(struct request_queue *q, > --- a/include/linux/elevator.h > +++ b/include/linux/elevator.h > @@ -138,6 +138,7 @@ extern void elv_drain_elevator(struct re > /* > * io scheduler registration > */ > +extern void __init load_default_elevator_module(void); > extern int elv_register(struct elevator_type *); > extern void elv_unregister(struct elevator_type *); > > --- a/include/linux/init.h > +++ b/include/linux/init.h > @@ -161,6 +161,7 @@ extern unsigned int reset_devices; > /* used by init/main.c */ > void setup_arch(char **); > void prepare_namespace(void); > +void __init load_default_modules(void); > > extern void (*late_time_init)(void); > > --- a/init/do_mounts_initrd.c > +++ b/init/do_mounts_initrd.c > @@ -57,6 +57,9 @@ static void __init handle_initrd(void) > sys_mkdir("/old", 0700); > sys_chdir("/old"); > > + /* try loading default modules from initrd */ > + load_default_modules(); > + > /* > * In case that a resume from disk is carried out by linuxrc or one of > * its children, we need to tell the freezer not to wait for us. > --- a/init/initramfs.c > +++ b/init/initramfs.c > @@ -592,7 +592,7 @@ static int __init populate_rootfs(void) > initrd_end - initrd_start); > if (!err) { > free_initrd(); > - return 0; > + goto done; > } else { > clean_rootfs(); > unpack_to_rootfs(__initramfs_start, __initramfs_size); > @@ -607,6 +607,7 @@ static int __init populate_rootfs(void) > sys_close(fd); > free_initrd(); > } > + done: > #else > printk(KERN_INFO "Unpacking initramfs...\n"); > err = unpack_to_rootfs((char *)initrd_start, > @@ -615,6 +616,11 @@ static int __init populate_rootfs(void) > printk(KERN_EMERG "Initramfs unpacking failed: %s\n", > err); > free_initrd(); > #endif > + /* > + * Try loading default modules from initramfs. This gives > + * us a chance to load before device_initcalls. > + */ > + load_default_modules(); > } > return 0; > } > --- a/init/main.c > +++ b/init/main.c > @@ -70,6 +70,8 @@ > #include <linux/perf_event.h> > #include <linux/file.h> > #include <linux/ptrace.h> > +#include <linux/blkdev.h> > +#include <linux/elevator.h> > > #include <asm/io.h> > #include <asm/bugs.h> > @@ -794,6 +796,17 @@ static void __init do_pre_smp_initcalls( > do_one_initcall(*fn); > } > > +/* > + * This function requests modules which should be loaded by default and is > + * called twice right after initrd is mounted and right before init is > + * exec'd. If such modules are on either initrd or rootfs, they will be > + * loaded before control is passed to userland. > + */ > +void __init load_default_modules(void) > +{ > + load_default_elevator_module(); > +} > + > static int run_init_process(const char *init_filename) > { > argv_init[0] = init_filename; > @@ -900,4 +913,7 @@ static void __init kernel_init_freeable( > * we're essentially up and running. Get rid of the > * initmem segments and start the user-mode stuff.. > */ > + > + /* rootfs is available now, try loading default modules */ > + load_default_modules(); > } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/