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/

Reply via email to