Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp871219ybl; Fri, 10 Jan 2020 08:06:39 -0800 (PST) X-Google-Smtp-Source: APXvYqw7vqavXHRZWZ2Ug3y7QDgv6ttSbTRjTuUjGiX3kPwLB6CywtZjvkXU7rk8CelP2+vkAVvZ X-Received: by 2002:aca:ec4f:: with SMTP id k76mr2617646oih.156.1578672399276; Fri, 10 Jan 2020 08:06:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578672399; cv=none; d=google.com; s=arc-20160816; b=DJN4l2dXYyflmx/nziSYZkACWJ3poDKhKE6ifOAanDs3at5DK4FBYFqNAPFYbCAWJC oShaXaeukfUcTQ5H5MCw58E/F+75hI/ch00oI7lbPF1Jo2jG4eP3oW1XTah8tTZ7k1ph eh2Jbu2l5pEQbyhOQeYWuZA/bQREJFvHfpF+8cSwQKYe3STQSqkt+xzzquhyq64xcg+u kixIdS5pa/oPeZ6qnDagFW+vFn/MDc/a041+AxXdbkCfpxdzCeHSXeEQAvK+wZeKduQD 8xILBDRSQaO+auWrBoNeMKKi5r5tV2rnxxXGSS6XKIe4YbvseExG5T/PnD9YE6gvnYcN p6wg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=0s2sjXvkmTB4Fvdof4rDoEsPmYF2coOT8gluiq1kTbw=; b=jrzpKBzS0vd/t4oOCT47lF76RBImFzeJZXNMKAf/Gi9lxjWaWc7gPaELJPYPk95fYI 9kUb61RIMRZF8hsQOxq4li4CkiNzXtjnIlp8gtuvaKgcjmaF4ZQM/2sEGoIpfHMIYFmV gnYRGmSrqwcuSaG3Hr89+ZSxCHDxeHZeGLUrNvCDTvSlBk9OrMU5Vm8bfBf6G6pNicAn PVyPwxL7hmj79sRfcr1fSrAlE0SvolnH8WyS96l93kngNCyjDfUPqA9XyzjRBiQBQnU/ cOCzQaIxqKHzRbFU1LToqKWvKlZZyxtDAqbtWy4820pTCMQt2oQ25jNwAoFRrimBCzSp DPRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=17YmxVUK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e3si1518560otr.245.2020.01.10.08.06.17; Fri, 10 Jan 2020 08:06:39 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=17YmxVUK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728691AbgAJQEv (ORCPT + 99 others); Fri, 10 Jan 2020 11:04:51 -0500 Received: from mail.kernel.org ([198.145.29.99]:53050 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728480AbgAJQEv (ORCPT ); Fri, 10 Jan 2020 11:04:51 -0500 Received: from localhost.localdomain (NE2965lan1.rev.em-net.ne.jp [210.141.244.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id CF4B42082E; Fri, 10 Jan 2020 16:04:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578672289; bh=d9bwU0NSB/phIthpz6uNuMxm8K3EEKEchmYghjlLuQQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=17YmxVUKEX5ElSdwmVHTt5ZcdzNqtnpPseMt9anNstgMd0SQWK8HU3H1mGKX6zbHf Fd5yKs7+KZ1Gmk4hkMtuo/dJ/JuWbLfDj5DvuwOUrCuNdw4onVrK53FOjUh4i+3qA1 AMGC85ErFyFRZxLCuXUoMisuDKZUL7rnLlaZpIjk= From: Masami Hiramatsu To: Steven Rostedt Cc: Ingo Molnar , Frank Rowand , Randy Dunlap , Namhyung Kim , Tim Bird , Jiri Olsa , Arnaldo Carvalho de Melo , Tom Zanussi , Rob Herring , Andrew Morton , Thomas Gleixner , Greg Kroah-Hartman , Alexey Dobriyan , Jonathan Corbet , Linus Torvalds , linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 07/22] bootconfig: init: Allow admin to use bootconfig for kernel command line Date: Sat, 11 Jan 2020 01:04:43 +0900 Message-Id: <157867228333.17873.11962796367032622466.stgit@devnote2> X-Mailer: git-send-email 2.20.1 In-Reply-To: <157867220019.17873.13377985653744804396.stgit@devnote2> References: <157867220019.17873.13377985653744804396.stgit@devnote2> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since the current kernel command line is too short to describe many options which supported by kernel, allow user to use boot config to setup (add) the command line options. All kernel parameters under "kernel." keywords will be used for setting up extra kernel command line. For example, kernel { audit = on audit_backlog_limit = 256 } Note that you can not specify some early parameters (like console etc.) by this method, since it is loaded after early parameters parsed. Signed-off-by: Masami Hiramatsu --- init/main.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 101 insertions(+), 5 deletions(-) diff --git a/init/main.c b/init/main.c index 0b4e0c8ccf16..c0017d9d16e7 100644 --- a/init/main.c +++ b/init/main.c @@ -137,6 +137,8 @@ char __initdata boot_command_line[COMMAND_LINE_SIZE]; char *saved_command_line; /* Command line for parameter parsing */ static char *static_command_line; +/* Untouched extra command line */ +static char *extra_command_line; static char *execute_command; static char *ramdisk_execute_command; @@ -245,6 +247,83 @@ static int __init loglevel(char *str) early_param("loglevel", loglevel); #ifdef CONFIG_BOOT_CONFIG + +char xbc_namebuf[XBC_KEYLEN_MAX] __initdata; + +#define rest(dst, end) ((end) > (dst) ? (end) - (dst) : 0) + +static int __init xbc_snprint_cmdline(char *buf, size_t size, + struct xbc_node *root) +{ + struct xbc_node *knode, *vnode; + char *end = buf + size; + char c = '\"'; + const char *val; + int ret; + + xbc_node_for_each_key_value(root, knode, val) { + ret = xbc_node_compose_key_after(root, knode, + xbc_namebuf, XBC_KEYLEN_MAX); + if (ret < 0) + return ret; + + vnode = xbc_node_get_child(knode); + ret = snprintf(buf, rest(buf, end), "%s%c", xbc_namebuf, + vnode ? '=' : ' '); + if (ret < 0) + return ret; + buf += ret; + if (!vnode) + continue; + + c = '\"'; + xbc_array_for_each_value(vnode, val) { + ret = snprintf(buf, rest(buf, end), "%c%s", c, val); + if (ret < 0) + return ret; + buf += ret; + c = ','; + } + if (rest(buf, end) > 2) + strcpy(buf, "\" "); + buf += 2; + } + + return buf - (end - size); +} +#undef rest + +/* Make an extra command line under given key word */ +static char * __init xbc_make_cmdline(const char *key) +{ + struct xbc_node *root; + char *new_cmdline; + int ret, len = 0; + + root = xbc_find_node(key); + if (!root) + return NULL; + + /* Count required buffer size */ + len = xbc_snprint_cmdline(NULL, 0, root); + if (len <= 0) + return NULL; + + new_cmdline = memblock_alloc(len + 1, SMP_CACHE_BYTES); + if (!new_cmdline) { + pr_err("Failed to allocate memory for extra kernel cmdline.\n"); + return NULL; + } + + ret = xbc_snprint_cmdline(new_cmdline, len + 1, root); + if (ret < 0 || ret > len) { + pr_err("Failed to print extra kernel cmdline.\n"); + return NULL; + } + + return new_cmdline; +} + u32 boot_config_checksum(unsigned char *p, u32 size) { u32 ret = 0; @@ -289,8 +368,11 @@ static void __init setup_boot_config(void) if (xbc_init(copy) < 0) pr_err("Failed to parse boot config\n"); - else + else { pr_info("Load boot config: %d bytes\n", size); + /* keys starting with "kernel." are passed via cmdline */ + extra_command_line = xbc_make_cmdline("kernel"); + } } #else #define setup_boot_config() do { } while (0) @@ -425,7 +507,12 @@ static inline void smp_prepare_cpus(unsigned int maxcpus) { } */ static void __init setup_command_line(char *command_line) { - size_t len = strlen(boot_command_line) + 1; + size_t len, xlen = 0; + + if (extra_command_line) + xlen = strlen(extra_command_line); + + len = xlen + strlen(boot_command_line) + 1; saved_command_line = memblock_alloc(len, SMP_CACHE_BYTES); if (!saved_command_line) @@ -435,8 +522,17 @@ static void __init setup_command_line(char *command_line) if (!static_command_line) panic("%s: Failed to allocate %zu bytes\n", __func__, len); - strcpy(saved_command_line, boot_command_line); - strcpy(static_command_line, command_line); + if (xlen) { + /* + * We have to put extra_command_line before boot command + * lines because there could be dashes (separator of init + * command line) in the command lines. + */ + strcpy(saved_command_line, extra_command_line); + strcpy(static_command_line, extra_command_line); + } + strcpy(saved_command_line + xlen, boot_command_line); + strcpy(static_command_line + xlen, command_line); } /* @@ -652,7 +748,7 @@ asmlinkage __visible void __init start_kernel(void) build_all_zonelists(NULL); page_alloc_init(); - pr_notice("Kernel command line: %s\n", boot_command_line); + pr_notice("Kernel command line: %s\n", saved_command_line); /* parameters may set static keys */ jump_label_init(); parse_early_param();