Re: [PATCH 1/2] init, block: try to load default elevator module early during boot

2013-01-17 Thread Linus Torvalds
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 

Re: [PATCH 1/2] init, block: try to load default elevator module early during boot

2013-01-17 Thread Tejun Heo
On Thu, Jan 17, 2013 at 10:46:47AM -0800, Linus Torvalds wrote:
 On Thu, Jan 17, 2013 at 10:38 AM, Tejun Heo t...@kernel.org wrote:
 
  Oh yeah, it's coming.  I just wanted to finish something else first
  and, as turning on PF_WQ_WORKER on a rescuer thread has some chance of
  developing into an obscure difficult-to-trigger and diagnose problem,
  don't want to hurry it too much.
 
 Ok. I think I'll delay these things for 3.9 anyway, since the actual
 _problem_ people are seeing should be fixed with your other patch. So
 I guess it's not really all that critical any more.

If you're okay with it, I'll route these two and the patches to add
warning through a wq branch.  There's already a wq/for-3.9 patch which
am_i_async() can make use of, so it's gonna be easier this way.

Thanks.

-- 
tejun
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] init, block: try to load default elevator module early during boot

2013-01-17 Thread Linus Torvalds
On Thu, Jan 17, 2013 at 10:59 AM, Tejun Heo t...@kernel.org wrote:

 If you're okay with it, I'll route these two and the patches to add
 warning through a wq branch.  There's already a wq/for-3.9 patch which
 am_i_async() can make use of, so it's gonna be easier this way.

Sounds good to me. Thanks,

 Linus
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] init, block: try to load default elevator module early during boot

2013-01-17 Thread Tejun Heo
Hello, Linus.

On Thu, Jan 17, 2013 at 10:05:53AM -0800, Linus Torvalds wrote:
 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.

Oh yeah, it's coming.  I just wanted to finish something else first
and, as turning on PF_WQ_WORKER on a rescuer thread has some chance of
developing into an obscure difficult-to-trigger and diagnose problem,
don't want to hurry it too much.

Thanks.

-- 
tejun
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] init, block: try to load default elevator module early during boot

2013-01-16 Thread Tejun Heo
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