Commit 30d7e0d4 authored by Alon Bar-Lev's avatar Alon Bar-Lev Committed by Linus Torvalds

[PATCH] Dynamic kernel command-line: common

Current implementation stores a static command-line buffer allocated to
COMMAND_LINE_SIZE size.  Most architectures stores two copies of this buffer,
one for future reference and one for parameter parsing.

Current kernel command-line size for most architecture is much too small for
module parameters, video settings, initramfs paramters and much more.  The
problem is that setting COMMAND_LINE_SIZE to a grater value, allocates static

In order to allow a greater command-line size, these buffers should be
dynamically allocated or marked as init disposable buffers, so unused memory
can be released.

This patch renames the static saved_command_line variable into
boot_command_line adding __initdata attribute, so that it can be disposed
after initialization.  This rename is required so applications that use
saved_command_line will not be affected by this change.

It reintroduces saved_command_line as dynamically allocated buffer to match
the data in boot_command_line.

It also mark secondary command-line buffer as __initdata, and copies it to
dynamically allocated static_command_line buffer components may hold reference
to it after initialization.

This patch is for linux-2.6.20-rc4-mm1 and is divided to target each
architecture.  I could not check this in any architecture so please forgive me
if I got it wrong.

The per-architecture modification is very simple, use boot_command_line in
place of saved_command_line.  The common code is the change into dynamic

This patch:

1. Rename saved_command_line into boot_command_line, mark as init

2. Add dynamic allocated saved_command_line.

3. Add dynamic allocated static_command_line.

4. During startup copy: boot_command_line into saved_command_line.  arch
   command_line into static_command_line.

5. Parse static_command_line and not arch command_line, so arch
   command_line may be freed.
Signed-off-by: default avatarAlon Bar-Lev <>
Cc: Andi Kleen <>
Cc: Paul Mackerras <>
Cc: Benjamin Herrenschmidt <>
Cc: Richard Henderson <>
Cc: Ivan Kokshaysky <>
Cc: Russell King <>
Cc: Ian Molton <>
Cc: Mikael Starvik <>
Cc: David Howells <>
Cc: Yoshinori Sato <>
Cc: Ralf Baechle <>
Cc: Kyle McMartin <>
Cc: Heiko Carstens <>
Cc: Martin Schwidefsky <>
Cc: Hirokazu Takata <>
Cc: Paul Mundt <>
Cc: Kazumoto Kojima <>
Cc: Richard Curnow <>
Cc: William Lee Irwin III <>
Cc: "David S. Miller" <>
Cc: Jeff Dike <>
Cc: Paolo 'Blaisorblade' Giarrusso <>
Cc: Miles Bader <>
Cc: Chris Zankel <>
Cc: "Luck, Tony" <>
Cc: Geert Uytterhoeven <>
Cc: Roman Zippel <>
Cc: Greg Ungerer <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent ff91691b
......@@ -67,7 +67,8 @@ extern initcall_t __con_initcall_start[], __con_initcall_end[];
extern initcall_t __security_initcall_start[], __security_initcall_end[];
/* Defined in init/main.c */
extern char saved_command_line[];
extern char __initdata boot_command_line[];
extern char *saved_command_line;
extern unsigned int reset_devices;
/* used by init/main.c */
......@@ -164,7 +165,7 @@ struct obs_kernel_param {
#define early_param(str, fn) \
__setup_param(str, fn, fn, 1)
/* Relies on saved_command_line being set */
/* Relies on boot_command_line being set */
void __init parse_early_param(void);
#endif /* __ASSEMBLY__ */
......@@ -121,8 +121,12 @@ extern void time_init(void);
void (*late_time_init)(void);
extern void softirq_init(void);
/* Untouched command line (eg. for /proc) saved by arch-specific code. */
char saved_command_line[COMMAND_LINE_SIZE];
/* Untouched command line saved by arch-specific code. */
char __initdata boot_command_line[COMMAND_LINE_SIZE];
/* Untouched saved command line (eg. for /proc) */
char *saved_command_line;
/* Command line for parameter parsing */
static char *static_command_line;
static char *execute_command;
static char *ramdisk_execute_command;
......@@ -399,6 +403,20 @@ static void __init smp_init(void)
* We need to store the untouched command line for future reference.
* We also need to store the touched command line since the parameter
* parsing is performed in place, and we should allow a component to
* store reference of name/value for future reference.
static void __init setup_command_line(char *command_line)
saved_command_line = alloc_bootmem(strlen (boot_command_line)+1);
static_command_line = alloc_bootmem(strlen (command_line)+1);
strcpy (saved_command_line, boot_command_line);
strcpy (static_command_line, command_line);
* We need to finalize in a non-__init function or else race conditions
* between the root thread and the init thread may cause start_kernel to
......@@ -453,7 +471,7 @@ void __init parse_early_param(void)
/* All fall through to do_early_param. */
strlcpy(tmp_cmdline, saved_command_line, COMMAND_LINE_SIZE);
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_args("early options", tmp_cmdline, NULL, 0, do_early_param);
done = 1;
......@@ -503,6 +521,7 @@ asmlinkage void __init start_kernel(void)
smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
......@@ -520,9 +539,9 @@ asmlinkage void __init start_kernel(void)
printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line);
printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
parse_args("Booting kernel", command_line, __start___param,
parse_args("Booting kernel", static_command_line, __start___param,
__stop___param - __start___param,
if (!irqs_disabled()) {
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment