[RFC] kexec: Add bootconfig support to get_command_line
Paul E. McKenney
paulmck at kernel.org
Mon Aug 11 09:21:54 PDT 2025
On Mon, Aug 11, 2025 at 04:37:36PM +0100, Usama Arif wrote:
> If the kernel is enabled with CONFIG_BOOT_CONFIG_FORCE, it will
> always append the bootconfig at the start of the kernel commandline.
> If reuse-cmdline option is used in kexec, the bootconfig will be
> repeatedly appended at the start of the commandline on every kexec.
> As there is a limit on the size of kernel commandline that can be
> used, --reuse-cmdline option will break kexec depending on the
> size of bootconfig on repeated kexec.
>
> Bootconfig is embedded in the kernel, so it should not be considered
> when reusing kernel command line.
> Modify get_command_line() to first attempt reading kernel parameters
> from /proc/bootconfig before falling back to /proc/cmdline. This allows
> kexec to use the original boot parameters without bootconfig which
> is embedded in the kernel.
>
> The function will fallback to /proc/cmdline behavior when:
>
> - /proc/bootconfig doesn't exist
> - /proc/bootconfig is empty
> - /proc/bootconfig doesn't contain the expected marker format
> - The extracted parameter line is empty
>
> Signed-off-by: Usama Arif <usamaarif642 at gmail.com>
Reviewed-by: Paul E. McKenney <paulmck at kernel.org>
> ---
> kexec/kexec.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
> 1 file changed, 44 insertions(+), 6 deletions(-)
>
> diff --git a/kexec/kexec.c b/kexec/kexec.c
> index 6bf12d7..b31cb1f 100644
> --- a/kexec/kexec.c
> +++ b/kexec/kexec.c
> @@ -1235,15 +1235,53 @@ static char *slurp_proc_file(const char *filename, size_t *len)
> */
> char *get_command_line(void)
> {
> - char *p, *line;
> + char *p, *line = NULL;
> size_t size;
> + char *bootconfig_line;
> + size_t bootconfig_size;
> +
> + /* First try to get command line parameters from /proc/bootconfig */
> + bootconfig_line = slurp_proc_file("/proc/bootconfig", &bootconfig_size);
> + if (bootconfig_line && bootconfig_size > 0) {
> + /* Look for "# Parameters from bootloader:" */
> + char *params_marker = strstr(bootconfig_line, "# Parameters from bootloader:");
> + if (params_marker) {
> + /* Find the next line after the marker */
> + char *params_start = strchr(params_marker, '\n');
> + if (params_start) {
> + params_start++; /* Move past the newline */
> +
> + /* Check if this line starts with "# " */
> + if (strncmp(params_start, "# ", 2) == 0) {
> + /* Skip the "# " prefix */
> + params_start += 2;
> +
> + /* Find the end of the line */
> + char *params_end = strchr(params_start, '\n');
> + if (params_end) {
> + *params_end = '\0';
> + }
> +
> + /* Check if the extracted line is not empty */
> + if (strlen(params_start) > 0) {
> + /* Allocate and copy the parameters */
> + line = xstrdup(params_start);
> + }
> + }
> + }
> + }
> + free(bootconfig_line);
> + }
>
> - line = slurp_proc_file("/proc/cmdline", &size);
> - if (!line || !size)
> - die("Failed to read /proc/cmdline\n");
> + /* Fall back to reading /proc/cmdline if we didn't get a line from bootconfig */
> + if (!line) {
> + line = slurp_proc_file("/proc/cmdline", &size);
> + if (!line || !size)
> + die("Failed to read /proc/cmdline\n");
>
> - /* strip newline */
> - line[size-1] = '\0';
> + /* strip newline */
> + line[size-1] = '\0';
> + }
>
> p = strpbrk(line, "\r\n");
> if (p)
> --
> 2.47.3
>
More information about the kexec
mailing list