Commit 13199162 authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Steven Rostedt (VMware)

bootconfig: init: Allow admin to use bootconfig for init command line

Since the current kernel command line is too short to describe
long and many options for init (e.g. systemd command line options),
this allows admin to use boot config for init command line.

All init command line under "init." keywords will be passed to
init.

For example,

init.systemd {
	unified_cgroup_hierarchy = 1
	debug_shell
	default_timeout_start_sec = 60
}

Link: http://lkml.kernel.org/r/157867229521.17873.654222294326542349.stgit@devnote2Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 51887d03
...@@ -139,6 +139,8 @@ char *saved_command_line; ...@@ -139,6 +139,8 @@ char *saved_command_line;
static char *static_command_line; static char *static_command_line;
/* Untouched extra command line */ /* Untouched extra command line */
static char *extra_command_line; static char *extra_command_line;
/* Extra init arguments */
static char *extra_init_args;
static char *execute_command; static char *execute_command;
static char *ramdisk_execute_command; static char *ramdisk_execute_command;
...@@ -372,6 +374,8 @@ static void __init setup_boot_config(void) ...@@ -372,6 +374,8 @@ static void __init setup_boot_config(void)
pr_info("Load boot config: %d bytes\n", size); pr_info("Load boot config: %d bytes\n", size);
/* keys starting with "kernel." are passed via cmdline */ /* keys starting with "kernel." are passed via cmdline */
extra_command_line = xbc_make_cmdline("kernel"); extra_command_line = xbc_make_cmdline("kernel");
/* Also, "init." keys are init arguments */
extra_init_args = xbc_make_cmdline("init");
} }
} }
#else #else
...@@ -507,16 +511,18 @@ static inline void smp_prepare_cpus(unsigned int maxcpus) { } ...@@ -507,16 +511,18 @@ static inline void smp_prepare_cpus(unsigned int maxcpus) { }
*/ */
static void __init setup_command_line(char *command_line) static void __init setup_command_line(char *command_line)
{ {
size_t len, xlen = 0; size_t len, xlen = 0, ilen = 0;
if (extra_command_line) if (extra_command_line)
xlen = strlen(extra_command_line); xlen = strlen(extra_command_line);
if (extra_init_args)
ilen = strlen(extra_init_args) + 4; /* for " -- " */
len = xlen + strlen(boot_command_line) + 1; len = xlen + strlen(boot_command_line) + 1;
saved_command_line = memblock_alloc(len, SMP_CACHE_BYTES); saved_command_line = memblock_alloc(len + ilen, SMP_CACHE_BYTES);
if (!saved_command_line) if (!saved_command_line)
panic("%s: Failed to allocate %zu bytes\n", __func__, len); panic("%s: Failed to allocate %zu bytes\n", __func__, len + ilen);
static_command_line = memblock_alloc(len, SMP_CACHE_BYTES); static_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
if (!static_command_line) if (!static_command_line)
...@@ -533,6 +539,22 @@ static void __init setup_command_line(char *command_line) ...@@ -533,6 +539,22 @@ static void __init setup_command_line(char *command_line)
} }
strcpy(saved_command_line + xlen, boot_command_line); strcpy(saved_command_line + xlen, boot_command_line);
strcpy(static_command_line + xlen, command_line); strcpy(static_command_line + xlen, command_line);
if (ilen) {
/*
* Append supplemental init boot args to saved_command_line
* so that user can check what command line options passed
* to init.
*/
len = strlen(saved_command_line);
if (!strstr(boot_command_line, " -- ")) {
strcpy(saved_command_line + len, " -- ");
len += 4;
} else
saved_command_line[len++] = ' ';
strcpy(saved_command_line + len, extra_init_args);
}
} }
/* /*
...@@ -759,6 +781,9 @@ asmlinkage __visible void __init start_kernel(void) ...@@ -759,6 +781,9 @@ asmlinkage __visible void __init start_kernel(void)
if (!IS_ERR_OR_NULL(after_dashes)) if (!IS_ERR_OR_NULL(after_dashes))
parse_args("Setting init args", after_dashes, NULL, 0, -1, -1, parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
NULL, set_init_arg); NULL, set_init_arg);
if (extra_init_args)
parse_args("Setting extra init args", extra_init_args,
NULL, 0, -1, -1, NULL, set_init_arg);
/* /*
* These use large bootmem allocations and must precede * These use large bootmem allocations and must precede
......
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