lkml.org 
[lkml]   [2013]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH 1/2] init, block: try to load default elevator module early during boot
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 <tj@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 <tj@kernel.org>
> Cc: Jens Axboe <axboe@kernel.dk>
> Cc: Arjan van de Ven <arjan@linux.intel.com>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Cc: Alex Riesen <raa.lkml@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();
> }


\
 
 \ /
  Last update: 2013-01-17 19:41    [W:0.209 / U:1.180 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site