diff options
Diffstat (limited to 'init/main.c')
| -rw-r--r-- | init/main.c | 44 | 
1 files changed, 37 insertions, 7 deletions
diff --git a/init/main.c b/init/main.c index 2ca52474d0c3..206acdde51f5 100644 --- a/init/main.c +++ b/init/main.c @@ -327,7 +327,7 @@ static int __init xbc_snprint_cmdline(char *buf, size_t size,  {  	struct xbc_node *knode, *vnode;  	char *end = buf + size; -	const char *val; +	const char *val, *q;  	int ret;  	xbc_node_for_each_key_value(root, knode, val) { @@ -345,8 +345,14 @@ static int __init xbc_snprint_cmdline(char *buf, size_t size,  			continue;  		}  		xbc_array_for_each_value(vnode, val) { -			ret = snprintf(buf, rest(buf, end), "%s=\"%s\" ", -				       xbc_namebuf, val); +			/* +			 * For prettier and more readable /proc/cmdline, only +			 * quote the value when necessary, i.e. when it contains +			 * whitespace. +			 */ +			q = strpbrk(val, " \t\r\n") ? "\"" : ""; +			ret = snprintf(buf, rest(buf, end), "%s=%s%s%s ", +				       xbc_namebuf, q, val, q);  			if (ret < 0)  				return ret;  			buf += ret; @@ -487,6 +493,11 @@ static int __init warn_bootconfig(char *str)  early_param("bootconfig", warn_bootconfig); +bool __init cmdline_has_extra_options(void) +{ +	return extra_command_line || extra_init_args; +} +  /* Change NUL term back to "=", to make "param" the whole string. */  static void __init repair_env_string(char *param, char *val)  { @@ -622,14 +633,18 @@ static void __init setup_command_line(char *command_line)  	if (extra_command_line)  		xlen = strlen(extra_command_line); -	if (extra_init_args) +	if (extra_init_args) { +		extra_init_args = strim(extra_init_args); /* remove trailing space */  		ilen = strlen(extra_init_args) + 4; /* for " -- " */ +	} -	len = xlen + strlen(boot_command_line) + 1; +	len = xlen + strlen(boot_command_line) + ilen + 1; -	saved_command_line = memblock_alloc(len + ilen, SMP_CACHE_BYTES); +	saved_command_line = memblock_alloc(len, SMP_CACHE_BYTES);  	if (!saved_command_line) -		panic("%s: Failed to allocate %zu bytes\n", __func__, len + ilen); +		panic("%s: Failed to allocate %zu bytes\n", __func__, len); + +	len = xlen + strlen(command_line) + 1;  	static_command_line = memblock_alloc(len, SMP_CACHE_BYTES);  	if (!static_command_line) @@ -871,6 +886,19 @@ static void __init print_unknown_bootoptions(void)  	memblock_free(unknown_options, len);  } +static void __init early_numa_node_init(void) +{ +#ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID +#ifndef cpu_to_node +	int cpu; + +	/* The early_cpu_to_node() should be ready here. */ +	for_each_possible_cpu(cpu) +		set_cpu_numa_node(cpu, early_cpu_to_node(cpu)); +#endif +#endif +} +  asmlinkage __visible __init __no_sanitize_address __noreturn __no_stack_protector  void start_kernel(void)  { @@ -901,6 +929,7 @@ void start_kernel(void)  	setup_nr_cpu_ids();  	setup_per_cpu_areas();  	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */ +	early_numa_node_init();  	boot_cpu_hotplug_init();  	pr_notice("Kernel command line: %s\n", saved_command_line); @@ -1408,6 +1437,7 @@ static void mark_readonly(void)  		 * insecure pages which are W+X.  		 */  		flush_module_init_free_work(); +		jump_label_init_ro();  		mark_rodata_ro();  		debug_checkwx();  		rodata_test();  |