* [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot
@ 2022-03-14 1:53 Masami Hiramatsu
2022-03-14 1:54 ` [PATCH v2 1/3] bootconfig: Check the checksum before removing the bootconfig from initrd Masami Hiramatsu
` (2 more replies)
0 siblings, 3 replies; 20+ messages in thread
From: Masami Hiramatsu @ 2022-03-14 1:53 UTC (permalink / raw)
To: Steven Rostedt
Cc: Masami Hiramatsu, Padmanabha Srinivasaiah, LKML, Jonathan Corbet,
linux-doc, Randy Dunlap
Hi,
Here are the 2nd version of the patchset to enable kernel embedded bootconfig
for non-initrd kernel boot environment. You can embed a bootconfig file into
the kernel as a default bootconfig, which will be used if there is no initrd or no
bootconfig is attached to initrd.
This needs 2 options: CONFIG_EMBED_BOOT_CONFIG=y and set the file
path to CONFIG_EMBED_BOOT_CONFIG_FILE. Even if you embed the bootconfig file
to the kernel, it will not be enabled unless you pass "bootconfig" kernel
command line option at boot. Moreover, since this is just a "default"
bootconfig, you can override it with a new bootconfig if you attach another
bootconfig to the initrd (if possible).
CONFIG_EMBED_BOOT_CONFIG_FILE can take both absolute and relative path, but
to simplify and make it independent from the build environment, I recommend
you to use an absolute path for that.
This is requested by Padmanabha at the below thread;
https://lore.kernel.org/all/20220307184011.GA2570@pswork/T/#u
Thank you,
---
Masami Hiramatsu (3):
bootconfig: Check the checksum before removing the bootconfig from initrd
bootconfig: Support embedding a bootconfig file in kernel
docs: bootconfig: Add how to embed the bootconfig into kernel
Documentation/admin-guide/bootconfig.rst | 30 ++++++++++++++++++++++++++---
include/linux/bootconfig.h | 10 ++++++++++
init/Kconfig | 21 ++++++++++++++++++++
init/main.c | 31 +++++++++++++++---------------
lib/.gitignore | 1 +
lib/Makefile | 12 ++++++++++++
lib/bootconfig.c | 23 ++++++++++++++++++++++
7 files changed, 110 insertions(+), 18 deletions(-)
--
Masami Hiramatsu (Linaro) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH v2 1/3] bootconfig: Check the checksum before removing the bootconfig from initrd 2022-03-14 1:53 [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot Masami Hiramatsu @ 2022-03-14 1:54 ` Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel Masami Hiramatsu 2 siblings, 0 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-14 1:54 UTC (permalink / raw) To: Steven Rostedt Cc: Masami Hiramatsu, Padmanabha Srinivasaiah, LKML, Jonathan Corbet, linux-doc, Randy Dunlap Check the bootconfig's checksum before removing the bootcinfig data from initrd to avoid modifying initrd by mistake. This will also simplifies the get_boot_config_from_initrd() interface. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> --- init/main.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/init/main.c b/init/main.c index 65fa2e41a9c0..421050be5039 100644 --- a/init/main.c +++ b/init/main.c @@ -265,7 +265,7 @@ static int __init loglevel(char *str) early_param("loglevel", loglevel); #ifdef CONFIG_BLK_DEV_INITRD -static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) +static void * __init get_boot_config_from_initrd(u32 *_size) { u32 size, csum; char *data; @@ -299,17 +299,20 @@ static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) return NULL; } + if (xbc_calc_checksum(data, size) != csum) { + pr_err("bootconfig checksum failed\n"); + return NULL; + } + /* Remove bootconfig from initramfs/initrd */ initrd_end = (unsigned long)data; if (_size) *_size = size; - if (_csum) - *_csum = csum; return data; } #else -static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) +static void * __init get_boot_config_from_initrd(u32 *_size) { return NULL; } @@ -408,12 +411,12 @@ static void __init setup_boot_config(void) static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; const char *msg; int pos; - u32 size, csum; + u32 size; char *data, *err; int ret; /* Cut out the bootconfig data even if we have no bootconfig option */ - data = get_boot_config_from_initrd(&size, &csum); + data = get_boot_config_from_initrd(&size); strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, @@ -437,11 +440,6 @@ static void __init setup_boot_config(void) return; } - if (xbc_calc_checksum(data, size) != csum) { - pr_err("bootconfig checksum failed\n"); - return; - } - ret = xbc_init(data, size, &msg, &pos); if (ret < 0) { if (pos < 0) @@ -470,7 +468,7 @@ static void __init exit_boot_config(void) static void __init setup_boot_config(void) { /* Remove bootconfig data from initrd */ - get_boot_config_from_initrd(NULL, NULL); + get_boot_config_from_initrd(NULL); } static int __init warn_bootconfig(char *str) ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-14 1:53 [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 1/3] bootconfig: Check the checksum before removing the bootconfig from initrd Masami Hiramatsu @ 2022-03-14 1:54 ` Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel Masami Hiramatsu 2 siblings, 0 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-14 1:54 UTC (permalink / raw) To: Steven Rostedt Cc: Masami Hiramatsu, Padmanabha Srinivasaiah, LKML, Jonathan Corbet, linux-doc, Randy Dunlap This allows kernel developer to embed a default bootconfig file in the kernel instead of embedding it in the initrd. This will be good for who are using the kernel without initrd, or who needs a default bootconfigs. This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. Note that you still need 'bootconfig' command line option to load the embedded bootconfig. Also if you boot using an initrd with a different bootconfig, the kernel will use the bootconfig in the initrd, instead of the default bootconfig. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> --- include/linux/bootconfig.h | 10 ++++++++++ init/Kconfig | 21 +++++++++++++++++++++ init/main.c | 13 ++++++++----- lib/.gitignore | 1 + lib/Makefile | 12 ++++++++++++ lib/bootconfig.c | 23 +++++++++++++++++++++++ 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h index a4665c7ab07c..5dbda5e3e9bb 100644 --- a/include/linux/bootconfig.h +++ b/include/linux/bootconfig.h @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); /* XBC cleanup data structures */ void __init xbc_exit(void); +/* XBC embedded bootconfig data in kernel */ +#ifdef CONFIG_EMBED_BOOT_CONFIG +char * __init xbc_get_embedded_bootconfig(size_t *size); +#else +static inline char *xbc_get_embedded_bootconfig(size_t *size) +{ + return NULL; +} +#endif + #endif diff --git a/init/Kconfig b/init/Kconfig index e9119bf54b1f..70440804874d 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1357,6 +1357,27 @@ config BOOT_CONFIG If unsure, say Y. +config EMBED_BOOT_CONFIG + bool "Embed bootconfig file in the kernel" + depends on BOOT_CONFIG + default n + help + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the + kernel. Usually, the bootconfig file is loaded with the initrd + image. But if the system doesn't support initrd, this option will + help you by embedding a bootconfig file while building the kernel. + + If unsure, say N. + +config EMBED_BOOT_CONFIG_FILE + string "Embedded bootconfig file path" + default "" + depends on EMBED_BOOT_CONFIG + help + Specify a bootconfig file which will be embedded to the kernel. + This bootconfig will be used if there is no initrd or no other + bootconfig in the initrd. + choice prompt "Compiler optimization level" default CC_OPTIMIZE_FOR_PERFORMANCE diff --git a/init/main.c b/init/main.c index 421050be5039..3803bf2e22ea 100644 --- a/init/main.c +++ b/init/main.c @@ -265,7 +265,7 @@ static int __init loglevel(char *str) early_param("loglevel", loglevel); #ifdef CONFIG_BLK_DEV_INITRD -static void * __init get_boot_config_from_initrd(u32 *_size) +static void * __init get_boot_config_from_initrd(size_t *_size) { u32 size, csum; char *data; @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; const char *msg; int pos; - u32 size; + size_t size; char *data, *err; int ret; /* Cut out the bootconfig data even if we have no bootconfig option */ data = get_boot_config_from_initrd(&size); + /* If there is no bootconfig in initrd, try embedded one. */ + if (!data) + data = xbc_get_embedded_bootconfig(&size); strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) } if (size >= XBC_DATA_MAX) { - pr_err("bootconfig size %d greater than max size %d\n", - size, XBC_DATA_MAX); + pr_err("bootconfig size %ld greater than max size %d\n", + (long)size, XBC_DATA_MAX); return; } @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) msg, pos); } else { xbc_get_info(&ret, NULL); - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); /* keys starting with "kernel." are passed via cmdline */ extra_command_line = xbc_make_cmdline("kernel"); /* Also, "init." keys are init arguments */ diff --git a/lib/.gitignore b/lib/.gitignore index e5e217b8307b..30a2a5db7033 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -6,3 +6,4 @@ /oid_registry_data.c /test_fortify.log /test_fortify/*.log +/default.bconf diff --git a/lib/Makefile b/lib/Makefile index 300f569c626b..8183785ee99d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) lib-$(CONFIG_LIBFDT) += $(libfdt_files) +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) +# Since the specified bootconfig file can be switched, we forcibly update the +# default.bconf file always. +$(obj)/default.bconf: FORCE + $(call cmd,defbconf) + +quiet_cmd_defbconf = GEN $@ + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ +clean-files += default.bconf +$(obj)/bootconfig.o: $(obj)/default.bconf +endif + lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o diff --git a/lib/bootconfig.c b/lib/bootconfig.c index 74f3201ab8e5..3a3bf3a208e3 100644 --- a/lib/bootconfig.c +++ b/lib/bootconfig.c @@ -12,6 +12,29 @@ #include <linux/kernel.h> #include <linux/memblock.h> #include <linux/string.h> + +#ifdef CONFIG_EMBED_BOOT_CONFIG +asm ( +" .pushsection .init.data, \"aw\" \n" +" .global embedded_bootconfig_data \n" +"embedded_bootconfig_data: \n" +" .incbin \"lib/default.bconf\" \n" +" .global embedded_bootconfig_data_end \n" +"embedded_bootconfig_data_end: \n" +" .popsection \n" +); + +extern __visible char embedded_bootconfig_data[]; +extern __visible char embedded_bootconfig_data_end[]; + +char * __init xbc_get_embedded_bootconfig(size_t *size) +{ + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; + return (*size) ? embedded_bootconfig_data : NULL; +} + +#endif + #else /* !__KERNEL__ */ /* * NOTE: This is only for tools/bootconfig, because tools/bootconfig will ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel 2022-03-14 1:53 [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 1/3] bootconfig: Check the checksum before removing the bootconfig from initrd Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel Masami Hiramatsu @ 2022-03-14 1:54 ` Masami Hiramatsu 2022-03-14 2:03 ` Randy Dunlap 2 siblings, 1 reply; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-14 1:54 UTC (permalink / raw) To: Steven Rostedt Cc: Masami Hiramatsu, Padmanabha Srinivasaiah, LKML, Jonathan Corbet, linux-doc, Randy Dunlap Add a description how to embed the bootconfig file into kernel. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> --- Changes in v2: - Corrected the text accoding to Randy's suggestion. - Do not reccomend to use relative path for CONFIG_EMBED_BOOT_CONFIG_FILE. --- Documentation/admin-guide/bootconfig.rst | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin-guide/bootconfig.rst index a1860fc0ca88..1af1a172fdd4 100644 --- a/Documentation/admin-guide/bootconfig.rst +++ b/Documentation/admin-guide/bootconfig.rst @@ -158,9 +158,15 @@ Each key-value pair is shown in each line with following style:: Boot Kernel With a Boot Config ============================== -Since the boot configuration file is loaded with initrd, it will be added -to the end of the initrd (initramfs) image file with padding, size, -checksum and 12-byte magic word as below. +There are two options to boot the kernel with bootconfig: attaching the +bootconfig to the initrd image or embedding it in the kernel itself. + +Attaching a Boot Config to Initrd +--------------------------------- + +Since the boot configuration file is loaded with initrd by default, +it will be added to the end of the initrd (initramfs) image file with +padding, size, checksum and 12-byte magic word as below. [initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n] @@ -196,6 +202,24 @@ To remove the config from the image, you can use -d option as below:: Then add "bootconfig" on the normal kernel command line to tell the kernel to look for the bootconfig at the end of the initrd file. +Embedding a Boot Config into Kernel +----------------------------------- + +If you can not use initrd, you can also embed the bootconfig file in the +kernel by Kconfig options. In this case, you need to recompile the kernel +with the following configs:: + + COFNIG_EMBED_BOOT_CONFIG=y + CONFIG_EMBED_BOOT_CONFIG_FILE="/PATH/TO/BOOTCONFIG/FILE" + +``CONFIG_EMBED_BOOT_CONFIG_FILE`` requires a correct absolute path to +the bootconfig file. The kernel will embed it as the default bootconfig. + +Just as when attaching the bootconfig to the initrd, you need ``bootconfig`` +option to the kernel command line to enable the embedded bootconfig. + +Note that even if you set this option, you can override the embedded +bootconfig by another bootconfig which attached to the initrd. Kernel parameters via Boot Config ================================= ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel 2022-03-14 1:54 ` [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel Masami Hiramatsu @ 2022-03-14 2:03 ` Randy Dunlap 2022-03-14 8:03 ` Masami Hiramatsu 0 siblings, 1 reply; 20+ messages in thread From: Randy Dunlap @ 2022-03-14 2:03 UTC (permalink / raw) To: Masami Hiramatsu, Steven Rostedt Cc: Padmanabha Srinivasaiah, LKML, Jonathan Corbet, linux-doc On 3/13/22 18:54, Masami Hiramatsu wrote: > Add a description how to embed the bootconfig file into kernel. > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > --- > Changes in v2: > - Corrected the text accoding to Randy's suggestion. > - Do not reccomend to use relative path for CONFIG_EMBED_BOOT_CONFIG_FILE. > --- > Documentation/admin-guide/bootconfig.rst | 30 +++++++++++++++++++++++++++--- > 1 file changed, 27 insertions(+), 3 deletions(-) > > diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin-guide/bootconfig.rst > index a1860fc0ca88..1af1a172fdd4 100644 > --- a/Documentation/admin-guide/bootconfig.rst > +++ b/Documentation/admin-guide/bootconfig.rst > @@ -158,9 +158,15 @@ Each key-value pair is shown in each line with following style:: > Boot Kernel With a Boot Config > ============================== > > -Since the boot configuration file is loaded with initrd, it will be added > -to the end of the initrd (initramfs) image file with padding, size, > -checksum and 12-byte magic word as below. > +There are two options to boot the kernel with bootconfig: attaching the > +bootconfig to the initrd image or embedding it in the kernel itself. > + > +Attaching a Boot Config to Initrd > +--------------------------------- > + > +Since the boot configuration file is loaded with initrd by default, > +it will be added to the end of the initrd (initramfs) image file with > +padding, size, checksum and 12-byte magic word as below. > > [initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n] > > @@ -196,6 +202,24 @@ To remove the config from the image, you can use -d option as below:: > Then add "bootconfig" on the normal kernel command line to tell the > kernel to look for the bootconfig at the end of the initrd file. > > +Embedding a Boot Config into Kernel > +----------------------------------- > + > +If you can not use initrd, you can also embed the bootconfig file in the > +kernel by Kconfig options. In this case, you need to recompile the kernel > +with the following configs:: > + > + COFNIG_EMBED_BOOT_CONFIG=y CONFIG_ > + CONFIG_EMBED_BOOT_CONFIG_FILE="/PATH/TO/BOOTCONFIG/FILE" > + > +``CONFIG_EMBED_BOOT_CONFIG_FILE`` requires a correct absolute path to > +the bootconfig file. The kernel will embed it as the default bootconfig. > + > +Just as when attaching the bootconfig to the initrd, you need ``bootconfig`` > +option to the kernel command line to enable the embedded bootconfig. on the preferably. > + > +Note that even if you set this option, you can override the embedded > +bootconfig by another bootconfig which attached to the initrd. > > Kernel parameters via Boot Config > ================================= > thanks. -- ~Randy ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel 2022-03-14 2:03 ` Randy Dunlap @ 2022-03-14 8:03 ` Masami Hiramatsu 0 siblings, 0 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-14 8:03 UTC (permalink / raw) To: Randy Dunlap Cc: Steven Rostedt, Padmanabha Srinivasaiah, LKML, Jonathan Corbet, linux-doc On Sun, 13 Mar 2022 19:03:20 -0700 Randy Dunlap <rdunlap@infradead.org> wrote: > > > On 3/13/22 18:54, Masami Hiramatsu wrote: > > Add a description how to embed the bootconfig file into kernel. > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > --- > > Changes in v2: > > - Corrected the text accoding to Randy's suggestion. > > - Do not reccomend to use relative path for CONFIG_EMBED_BOOT_CONFIG_FILE. > > --- > > Documentation/admin-guide/bootconfig.rst | 30 +++++++++++++++++++++++++++--- > > 1 file changed, 27 insertions(+), 3 deletions(-) > > > > diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin-guide/bootconfig.rst > > index a1860fc0ca88..1af1a172fdd4 100644 > > --- a/Documentation/admin-guide/bootconfig.rst > > +++ b/Documentation/admin-guide/bootconfig.rst > > @@ -158,9 +158,15 @@ Each key-value pair is shown in each line with following style:: > > Boot Kernel With a Boot Config > > ============================== > > > > -Since the boot configuration file is loaded with initrd, it will be added > > -to the end of the initrd (initramfs) image file with padding, size, > > -checksum and 12-byte magic word as below. > > +There are two options to boot the kernel with bootconfig: attaching the > > +bootconfig to the initrd image or embedding it in the kernel itself. > > + > > +Attaching a Boot Config to Initrd > > +--------------------------------- > > + > > +Since the boot configuration file is loaded with initrd by default, > > +it will be added to the end of the initrd (initramfs) image file with > > +padding, size, checksum and 12-byte magic word as below. > > > > [initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n] > > > > @@ -196,6 +202,24 @@ To remove the config from the image, you can use -d option as below:: > > Then add "bootconfig" on the normal kernel command line to tell the > > kernel to look for the bootconfig at the end of the initrd file. > > > > +Embedding a Boot Config into Kernel > > +----------------------------------- > > + > > +If you can not use initrd, you can also embed the bootconfig file in the > > +kernel by Kconfig options. In this case, you need to recompile the kernel > > +with the following configs:: > > + > > + COFNIG_EMBED_BOOT_CONFIG=y > > CONFIG_ Oops, it's a typo... > > > + CONFIG_EMBED_BOOT_CONFIG_FILE="/PATH/TO/BOOTCONFIG/FILE" > > + > > +``CONFIG_EMBED_BOOT_CONFIG_FILE`` requires a correct absolute path to > > +the bootconfig file. The kernel will embed it as the default bootconfig. > > + > > +Just as when attaching the bootconfig to the initrd, you need ``bootconfig`` > > +option to the kernel command line to enable the embedded bootconfig. > > on the OK. Thank you! > > preferably. > > > + > > +Note that even if you set this option, you can override the embedded > > +bootconfig by another bootconfig which attached to the initrd. > > > > Kernel parameters via Boot Config > > ================================= > > > > thanks. > -- > ~Randy -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot
@ 2022-03-14 9:08 Masami Hiramatsu
2022-03-14 9:08 ` [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel Masami Hiramatsu
0 siblings, 1 reply; 20+ messages in thread
From: Masami Hiramatsu @ 2022-03-14 9:08 UTC (permalink / raw)
To: Steven Rostedt
Cc: Masami Hiramatsu, Padmanabha Srinivasaiah, LKML, Jonathan Corbet,
linux-doc, Randy Dunlap
Hi,
Here are the 3rd version of the patchset to enable kernel embedded bootconfig
for non-initrd kernel boot environment. In this version, I fixed some typo in
the document patch [3/3].
You can embed a bootconfig file into the kernel as a default bootconfig,
which will be used if there is no initrd or no bootconfig is attached to initrd.
This needs 2 options: CONFIG_EMBED_BOOT_CONFIG=y and set the file
path to CONFIG_EMBED_BOOT_CONFIG_FILE. Even if you embed the bootconfig file
to the kernel, it will not be enabled unless you pass "bootconfig" kernel
command line option at boot. Moreover, since this is just a "default"
bootconfig, you can override it with a new bootconfig if you attach another
bootconfig to the initrd (if possible).
CONFIG_EMBED_BOOT_CONFIG_FILE can take both absolute and relative path, but
to simplify and make it independent from the build environment, I recommend
you to use an absolute path for that.
This is requested by Padmanabha at the below thread;
https://lore.kernel.org/all/20220307184011.GA2570@pswork/T/#u
Thank you,
---
Masami Hiramatsu (3):
bootconfig: Check the checksum before removing the bootconfig from initrd
bootconfig: Support embedding a bootconfig file in kernel
docs: bootconfig: Add how to embed the bootconfig into kernel
Documentation/admin-guide/bootconfig.rst | 30 ++++++++++++++++++++++++++---
include/linux/bootconfig.h | 10 ++++++++++
init/Kconfig | 21 ++++++++++++++++++++
init/main.c | 31 +++++++++++++++---------------
lib/.gitignore | 1 +
lib/Makefile | 12 ++++++++++++
lib/bootconfig.c | 23 ++++++++++++++++++++++
7 files changed, 110 insertions(+), 18 deletions(-)
--
Masami Hiramatsu (Linaro) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-14 9:08 [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot Masami Hiramatsu @ 2022-03-14 9:08 ` Masami Hiramatsu 2022-03-16 19:16 ` Padmanabha Srinivasaiah 0 siblings, 1 reply; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-14 9:08 UTC (permalink / raw) To: Steven Rostedt Cc: Masami Hiramatsu, Padmanabha Srinivasaiah, LKML, Jonathan Corbet, linux-doc, Randy Dunlap This allows kernel developer to embed a default bootconfig file in the kernel instead of embedding it in the initrd. This will be good for who are using the kernel without initrd, or who needs a default bootconfigs. This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. Note that you still need 'bootconfig' command line option to load the embedded bootconfig. Also if you boot using an initrd with a different bootconfig, the kernel will use the bootconfig in the initrd, instead of the default bootconfig. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> --- include/linux/bootconfig.h | 10 ++++++++++ init/Kconfig | 21 +++++++++++++++++++++ init/main.c | 13 ++++++++----- lib/.gitignore | 1 + lib/Makefile | 12 ++++++++++++ lib/bootconfig.c | 23 +++++++++++++++++++++++ 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h index a4665c7ab07c..5dbda5e3e9bb 100644 --- a/include/linux/bootconfig.h +++ b/include/linux/bootconfig.h @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); /* XBC cleanup data structures */ void __init xbc_exit(void); +/* XBC embedded bootconfig data in kernel */ +#ifdef CONFIG_EMBED_BOOT_CONFIG +char * __init xbc_get_embedded_bootconfig(size_t *size); +#else +static inline char *xbc_get_embedded_bootconfig(size_t *size) +{ + return NULL; +} +#endif + #endif diff --git a/init/Kconfig b/init/Kconfig index e9119bf54b1f..70440804874d 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1357,6 +1357,27 @@ config BOOT_CONFIG If unsure, say Y. +config EMBED_BOOT_CONFIG + bool "Embed bootconfig file in the kernel" + depends on BOOT_CONFIG + default n + help + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the + kernel. Usually, the bootconfig file is loaded with the initrd + image. But if the system doesn't support initrd, this option will + help you by embedding a bootconfig file while building the kernel. + + If unsure, say N. + +config EMBED_BOOT_CONFIG_FILE + string "Embedded bootconfig file path" + default "" + depends on EMBED_BOOT_CONFIG + help + Specify a bootconfig file which will be embedded to the kernel. + This bootconfig will be used if there is no initrd or no other + bootconfig in the initrd. + choice prompt "Compiler optimization level" default CC_OPTIMIZE_FOR_PERFORMANCE diff --git a/init/main.c b/init/main.c index 421050be5039..3803bf2e22ea 100644 --- a/init/main.c +++ b/init/main.c @@ -265,7 +265,7 @@ static int __init loglevel(char *str) early_param("loglevel", loglevel); #ifdef CONFIG_BLK_DEV_INITRD -static void * __init get_boot_config_from_initrd(u32 *_size) +static void * __init get_boot_config_from_initrd(size_t *_size) { u32 size, csum; char *data; @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; const char *msg; int pos; - u32 size; + size_t size; char *data, *err; int ret; /* Cut out the bootconfig data even if we have no bootconfig option */ data = get_boot_config_from_initrd(&size); + /* If there is no bootconfig in initrd, try embedded one. */ + if (!data) + data = xbc_get_embedded_bootconfig(&size); strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) } if (size >= XBC_DATA_MAX) { - pr_err("bootconfig size %d greater than max size %d\n", - size, XBC_DATA_MAX); + pr_err("bootconfig size %ld greater than max size %d\n", + (long)size, XBC_DATA_MAX); return; } @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) msg, pos); } else { xbc_get_info(&ret, NULL); - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); /* keys starting with "kernel." are passed via cmdline */ extra_command_line = xbc_make_cmdline("kernel"); /* Also, "init." keys are init arguments */ diff --git a/lib/.gitignore b/lib/.gitignore index e5e217b8307b..30a2a5db7033 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -6,3 +6,4 @@ /oid_registry_data.c /test_fortify.log /test_fortify/*.log +/default.bconf diff --git a/lib/Makefile b/lib/Makefile index 300f569c626b..8183785ee99d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) lib-$(CONFIG_LIBFDT) += $(libfdt_files) +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) +# Since the specified bootconfig file can be switched, we forcibly update the +# default.bconf file always. +$(obj)/default.bconf: FORCE + $(call cmd,defbconf) + +quiet_cmd_defbconf = GEN $@ + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ +clean-files += default.bconf +$(obj)/bootconfig.o: $(obj)/default.bconf +endif + lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o diff --git a/lib/bootconfig.c b/lib/bootconfig.c index 74f3201ab8e5..3a3bf3a208e3 100644 --- a/lib/bootconfig.c +++ b/lib/bootconfig.c @@ -12,6 +12,29 @@ #include <linux/kernel.h> #include <linux/memblock.h> #include <linux/string.h> + +#ifdef CONFIG_EMBED_BOOT_CONFIG +asm ( +" .pushsection .init.data, \"aw\" \n" +" .global embedded_bootconfig_data \n" +"embedded_bootconfig_data: \n" +" .incbin \"lib/default.bconf\" \n" +" .global embedded_bootconfig_data_end \n" +"embedded_bootconfig_data_end: \n" +" .popsection \n" +); + +extern __visible char embedded_bootconfig_data[]; +extern __visible char embedded_bootconfig_data_end[]; + +char * __init xbc_get_embedded_bootconfig(size_t *size) +{ + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; + return (*size) ? embedded_bootconfig_data : NULL; +} + +#endif + #else /* !__KERNEL__ */ /* * NOTE: This is only for tools/bootconfig, because tools/bootconfig will ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-14 9:08 ` [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel Masami Hiramatsu @ 2022-03-16 19:16 ` Padmanabha Srinivasaiah 2022-03-18 1:14 ` Masami Hiramatsu 0 siblings, 1 reply; 20+ messages in thread From: Padmanabha Srinivasaiah @ 2022-03-16 19:16 UTC (permalink / raw) To: Masami Hiramatsu Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap Hello Masami Hiramatsu, On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > This allows kernel developer to embed a default bootconfig file in > the kernel instead of embedding it in the initrd. This will be good > for who are using the kernel without initrd, or who needs a default > bootconfigs. > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > Note that you still need 'bootconfig' command line option to load the > embedded bootconfig. Also if you boot using an initrd with a different > bootconfig, the kernel will use the bootconfig in the initrd, instead > of the default bootconfig. > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > --- > include/linux/bootconfig.h | 10 ++++++++++ > init/Kconfig | 21 +++++++++++++++++++++ > init/main.c | 13 ++++++++----- > lib/.gitignore | 1 + > lib/Makefile | 12 ++++++++++++ > lib/bootconfig.c | 23 +++++++++++++++++++++++ > 6 files changed, 75 insertions(+), 5 deletions(-) > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > index a4665c7ab07c..5dbda5e3e9bb 100644 > --- a/include/linux/bootconfig.h > +++ b/include/linux/bootconfig.h > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > /* XBC cleanup data structures */ > void __init xbc_exit(void); > > +/* XBC embedded bootconfig data in kernel */ > +#ifdef CONFIG_EMBED_BOOT_CONFIG > +char * __init xbc_get_embedded_bootconfig(size_t *size); > +#else > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > +{ > + return NULL; > +} > +#endif > + > #endif > diff --git a/init/Kconfig b/init/Kconfig > index e9119bf54b1f..70440804874d 100644 > --- a/init/Kconfig > +++ b/init/Kconfig > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > If unsure, say Y. > > +config EMBED_BOOT_CONFIG > + bool "Embed bootconfig file in the kernel" > + depends on BOOT_CONFIG > + default n > + help > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > + kernel. Usually, the bootconfig file is loaded with the initrd > + image. But if the system doesn't support initrd, this option will > + help you by embedding a bootconfig file while building the kernel. > + > + If unsure, say N. > + > +config EMBED_BOOT_CONFIG_FILE > + string "Embedded bootconfig file path" > + default "" > + depends on EMBED_BOOT_CONFIG > + help > + Specify a bootconfig file which will be embedded to the kernel. > + This bootconfig will be used if there is no initrd or no other > + bootconfig in the initrd. > + > choice > prompt "Compiler optimization level" > default CC_OPTIMIZE_FOR_PERFORMANCE > diff --git a/init/main.c b/init/main.c > index 421050be5039..3803bf2e22ea 100644 > --- a/init/main.c > +++ b/init/main.c > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > early_param("loglevel", loglevel); > > #ifdef CONFIG_BLK_DEV_INITRD > -static void * __init get_boot_config_from_initrd(u32 *_size) > +static void * __init get_boot_config_from_initrd(size_t *_size) > { > u32 size, csum; > char *data; > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > const char *msg; > int pos; > - u32 size; > + size_t size; > char *data, *err; > int ret; > > /* Cut out the bootconfig data even if we have no bootconfig option */ > data = get_boot_config_from_initrd(&size); > + /* If there is no bootconfig in initrd, try embedded one. */ > + if (!data) > + data = xbc_get_embedded_bootconfig(&size); > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > } > > if (size >= XBC_DATA_MAX) { > - pr_err("bootconfig size %d greater than max size %d\n", > - size, XBC_DATA_MAX); > + pr_err("bootconfig size %ld greater than max size %d\n", > + (long)size, XBC_DATA_MAX); > return; > } > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > msg, pos); > } else { > xbc_get_info(&ret, NULL); > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > /* keys starting with "kernel." are passed via cmdline */ > extra_command_line = xbc_make_cmdline("kernel"); > /* Also, "init." keys are init arguments */ > diff --git a/lib/.gitignore b/lib/.gitignore > index e5e217b8307b..30a2a5db7033 100644 > --- a/lib/.gitignore > +++ b/lib/.gitignore > @@ -6,3 +6,4 @@ > /oid_registry_data.c > /test_fortify.log > /test_fortify/*.log > +/default.bconf > diff --git a/lib/Makefile b/lib/Makefile > index 300f569c626b..8183785ee99d 100644 > --- a/lib/Makefile > +++ b/lib/Makefile > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > +# Since the specified bootconfig file can be switched, we forcibly update the > +# default.bconf file always. > +$(obj)/default.bconf: FORCE > + $(call cmd,defbconf) > + > +quiet_cmd_defbconf = GEN $@ > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > +clean-files += default.bconf > +$(obj)/bootconfig.o: $(obj)/default.bconf > +endif > + > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > index 74f3201ab8e5..3a3bf3a208e3 100644 > --- a/lib/bootconfig.c > +++ b/lib/bootconfig.c > @@ -12,6 +12,29 @@ > #include <linux/kernel.h> > #include <linux/memblock.h> > #include <linux/string.h> > + > +#ifdef CONFIG_EMBED_BOOT_CONFIG > +asm ( > +" .pushsection .init.data, \"aw\" \n" > +" .global embedded_bootconfig_data \n" > +"embedded_bootconfig_data: \n" > +" .incbin \"lib/default.bconf\" \n" > +" .global embedded_bootconfig_data_end \n" > +"embedded_bootconfig_data_end: \n" > +" .popsection \n" > +); > + > +extern __visible char embedded_bootconfig_data[]; > +extern __visible char embedded_bootconfig_data_end[]; > + > +char * __init xbc_get_embedded_bootconfig(size_t *size) > +{ > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > + return (*size) ? embedded_bootconfig_data : NULL; > +} > + > +#endif > + > #else /* !__KERNEL__ */ > /* > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > Thanks tested the implemation, it works as expected. Also noted that a change in default.bconf requries a clean build, is it expected behaviour? Thanks and Regards, Padmanabha.S ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-16 19:16 ` Padmanabha Srinivasaiah @ 2022-03-18 1:14 ` Masami Hiramatsu 2022-03-21 18:35 ` Padmanabha Srinivasaiah 2022-03-26 2:34 ` Masahiro Yamada 0 siblings, 2 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-18 1:14 UTC (permalink / raw) To: Padmanabha Srinivasaiah Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap On Wed, 16 Mar 2022 20:16:49 +0100 Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > Hello Masami Hiramatsu, > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > This allows kernel developer to embed a default bootconfig file in > > the kernel instead of embedding it in the initrd. This will be good > > for who are using the kernel without initrd, or who needs a default > > bootconfigs. > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > Note that you still need 'bootconfig' command line option to load the > > embedded bootconfig. Also if you boot using an initrd with a different > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > of the default bootconfig. > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > --- > > include/linux/bootconfig.h | 10 ++++++++++ > > init/Kconfig | 21 +++++++++++++++++++++ > > init/main.c | 13 ++++++++----- > > lib/.gitignore | 1 + > > lib/Makefile | 12 ++++++++++++ > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > --- a/include/linux/bootconfig.h > > +++ b/include/linux/bootconfig.h > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > /* XBC cleanup data structures */ > > void __init xbc_exit(void); > > > > +/* XBC embedded bootconfig data in kernel */ > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > +#else > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > +{ > > + return NULL; > > +} > > +#endif > > + > > #endif > > diff --git a/init/Kconfig b/init/Kconfig > > index e9119bf54b1f..70440804874d 100644 > > --- a/init/Kconfig > > +++ b/init/Kconfig > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > If unsure, say Y. > > > > +config EMBED_BOOT_CONFIG > > + bool "Embed bootconfig file in the kernel" > > + depends on BOOT_CONFIG > > + default n > > + help > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > + kernel. Usually, the bootconfig file is loaded with the initrd > > + image. But if the system doesn't support initrd, this option will > > + help you by embedding a bootconfig file while building the kernel. > > + > > + If unsure, say N. > > + > > +config EMBED_BOOT_CONFIG_FILE > > + string "Embedded bootconfig file path" > > + default "" > > + depends on EMBED_BOOT_CONFIG > > + help > > + Specify a bootconfig file which will be embedded to the kernel. > > + This bootconfig will be used if there is no initrd or no other > > + bootconfig in the initrd. > > + > > choice > > prompt "Compiler optimization level" > > default CC_OPTIMIZE_FOR_PERFORMANCE > > diff --git a/init/main.c b/init/main.c > > index 421050be5039..3803bf2e22ea 100644 > > --- a/init/main.c > > +++ b/init/main.c > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > early_param("loglevel", loglevel); > > > > #ifdef CONFIG_BLK_DEV_INITRD > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > { > > u32 size, csum; > > char *data; > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > const char *msg; > > int pos; > > - u32 size; > > + size_t size; > > char *data, *err; > > int ret; > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > data = get_boot_config_from_initrd(&size); > > + /* If there is no bootconfig in initrd, try embedded one. */ > > + if (!data) > > + data = xbc_get_embedded_bootconfig(&size); > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > } > > > > if (size >= XBC_DATA_MAX) { > > - pr_err("bootconfig size %d greater than max size %d\n", > > - size, XBC_DATA_MAX); > > + pr_err("bootconfig size %ld greater than max size %d\n", > > + (long)size, XBC_DATA_MAX); > > return; > > } > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > msg, pos); > > } else { > > xbc_get_info(&ret, NULL); > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > /* keys starting with "kernel." are passed via cmdline */ > > extra_command_line = xbc_make_cmdline("kernel"); > > /* Also, "init." keys are init arguments */ > > diff --git a/lib/.gitignore b/lib/.gitignore > > index e5e217b8307b..30a2a5db7033 100644 > > --- a/lib/.gitignore > > +++ b/lib/.gitignore > > @@ -6,3 +6,4 @@ > > /oid_registry_data.c > > /test_fortify.log > > /test_fortify/*.log > > +/default.bconf > > diff --git a/lib/Makefile b/lib/Makefile > > index 300f569c626b..8183785ee99d 100644 > > --- a/lib/Makefile > > +++ b/lib/Makefile > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > +# Since the specified bootconfig file can be switched, we forcibly update the > > +# default.bconf file always. > > +$(obj)/default.bconf: FORCE > > + $(call cmd,defbconf) > > + > > +quiet_cmd_defbconf = GEN $@ > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > +clean-files += default.bconf > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > +endif > > + > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > --- a/lib/bootconfig.c > > +++ b/lib/bootconfig.c > > @@ -12,6 +12,29 @@ > > #include <linux/kernel.h> > > #include <linux/memblock.h> > > #include <linux/string.h> > > + > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > +asm ( > > +" .pushsection .init.data, \"aw\" \n" > > +" .global embedded_bootconfig_data \n" > > +"embedded_bootconfig_data: \n" > > +" .incbin \"lib/default.bconf\" \n" > > +" .global embedded_bootconfig_data_end \n" > > +"embedded_bootconfig_data_end: \n" > > +" .popsection \n" > > +); > > + > > +extern __visible char embedded_bootconfig_data[]; > > +extern __visible char embedded_bootconfig_data_end[]; > > + > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > +{ > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > + return (*size) ? embedded_bootconfig_data : NULL; > > +} > > + > > +#endif > > + > > #else /* !__KERNEL__ */ > > /* > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > Thanks tested the implemation, it works as expected. Great! > > Also noted that a change in default.bconf requries a clean build, is it > expected behaviour? default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can do incremental build. (I tested it with the incremental build environment) Thank you, > > Thanks and Regards, > Padmanabha.S -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-18 1:14 ` Masami Hiramatsu @ 2022-03-21 18:35 ` Padmanabha Srinivasaiah 2022-03-22 3:03 ` Masami Hiramatsu 2022-03-26 2:34 ` Masahiro Yamada 1 sibling, 1 reply; 20+ messages in thread From: Padmanabha Srinivasaiah @ 2022-03-21 18:35 UTC (permalink / raw) To: Masami Hiramatsu Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap Hello Masami Hiramatsu, On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > On Wed, 16 Mar 2022 20:16:49 +0100 > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > Hello Masami Hiramatsu, > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > This allows kernel developer to embed a default bootconfig file in > > > the kernel instead of embedding it in the initrd. This will be good > > > for who are using the kernel without initrd, or who needs a default > > > bootconfigs. > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > Note that you still need 'bootconfig' command line option to load the > > > embedded bootconfig. Also if you boot using an initrd with a different > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > of the default bootconfig. > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > --- > > > include/linux/bootconfig.h | 10 ++++++++++ > > > init/Kconfig | 21 +++++++++++++++++++++ > > > init/main.c | 13 ++++++++----- > > > lib/.gitignore | 1 + > > > lib/Makefile | 12 ++++++++++++ > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > --- a/include/linux/bootconfig.h > > > +++ b/include/linux/bootconfig.h > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > /* XBC cleanup data structures */ > > > void __init xbc_exit(void); > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > +#else > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > +{ > > > + return NULL; > > > +} > > > +#endif > > > + > > > #endif > > > diff --git a/init/Kconfig b/init/Kconfig > > > index e9119bf54b1f..70440804874d 100644 > > > --- a/init/Kconfig > > > +++ b/init/Kconfig > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > If unsure, say Y. > > > > > > +config EMBED_BOOT_CONFIG > > > + bool "Embed bootconfig file in the kernel" > > > + depends on BOOT_CONFIG > > > + default n > > > + help > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > + image. But if the system doesn't support initrd, this option will > > > + help you by embedding a bootconfig file while building the kernel. > > > + > > > + If unsure, say N. > > > + > > > +config EMBED_BOOT_CONFIG_FILE > > > + string "Embedded bootconfig file path" > > > + default "" > > > + depends on EMBED_BOOT_CONFIG > > > + help > > > + Specify a bootconfig file which will be embedded to the kernel. > > > + This bootconfig will be used if there is no initrd or no other > > > + bootconfig in the initrd. > > > + > > > choice > > > prompt "Compiler optimization level" > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > diff --git a/init/main.c b/init/main.c > > > index 421050be5039..3803bf2e22ea 100644 > > > --- a/init/main.c > > > +++ b/init/main.c > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > early_param("loglevel", loglevel); > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > { > > > u32 size, csum; > > > char *data; > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > const char *msg; > > > int pos; > > > - u32 size; > > > + size_t size; > > > char *data, *err; > > > int ret; > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > data = get_boot_config_from_initrd(&size); > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > + if (!data) > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > } > > > > > > if (size >= XBC_DATA_MAX) { > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > - size, XBC_DATA_MAX); > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > + (long)size, XBC_DATA_MAX); > > > return; > > > } > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > msg, pos); > > > } else { > > > xbc_get_info(&ret, NULL); > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > /* keys starting with "kernel." are passed via cmdline */ > > > extra_command_line = xbc_make_cmdline("kernel"); > > > /* Also, "init." keys are init arguments */ > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > index e5e217b8307b..30a2a5db7033 100644 > > > --- a/lib/.gitignore > > > +++ b/lib/.gitignore > > > @@ -6,3 +6,4 @@ > > > /oid_registry_data.c > > > /test_fortify.log > > > /test_fortify/*.log > > > +/default.bconf > > > diff --git a/lib/Makefile b/lib/Makefile > > > index 300f569c626b..8183785ee99d 100644 > > > --- a/lib/Makefile > > > +++ b/lib/Makefile > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > +# default.bconf file always. > > > +$(obj)/default.bconf: FORCE > > > + $(call cmd,defbconf) > > > + > > > +quiet_cmd_defbconf = GEN $@ > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > +clean-files += default.bconf > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > +endif > > > + > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > --- a/lib/bootconfig.c > > > +++ b/lib/bootconfig.c > > > @@ -12,6 +12,29 @@ > > > #include <linux/kernel.h> > > > #include <linux/memblock.h> > > > #include <linux/string.h> > > > + > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > +asm ( > > > +" .pushsection .init.data, \"aw\" \n" > > > +" .global embedded_bootconfig_data \n" > > > +"embedded_bootconfig_data: \n" > > > +" .incbin \"lib/default.bconf\" \n" > > > +" .global embedded_bootconfig_data_end \n" > > > +"embedded_bootconfig_data_end: \n" > > > +" .popsection \n" > > > +); > > > + > > > +extern __visible char embedded_bootconfig_data[]; > > > +extern __visible char embedded_bootconfig_data_end[]; > > > + > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > +{ > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > +} > > > + > > > +#endif > > > + > > > #else /* !__KERNEL__ */ > > > /* > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > Thanks tested the implemation, it works as expected. > > Great! > > > > > Also noted that a change in default.bconf requries a clean build, is it > > expected behaviour? > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > do incremental build. (I tested it with the incremental build environment) > Thanks, your observation made me to further experiment ther incremental build. Below are the observations I have: When I use GCC for a build; yes, the modified default.conf was observed on the target. But when I use clang; either with FULL or THIN LTO, the modified default.conf doesnt get reflected on the target. PS: Using: GCC version 8.2.1 20180802, LLVM version 13.0.2git. Thank you, Padmanabha.S > Thank you, > > > > > Thanks and Regards, > > Padmanabha.S > > > -- > Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-21 18:35 ` Padmanabha Srinivasaiah @ 2022-03-22 3:03 ` Masami Hiramatsu 2022-03-22 19:02 ` Padmanabha Srinivasaiah 0 siblings, 1 reply; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-22 3:03 UTC (permalink / raw) To: Padmanabha Srinivasaiah Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap On Mon, 21 Mar 2022 19:35:00 +0100 Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > Hello Masami Hiramatsu, > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > On Wed, 16 Mar 2022 20:16:49 +0100 > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > Hello Masami Hiramatsu, > > > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > > This allows kernel developer to embed a default bootconfig file in > > > > the kernel instead of embedding it in the initrd. This will be good > > > > for who are using the kernel without initrd, or who needs a default > > > > bootconfigs. > > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > > > Note that you still need 'bootconfig' command line option to load the > > > > embedded bootconfig. Also if you boot using an initrd with a different > > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > > of the default bootconfig. > > > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > > --- > > > > include/linux/bootconfig.h | 10 ++++++++++ > > > > init/Kconfig | 21 +++++++++++++++++++++ > > > > init/main.c | 13 ++++++++----- > > > > lib/.gitignore | 1 + > > > > lib/Makefile | 12 ++++++++++++ > > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > > --- a/include/linux/bootconfig.h > > > > +++ b/include/linux/bootconfig.h > > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > > /* XBC cleanup data structures */ > > > > void __init xbc_exit(void); > > > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > > +#else > > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > > +{ > > > > + return NULL; > > > > +} > > > > +#endif > > > > + > > > > #endif > > > > diff --git a/init/Kconfig b/init/Kconfig > > > > index e9119bf54b1f..70440804874d 100644 > > > > --- a/init/Kconfig > > > > +++ b/init/Kconfig > > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > > > If unsure, say Y. > > > > > > > > +config EMBED_BOOT_CONFIG > > > > + bool "Embed bootconfig file in the kernel" > > > > + depends on BOOT_CONFIG > > > > + default n > > > > + help > > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > > + image. But if the system doesn't support initrd, this option will > > > > + help you by embedding a bootconfig file while building the kernel. > > > > + > > > > + If unsure, say N. > > > > + > > > > +config EMBED_BOOT_CONFIG_FILE > > > > + string "Embedded bootconfig file path" > > > > + default "" > > > > + depends on EMBED_BOOT_CONFIG > > > > + help > > > > + Specify a bootconfig file which will be embedded to the kernel. > > > > + This bootconfig will be used if there is no initrd or no other > > > > + bootconfig in the initrd. > > > > + > > > > choice > > > > prompt "Compiler optimization level" > > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > > diff --git a/init/main.c b/init/main.c > > > > index 421050be5039..3803bf2e22ea 100644 > > > > --- a/init/main.c > > > > +++ b/init/main.c > > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > > early_param("loglevel", loglevel); > > > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > > { > > > > u32 size, csum; > > > > char *data; > > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > > const char *msg; > > > > int pos; > > > > - u32 size; > > > > + size_t size; > > > > char *data, *err; > > > > int ret; > > > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > > data = get_boot_config_from_initrd(&size); > > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > > + if (!data) > > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > > } > > > > > > > > if (size >= XBC_DATA_MAX) { > > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > > - size, XBC_DATA_MAX); > > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > > + (long)size, XBC_DATA_MAX); > > > > return; > > > > } > > > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > > msg, pos); > > > > } else { > > > > xbc_get_info(&ret, NULL); > > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > > /* keys starting with "kernel." are passed via cmdline */ > > > > extra_command_line = xbc_make_cmdline("kernel"); > > > > /* Also, "init." keys are init arguments */ > > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > > index e5e217b8307b..30a2a5db7033 100644 > > > > --- a/lib/.gitignore > > > > +++ b/lib/.gitignore > > > > @@ -6,3 +6,4 @@ > > > > /oid_registry_data.c > > > > /test_fortify.log > > > > /test_fortify/*.log > > > > +/default.bconf > > > > diff --git a/lib/Makefile b/lib/Makefile > > > > index 300f569c626b..8183785ee99d 100644 > > > > --- a/lib/Makefile > > > > +++ b/lib/Makefile > > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > > +# default.bconf file always. > > > > +$(obj)/default.bconf: FORCE > > > > + $(call cmd,defbconf) > > > > + > > > > +quiet_cmd_defbconf = GEN $@ > > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > > +clean-files += default.bconf > > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > > +endif > > > > + > > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > > --- a/lib/bootconfig.c > > > > +++ b/lib/bootconfig.c > > > > @@ -12,6 +12,29 @@ > > > > #include <linux/kernel.h> > > > > #include <linux/memblock.h> > > > > #include <linux/string.h> > > > > + > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > +asm ( > > > > +" .pushsection .init.data, \"aw\" \n" > > > > +" .global embedded_bootconfig_data \n" > > > > +"embedded_bootconfig_data: \n" > > > > +" .incbin \"lib/default.bconf\" \n" > > > > +" .global embedded_bootconfig_data_end \n" > > > > +"embedded_bootconfig_data_end: \n" > > > > +" .popsection \n" > > > > +); > > > > + > > > > +extern __visible char embedded_bootconfig_data[]; > > > > +extern __visible char embedded_bootconfig_data_end[]; > > > > + > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > > +{ > > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > > +} > > > > + > > > > +#endif > > > > + > > > > #else /* !__KERNEL__ */ > > > > /* > > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > > > > Thanks tested the implemation, it works as expected. > > > > Great! > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > expected behaviour? > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > do incremental build. (I tested it with the incremental build environment) > > > > Thanks, your observation made me to further experiment ther incremental build. > > Below are the observations I have: > > When I use GCC for a build; yes, the modified default.conf was observed on > the target. > > But when I use clang; either with FULL or THIN LTO, the modified > default.conf doesnt get reflected on the target. Hmm, curious. So you just add 'CC=clang' on the make command line, right? Can you confirm that following line in your build log, GEN lib/default.bconf and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? Thank you, > > PS: Using: GCC version 8.2.1 20180802, LLVM version 13.0.2git. > > Thank you, > Padmanabha.S > > Thank you, > > > > > > > > Thanks and Regards, > > > Padmanabha.S > > > > > > -- > > Masami Hiramatsu <mhiramat@kernel.org> -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-22 3:03 ` Masami Hiramatsu @ 2022-03-22 19:02 ` Padmanabha Srinivasaiah 2022-03-23 0:16 ` Masami Hiramatsu 0 siblings, 1 reply; 20+ messages in thread From: Padmanabha Srinivasaiah @ 2022-03-22 19:02 UTC (permalink / raw) To: Masami Hiramatsu Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap Hello Masami Hiramatsu, On Tue, Mar 22, 2022 at 12:03:11PM +0900, Masami Hiramatsu wrote: > On Mon, 21 Mar 2022 19:35:00 +0100 > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > Hello Masami Hiramatsu, > > > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > Hello Masami Hiramatsu, > > > > > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > > > This allows kernel developer to embed a default bootconfig file in > > > > > the kernel instead of embedding it in the initrd. This will be good > > > > > for who are using the kernel without initrd, or who needs a default > > > > > bootconfigs. > > > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > > > > > Note that you still need 'bootconfig' command line option to load the > > > > > embedded bootconfig. Also if you boot using an initrd with a different > > > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > > > of the default bootconfig. > > > > > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > > > --- > > > > > include/linux/bootconfig.h | 10 ++++++++++ > > > > > init/Kconfig | 21 +++++++++++++++++++++ > > > > > init/main.c | 13 ++++++++----- > > > > > lib/.gitignore | 1 + > > > > > lib/Makefile | 12 ++++++++++++ > > > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > > > --- a/include/linux/bootconfig.h > > > > > +++ b/include/linux/bootconfig.h > > > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > > > /* XBC cleanup data structures */ > > > > > void __init xbc_exit(void); > > > > > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > > > +#else > > > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > > > +{ > > > > > + return NULL; > > > > > +} > > > > > +#endif > > > > > + > > > > > #endif > > > > > diff --git a/init/Kconfig b/init/Kconfig > > > > > index e9119bf54b1f..70440804874d 100644 > > > > > --- a/init/Kconfig > > > > > +++ b/init/Kconfig > > > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > > > > > If unsure, say Y. > > > > > > > > > > +config EMBED_BOOT_CONFIG > > > > > + bool "Embed bootconfig file in the kernel" > > > > > + depends on BOOT_CONFIG > > > > > + default n > > > > > + help > > > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > > > + image. But if the system doesn't support initrd, this option will > > > > > + help you by embedding a bootconfig file while building the kernel. > > > > > + > > > > > + If unsure, say N. > > > > > + > > > > > +config EMBED_BOOT_CONFIG_FILE > > > > > + string "Embedded bootconfig file path" > > > > > + default "" > > > > > + depends on EMBED_BOOT_CONFIG > > > > > + help > > > > > + Specify a bootconfig file which will be embedded to the kernel. > > > > > + This bootconfig will be used if there is no initrd or no other > > > > > + bootconfig in the initrd. > > > > > + > > > > > choice > > > > > prompt "Compiler optimization level" > > > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > > > diff --git a/init/main.c b/init/main.c > > > > > index 421050be5039..3803bf2e22ea 100644 > > > > > --- a/init/main.c > > > > > +++ b/init/main.c > > > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > > > early_param("loglevel", loglevel); > > > > > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > > > { > > > > > u32 size, csum; > > > > > char *data; > > > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > > > const char *msg; > > > > > int pos; > > > > > - u32 size; > > > > > + size_t size; > > > > > char *data, *err; > > > > > int ret; > > > > > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > > > data = get_boot_config_from_initrd(&size); > > > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > > > + if (!data) > > > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > > > } > > > > > > > > > > if (size >= XBC_DATA_MAX) { > > > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > > > - size, XBC_DATA_MAX); > > > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > > > + (long)size, XBC_DATA_MAX); > > > > > return; > > > > > } > > > > > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > > > msg, pos); > > > > > } else { > > > > > xbc_get_info(&ret, NULL); > > > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > > > /* keys starting with "kernel." are passed via cmdline */ > > > > > extra_command_line = xbc_make_cmdline("kernel"); > > > > > /* Also, "init." keys are init arguments */ > > > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > > > index e5e217b8307b..30a2a5db7033 100644 > > > > > --- a/lib/.gitignore > > > > > +++ b/lib/.gitignore > > > > > @@ -6,3 +6,4 @@ > > > > > /oid_registry_data.c > > > > > /test_fortify.log > > > > > /test_fortify/*.log > > > > > +/default.bconf > > > > > diff --git a/lib/Makefile b/lib/Makefile > > > > > index 300f569c626b..8183785ee99d 100644 > > > > > --- a/lib/Makefile > > > > > +++ b/lib/Makefile > > > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > > > +# default.bconf file always. > > > > > +$(obj)/default.bconf: FORCE > > > > > + $(call cmd,defbconf) > > > > > + > > > > > +quiet_cmd_defbconf = GEN $@ > > > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > > > +clean-files += default.bconf > > > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > > > +endif > > > > > + > > > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > > > --- a/lib/bootconfig.c > > > > > +++ b/lib/bootconfig.c > > > > > @@ -12,6 +12,29 @@ > > > > > #include <linux/kernel.h> > > > > > #include <linux/memblock.h> > > > > > #include <linux/string.h> > > > > > + > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > +asm ( > > > > > +" .pushsection .init.data, \"aw\" \n" > > > > > +" .global embedded_bootconfig_data \n" > > > > > +"embedded_bootconfig_data: \n" > > > > > +" .incbin \"lib/default.bconf\" \n" > > > > > +" .global embedded_bootconfig_data_end \n" > > > > > +"embedded_bootconfig_data_end: \n" > > > > > +" .popsection \n" > > > > > +); > > > > > + > > > > > +extern __visible char embedded_bootconfig_data[]; > > > > > +extern __visible char embedded_bootconfig_data_end[]; > > > > > + > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > > > +{ > > > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > > > +} > > > > > + > > > > > +#endif > > > > > + > > > > > #else /* !__KERNEL__ */ > > > > > /* > > > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > > > > > > > Thanks tested the implemation, it works as expected. > > > > > > Great! > > > > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > > expected behaviour? > > > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > > do incremental build. (I tested it with the incremental build environment) > > > > > > > Thanks, your observation made me to further experiment ther incremental build. > > > > Below are the observations I have: > > > > When I use GCC for a build; yes, the modified default.conf was observed on > > the target. > > > > But when I use clang; either with FULL or THIN LTO, the modified > > default.conf doesnt get reflected on the target. > > Hmm, curious. So you just add 'CC=clang' on the make command line, right? Yes, CC=clang ARCH=arm64 LLVM=1. As specified here: https://docs.kernel.org/kbuild/llvm.html. > Can you confirm that following line in your build log, > > GEN lib/default.bconf > Yes, I do see above line. Indeed lib/default.bconf will get incremental change. GEN lib/default.bconf CC lib/bootconfig.o AR lib/lib.a > and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? > Yes, verified timestamp for all above artifacts including vmlinux.o. ex: -rw-rw-r-- 1 psrinivasaia psrinivasaia 22K Mar 22 14:50 ../out/lib/bootconfig.o -rw-rw-r-- 1 psrinivasaia psrinivasaia 355 Mar 22 14:50 ../out/lib/default.bconf -rw-rw-r-- 1 psrinivasaia psrinivasaia 54M Mar 22 14:50 ../out/vmlinux.o As said incremnetal change was refelected in artifact default.bconf. But not in vmlinux.o/vmlinux, used below command to verify. llvm-objdump -s -j .init.data ../out/vmlinux On target too, /proc/bootconfig shows old data. > And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? > Yes; CONFIG_LTO_NONE=y issue not observed even with LLVM binutils. Thanks and Regards, Padmanabha.S > Thank you, > > > > > PS: Using: GCC version 8.2.1 20180802, LLVM version 13.0.2git. > > > > Thank you, > > Padmanabha.S > > > Thank you, > > > > > > > > > > > Thanks and Regards, > > > > Padmanabha.S > > > > > > > > > -- > > > Masami Hiramatsu <mhiramat@kernel.org> > > > -- > Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-22 19:02 ` Padmanabha Srinivasaiah @ 2022-03-23 0:16 ` Masami Hiramatsu 2022-03-23 15:56 ` Padmanabha Srinivasaiah 2022-03-23 17:11 ` Nick Desaulniers 0 siblings, 2 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-23 0:16 UTC (permalink / raw) To: Padmanabha Srinivasaiah Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap, Nathan Chancellor, Nick Desaulniers, llvm On Tue, 22 Mar 2022 20:02:19 +0100 Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > Hello Masami Hiramatsu, > > On Tue, Mar 22, 2022 at 12:03:11PM +0900, Masami Hiramatsu wrote: > > On Mon, 21 Mar 2022 19:35:00 +0100 > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > Hello Masami Hiramatsu, > > > > > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > > > > This allows kernel developer to embed a default bootconfig file in > > > > > > the kernel instead of embedding it in the initrd. This will be good > > > > > > for who are using the kernel without initrd, or who needs a default > > > > > > bootconfigs. > > > > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > > > > > > > Note that you still need 'bootconfig' command line option to load the > > > > > > embedded bootconfig. Also if you boot using an initrd with a different > > > > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > > > > of the default bootconfig. > > > > > > > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > > > > --- > > > > > > include/linux/bootconfig.h | 10 ++++++++++ > > > > > > init/Kconfig | 21 +++++++++++++++++++++ > > > > > > init/main.c | 13 ++++++++----- > > > > > > lib/.gitignore | 1 + > > > > > > lib/Makefile | 12 ++++++++++++ > > > > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > > > > --- a/include/linux/bootconfig.h > > > > > > +++ b/include/linux/bootconfig.h > > > > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > > > > /* XBC cleanup data structures */ > > > > > > void __init xbc_exit(void); > > > > > > > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > > > > +#else > > > > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > > > > +{ > > > > > > + return NULL; > > > > > > +} > > > > > > +#endif > > > > > > + > > > > > > #endif > > > > > > diff --git a/init/Kconfig b/init/Kconfig > > > > > > index e9119bf54b1f..70440804874d 100644 > > > > > > --- a/init/Kconfig > > > > > > +++ b/init/Kconfig > > > > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > > > > > > > If unsure, say Y. > > > > > > > > > > > > +config EMBED_BOOT_CONFIG > > > > > > + bool "Embed bootconfig file in the kernel" > > > > > > + depends on BOOT_CONFIG > > > > > > + default n > > > > > > + help > > > > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > > > > + image. But if the system doesn't support initrd, this option will > > > > > > + help you by embedding a bootconfig file while building the kernel. > > > > > > + > > > > > > + If unsure, say N. > > > > > > + > > > > > > +config EMBED_BOOT_CONFIG_FILE > > > > > > + string "Embedded bootconfig file path" > > > > > > + default "" > > > > > > + depends on EMBED_BOOT_CONFIG > > > > > > + help > > > > > > + Specify a bootconfig file which will be embedded to the kernel. > > > > > > + This bootconfig will be used if there is no initrd or no other > > > > > > + bootconfig in the initrd. > > > > > > + > > > > > > choice > > > > > > prompt "Compiler optimization level" > > > > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > > > > diff --git a/init/main.c b/init/main.c > > > > > > index 421050be5039..3803bf2e22ea 100644 > > > > > > --- a/init/main.c > > > > > > +++ b/init/main.c > > > > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > > > > early_param("loglevel", loglevel); > > > > > > > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > > > > { > > > > > > u32 size, csum; > > > > > > char *data; > > > > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > > > > const char *msg; > > > > > > int pos; > > > > > > - u32 size; > > > > > > + size_t size; > > > > > > char *data, *err; > > > > > > int ret; > > > > > > > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > > > > data = get_boot_config_from_initrd(&size); > > > > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > > > > + if (!data) > > > > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > > > > } > > > > > > > > > > > > if (size >= XBC_DATA_MAX) { > > > > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > > > > - size, XBC_DATA_MAX); > > > > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > > > > + (long)size, XBC_DATA_MAX); > > > > > > return; > > > > > > } > > > > > > > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > > > > msg, pos); > > > > > > } else { > > > > > > xbc_get_info(&ret, NULL); > > > > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > > > > /* keys starting with "kernel." are passed via cmdline */ > > > > > > extra_command_line = xbc_make_cmdline("kernel"); > > > > > > /* Also, "init." keys are init arguments */ > > > > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > > > > index e5e217b8307b..30a2a5db7033 100644 > > > > > > --- a/lib/.gitignore > > > > > > +++ b/lib/.gitignore > > > > > > @@ -6,3 +6,4 @@ > > > > > > /oid_registry_data.c > > > > > > /test_fortify.log > > > > > > /test_fortify/*.log > > > > > > +/default.bconf > > > > > > diff --git a/lib/Makefile b/lib/Makefile > > > > > > index 300f569c626b..8183785ee99d 100644 > > > > > > --- a/lib/Makefile > > > > > > +++ b/lib/Makefile > > > > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > > > > +# default.bconf file always. > > > > > > +$(obj)/default.bconf: FORCE > > > > > > + $(call cmd,defbconf) > > > > > > + > > > > > > +quiet_cmd_defbconf = GEN $@ > > > > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > > > > +clean-files += default.bconf > > > > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > > > > +endif > > > > > > + > > > > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > > > > --- a/lib/bootconfig.c > > > > > > +++ b/lib/bootconfig.c > > > > > > @@ -12,6 +12,29 @@ > > > > > > #include <linux/kernel.h> > > > > > > #include <linux/memblock.h> > > > > > > #include <linux/string.h> > > > > > > + > > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > > +asm ( > > > > > > +" .pushsection .init.data, \"aw\" \n" > > > > > > +" .global embedded_bootconfig_data \n" > > > > > > +"embedded_bootconfig_data: \n" > > > > > > +" .incbin \"lib/default.bconf\" \n" > > > > > > +" .global embedded_bootconfig_data_end \n" > > > > > > +"embedded_bootconfig_data_end: \n" > > > > > > +" .popsection \n" > > > > > > +); > > > > > > + > > > > > > +extern __visible char embedded_bootconfig_data[]; > > > > > > +extern __visible char embedded_bootconfig_data_end[]; > > > > > > + > > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > > > > +{ > > > > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > > > > +} > > > > > > + > > > > > > +#endif > > > > > > + > > > > > > #else /* !__KERNEL__ */ > > > > > > /* > > > > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > > > > > > > > > > Thanks tested the implemation, it works as expected. > > > > > > > > Great! > > > > > > > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > > > expected behaviour? > > > > > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > > > do incremental build. (I tested it with the incremental build environment) > > > > > > > > > > Thanks, your observation made me to further experiment ther incremental build. > > > > > > Below are the observations I have: > > > > > > When I use GCC for a build; yes, the modified default.conf was observed on > > > the target. > > > > > > But when I use clang; either with FULL or THIN LTO, the modified > > > default.conf doesnt get reflected on the target. > > > > Hmm, curious. So you just add 'CC=clang' on the make command line, right? > Yes, CC=clang ARCH=arm64 LLVM=1. As specified here: > https://docs.kernel.org/kbuild/llvm.html. > > > Can you confirm that following line in your build log, > > > > GEN lib/default.bconf > > > Yes, I do see above line. Indeed lib/default.bconf will get incremental > change. > > GEN lib/default.bconf > CC lib/bootconfig.o > AR lib/lib.a > > > and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? > > > Yes, verified timestamp for all above artifacts including vmlinux.o. > > ex: > -rw-rw-r-- 1 psrinivasaia psrinivasaia 22K Mar 22 14:50 > ../out/lib/bootconfig.o > -rw-rw-r-- 1 psrinivasaia psrinivasaia 355 Mar 22 14:50 > ../out/lib/default.bconf > -rw-rw-r-- 1 psrinivasaia psrinivasaia 54M Mar 22 14:50 ../out/vmlinux.o > > As said incremnetal change was refelected in artifact default.bconf. > But not in vmlinux.o/vmlinux, used below command to verify. Interesting! This sounds clang's issue, because the make command rebuilds the object file including new default.bconf, but the linker (lld?) doesn't link it again correctly. > > llvm-objdump -s -j .init.data ../out/vmlinux > > On target too, /proc/bootconfig shows old data. > > > And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? > > > Yes; CONFIG_LTO_NONE=y issue not observed even with LLVM binutils. And this issue is related to LTO. Maybe LTO ignores the '.init.data' section update. (Perhaps, LTO only checks the function code hash or something like that instead of the timestamp, and ignore whole object file if all of them are not updated.) I've added clang build maintainers. I need their help to solve this issue. Thank you, > > Thanks and Regards, > Padmanabha.S > > Thank you, > > > > > > > > PS: Using: GCC version 8.2.1 20180802, LLVM version 13.0.2git. > > > > > > Thank you, > > > Padmanabha.S > > > > Thank you, > > > > > > > > > > > > > > Thanks and Regards, > > > > > Padmanabha.S > > > > > > > > > > > > -- > > > > Masami Hiramatsu <mhiramat@kernel.org> > > > > > > -- > > Masami Hiramatsu <mhiramat@kernel.org> -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-23 0:16 ` Masami Hiramatsu @ 2022-03-23 15:56 ` Padmanabha Srinivasaiah 2022-03-24 1:05 ` Masami Hiramatsu 2022-03-23 17:11 ` Nick Desaulniers 1 sibling, 1 reply; 20+ messages in thread From: Padmanabha Srinivasaiah @ 2022-03-23 15:56 UTC (permalink / raw) To: Masami Hiramatsu Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap, Nathan Chancellor, Nick Desaulniers, llvm On Wed, Mar 23, 2022 at 09:16:17AM +0900, Masami Hiramatsu wrote: > On Tue, 22 Mar 2022 20:02:19 +0100 > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > Hello Masami Hiramatsu, > > > > On Tue, Mar 22, 2022 at 12:03:11PM +0900, Masami Hiramatsu wrote: > > > On Mon, 21 Mar 2022 19:35:00 +0100 > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > Hello Masami Hiramatsu, > > > > > > > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > > > > > This allows kernel developer to embed a default bootconfig file in > > > > > > > the kernel instead of embedding it in the initrd. This will be good > > > > > > > for who are using the kernel without initrd, or who needs a default > > > > > > > bootconfigs. > > > > > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > > > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > > > > > > > > > Note that you still need 'bootconfig' command line option to load the > > > > > > > embedded bootconfig. Also if you boot using an initrd with a different > > > > > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > > > > > of the default bootconfig. > > > > > > > > > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > > > > > --- > > > > > > > include/linux/bootconfig.h | 10 ++++++++++ > > > > > > > init/Kconfig | 21 +++++++++++++++++++++ > > > > > > > init/main.c | 13 ++++++++----- > > > > > > > lib/.gitignore | 1 + > > > > > > > lib/Makefile | 12 ++++++++++++ > > > > > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > > > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > > > > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > > > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > > > > > --- a/include/linux/bootconfig.h > > > > > > > +++ b/include/linux/bootconfig.h > > > > > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > > > > > /* XBC cleanup data structures */ > > > > > > > void __init xbc_exit(void); > > > > > > > > > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > > > > > +#else > > > > > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > > > > > +{ > > > > > > > + return NULL; > > > > > > > +} > > > > > > > +#endif > > > > > > > + > > > > > > > #endif > > > > > > > diff --git a/init/Kconfig b/init/Kconfig > > > > > > > index e9119bf54b1f..70440804874d 100644 > > > > > > > --- a/init/Kconfig > > > > > > > +++ b/init/Kconfig > > > > > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > > > > > > > > > If unsure, say Y. > > > > > > > > > > > > > > +config EMBED_BOOT_CONFIG > > > > > > > + bool "Embed bootconfig file in the kernel" > > > > > > > + depends on BOOT_CONFIG > > > > > > > + default n > > > > > > > + help > > > > > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > > > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > > > > > + image. But if the system doesn't support initrd, this option will > > > > > > > + help you by embedding a bootconfig file while building the kernel. > > > > > > > + > > > > > > > + If unsure, say N. > > > > > > > + > > > > > > > +config EMBED_BOOT_CONFIG_FILE > > > > > > > + string "Embedded bootconfig file path" > > > > > > > + default "" > > > > > > > + depends on EMBED_BOOT_CONFIG > > > > > > > + help > > > > > > > + Specify a bootconfig file which will be embedded to the kernel. > > > > > > > + This bootconfig will be used if there is no initrd or no other > > > > > > > + bootconfig in the initrd. > > > > > > > + > > > > > > > choice > > > > > > > prompt "Compiler optimization level" > > > > > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > > > > > diff --git a/init/main.c b/init/main.c > > > > > > > index 421050be5039..3803bf2e22ea 100644 > > > > > > > --- a/init/main.c > > > > > > > +++ b/init/main.c > > > > > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > > > > > early_param("loglevel", loglevel); > > > > > > > > > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > > > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > > > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > > > > > { > > > > > > > u32 size, csum; > > > > > > > char *data; > > > > > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > > > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > > > > > const char *msg; > > > > > > > int pos; > > > > > > > - u32 size; > > > > > > > + size_t size; > > > > > > > char *data, *err; > > > > > > > int ret; > > > > > > > > > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > > > > > data = get_boot_config_from_initrd(&size); > > > > > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > > > > > + if (!data) > > > > > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > > > > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > > > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > > > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > > > > > } > > > > > > > > > > > > > > if (size >= XBC_DATA_MAX) { > > > > > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > > > > > - size, XBC_DATA_MAX); > > > > > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > > > > > + (long)size, XBC_DATA_MAX); > > > > > > > return; > > > > > > > } > > > > > > > > > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > > > > > msg, pos); > > > > > > > } else { > > > > > > > xbc_get_info(&ret, NULL); > > > > > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > > > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > > > > > /* keys starting with "kernel." are passed via cmdline */ > > > > > > > extra_command_line = xbc_make_cmdline("kernel"); > > > > > > > /* Also, "init." keys are init arguments */ > > > > > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > > > > > index e5e217b8307b..30a2a5db7033 100644 > > > > > > > --- a/lib/.gitignore > > > > > > > +++ b/lib/.gitignore > > > > > > > @@ -6,3 +6,4 @@ > > > > > > > /oid_registry_data.c > > > > > > > /test_fortify.log > > > > > > > /test_fortify/*.log > > > > > > > +/default.bconf > > > > > > > diff --git a/lib/Makefile b/lib/Makefile > > > > > > > index 300f569c626b..8183785ee99d 100644 > > > > > > > --- a/lib/Makefile > > > > > > > +++ b/lib/Makefile > > > > > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > > > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > > > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > > > > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > > > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > > > > > +# default.bconf file always. > > > > > > > +$(obj)/default.bconf: FORCE > > > > > > > + $(call cmd,defbconf) > > > > > > > + > > > > > > > +quiet_cmd_defbconf = GEN $@ > > > > > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > > > > > +clean-files += default.bconf > > > > > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > > > > > +endif > > > > > > > + > > > > > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > > > > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > > > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > > > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > > > > > --- a/lib/bootconfig.c > > > > > > > +++ b/lib/bootconfig.c > > > > > > > @@ -12,6 +12,29 @@ > > > > > > > #include <linux/kernel.h> > > > > > > > #include <linux/memblock.h> > > > > > > > #include <linux/string.h> > > > > > > > + > > > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > > > +asm ( > > > > > > > +" .pushsection .init.data, \"aw\" \n" > > > > > > > +" .global embedded_bootconfig_data \n" > > > > > > > +"embedded_bootconfig_data: \n" > > > > > > > +" .incbin \"lib/default.bconf\" \n" > > > > > > > +" .global embedded_bootconfig_data_end \n" > > > > > > > +"embedded_bootconfig_data_end: \n" > > > > > > > +" .popsection \n" > > > > > > > +); > > > > > > > + > > > > > > > +extern __visible char embedded_bootconfig_data[]; > > > > > > > +extern __visible char embedded_bootconfig_data_end[]; > > > > > > > + > > > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > > > > > +{ > > > > > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > > > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > > > > > +} > > > > > > > + > > > > > > > +#endif > > > > > > > + > > > > > > > #else /* !__KERNEL__ */ > > > > > > > /* > > > > > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > > > > > > > > > > > > > Thanks tested the implemation, it works as expected. > > > > > > > > > > Great! > > > > > > > > > > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > > > > expected behaviour? > > > > > > > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > > > > do incremental build. (I tested it with the incremental build environment) > > > > > > > > > > > > > Thanks, your observation made me to further experiment ther incremental build. > > > > > > > > Below are the observations I have: > > > > > > > > When I use GCC for a build; yes, the modified default.conf was observed on > > > > the target. > > > > > > > > But when I use clang; either with FULL or THIN LTO, the modified > > > > default.conf doesnt get reflected on the target. > > > > > > Hmm, curious. So you just add 'CC=clang' on the make command line, right? > > Yes, CC=clang ARCH=arm64 LLVM=1. As specified here: > > https://docs.kernel.org/kbuild/llvm.html. > > > > > Can you confirm that following line in your build log, > > > > > > GEN lib/default.bconf > > > > > Yes, I do see above line. Indeed lib/default.bconf will get incremental > > change. > > > > GEN lib/default.bconf > > CC lib/bootconfig.o > > AR lib/lib.a > > > > > and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? > > > > > Yes, verified timestamp for all above artifacts including vmlinux.o. > > > > ex: > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 22K Mar 22 14:50 > > ../out/lib/bootconfig.o > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 355 Mar 22 14:50 > > ../out/lib/default.bconf > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 54M Mar 22 14:50 ../out/vmlinux.o > > > > As said incremnetal change was refelected in artifact default.bconf. > > But not in vmlinux.o/vmlinux, used below command to verify. > > Interesting! This sounds clang's issue, because the make command rebuilds > the object file including new default.bconf, but the linker (lld?) > doesn't link it again correctly. > > > > > llvm-objdump -s -j .init.data ../out/vmlinux > > > > On target too, /proc/bootconfig shows old data. > > > > > And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? > > > > > Yes; CONFIG_LTO_NONE=y issue not observed even with LLVM binutils. > > And this issue is related to LTO. Maybe LTO ignores the '.init.data' > section update. (Perhaps, LTO only checks the function code hash or > something like that instead of the timestamp, and ignore whole object > file if all of them are not updated.) Thanks for the reasoning, seems to be. The same symptom observed with /proc/config.gz too. Thank you, Padmanabha.S > > I've added clang build maintainers. I need their help to solve this issue. > > Thank you, > > > > > Thanks and Regards, > > Padmanabha.S > > > Thank you, > > > > > > > > > > > PS: Using: GCC version 8.2.1 20180802, LLVM version 13.0.2git. > > > > > > > > Thank you, > > > > Padmanabha.S > > > > > Thank you, > > > > > > > > > > > > > > > > > Thanks and Regards, > > > > > > Padmanabha.S > > > > > > > > > > > > > > > -- > > > > > Masami Hiramatsu <mhiramat@kernel.org> > > > > > > > > > -- > > > Masami Hiramatsu <mhiramat@kernel.org> > > > -- > Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-23 15:56 ` Padmanabha Srinivasaiah @ 2022-03-24 1:05 ` Masami Hiramatsu 0 siblings, 0 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-24 1:05 UTC (permalink / raw) To: Padmanabha Srinivasaiah Cc: Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap, Nathan Chancellor, Nick Desaulniers, llvm On Wed, 23 Mar 2022 16:56:18 +0100 Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > On Wed, Mar 23, 2022 at 09:16:17AM +0900, Masami Hiramatsu wrote: > > On Tue, 22 Mar 2022 20:02:19 +0100 > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > Hello Masami Hiramatsu, > > > > > > On Tue, Mar 22, 2022 at 12:03:11PM +0900, Masami Hiramatsu wrote: > > > > On Mon, 21 Mar 2022 19:35:00 +0100 > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > > > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > > > > > > This allows kernel developer to embed a default bootconfig file in > > > > > > > > the kernel instead of embedding it in the initrd. This will be good > > > > > > > > for who are using the kernel without initrd, or who needs a default > > > > > > > > bootconfigs. > > > > > > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > > > > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > > > > > > > > > > > Note that you still need 'bootconfig' command line option to load the > > > > > > > > embedded bootconfig. Also if you boot using an initrd with a different > > > > > > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > > > > > > of the default bootconfig. > > > > > > > > > > > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > > > > > > --- > > > > > > > > include/linux/bootconfig.h | 10 ++++++++++ > > > > > > > > init/Kconfig | 21 +++++++++++++++++++++ > > > > > > > > init/main.c | 13 ++++++++----- > > > > > > > > lib/.gitignore | 1 + > > > > > > > > lib/Makefile | 12 ++++++++++++ > > > > > > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > > > > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > > > > > > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > > > > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > > > > > > --- a/include/linux/bootconfig.h > > > > > > > > +++ b/include/linux/bootconfig.h > > > > > > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > > > > > > /* XBC cleanup data structures */ > > > > > > > > void __init xbc_exit(void); > > > > > > > > > > > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > > > > > > +#else > > > > > > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > > > > > > +{ > > > > > > > > + return NULL; > > > > > > > > +} > > > > > > > > +#endif > > > > > > > > + > > > > > > > > #endif > > > > > > > > diff --git a/init/Kconfig b/init/Kconfig > > > > > > > > index e9119bf54b1f..70440804874d 100644 > > > > > > > > --- a/init/Kconfig > > > > > > > > +++ b/init/Kconfig > > > > > > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > > > > > > > > > > > If unsure, say Y. > > > > > > > > > > > > > > > > +config EMBED_BOOT_CONFIG > > > > > > > > + bool "Embed bootconfig file in the kernel" > > > > > > > > + depends on BOOT_CONFIG > > > > > > > > + default n > > > > > > > > + help > > > > > > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > > > > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > > > > > > + image. But if the system doesn't support initrd, this option will > > > > > > > > + help you by embedding a bootconfig file while building the kernel. > > > > > > > > + > > > > > > > > + If unsure, say N. > > > > > > > > + > > > > > > > > +config EMBED_BOOT_CONFIG_FILE > > > > > > > > + string "Embedded bootconfig file path" > > > > > > > > + default "" > > > > > > > > + depends on EMBED_BOOT_CONFIG > > > > > > > > + help > > > > > > > > + Specify a bootconfig file which will be embedded to the kernel. > > > > > > > > + This bootconfig will be used if there is no initrd or no other > > > > > > > > + bootconfig in the initrd. > > > > > > > > + > > > > > > > > choice > > > > > > > > prompt "Compiler optimization level" > > > > > > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > > > > > > diff --git a/init/main.c b/init/main.c > > > > > > > > index 421050be5039..3803bf2e22ea 100644 > > > > > > > > --- a/init/main.c > > > > > > > > +++ b/init/main.c > > > > > > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > > > > > > early_param("loglevel", loglevel); > > > > > > > > > > > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > > > > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > > > > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > > > > > > { > > > > > > > > u32 size, csum; > > > > > > > > char *data; > > > > > > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > > > > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > > > > > > const char *msg; > > > > > > > > int pos; > > > > > > > > - u32 size; > > > > > > > > + size_t size; > > > > > > > > char *data, *err; > > > > > > > > int ret; > > > > > > > > > > > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > > > > > > data = get_boot_config_from_initrd(&size); > > > > > > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > > > > > > + if (!data) > > > > > > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > > > > > > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > > > > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > > > > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > > > > > > } > > > > > > > > > > > > > > > > if (size >= XBC_DATA_MAX) { > > > > > > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > > > > > > - size, XBC_DATA_MAX); > > > > > > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > > > > > > + (long)size, XBC_DATA_MAX); > > > > > > > > return; > > > > > > > > } > > > > > > > > > > > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > > > > > > msg, pos); > > > > > > > > } else { > > > > > > > > xbc_get_info(&ret, NULL); > > > > > > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > > > > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > > > > > > /* keys starting with "kernel." are passed via cmdline */ > > > > > > > > extra_command_line = xbc_make_cmdline("kernel"); > > > > > > > > /* Also, "init." keys are init arguments */ > > > > > > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > > > > > > index e5e217b8307b..30a2a5db7033 100644 > > > > > > > > --- a/lib/.gitignore > > > > > > > > +++ b/lib/.gitignore > > > > > > > > @@ -6,3 +6,4 @@ > > > > > > > > /oid_registry_data.c > > > > > > > > /test_fortify.log > > > > > > > > /test_fortify/*.log > > > > > > > > +/default.bconf > > > > > > > > diff --git a/lib/Makefile b/lib/Makefile > > > > > > > > index 300f569c626b..8183785ee99d 100644 > > > > > > > > --- a/lib/Makefile > > > > > > > > +++ b/lib/Makefile > > > > > > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > > > > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > > > > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > > > > > > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > > > > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > > > > > > +# default.bconf file always. > > > > > > > > +$(obj)/default.bconf: FORCE > > > > > > > > + $(call cmd,defbconf) > > > > > > > > + > > > > > > > > +quiet_cmd_defbconf = GEN $@ > > > > > > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > > > > > > +clean-files += default.bconf > > > > > > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > > > > > > +endif > > > > > > > > + > > > > > > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > > > > > > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > > > > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > > > > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > > > > > > --- a/lib/bootconfig.c > > > > > > > > +++ b/lib/bootconfig.c > > > > > > > > @@ -12,6 +12,29 @@ > > > > > > > > #include <linux/kernel.h> > > > > > > > > #include <linux/memblock.h> > > > > > > > > #include <linux/string.h> > > > > > > > > + > > > > > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > > > > > +asm ( > > > > > > > > +" .pushsection .init.data, \"aw\" \n" > > > > > > > > +" .global embedded_bootconfig_data \n" > > > > > > > > +"embedded_bootconfig_data: \n" > > > > > > > > +" .incbin \"lib/default.bconf\" \n" > > > > > > > > +" .global embedded_bootconfig_data_end \n" > > > > > > > > +"embedded_bootconfig_data_end: \n" > > > > > > > > +" .popsection \n" > > > > > > > > +); > > > > > > > > + > > > > > > > > +extern __visible char embedded_bootconfig_data[]; > > > > > > > > +extern __visible char embedded_bootconfig_data_end[]; > > > > > > > > + > > > > > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > > > > > > +{ > > > > > > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > > > > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > > > > > > +} > > > > > > > > + > > > > > > > > +#endif > > > > > > > > + > > > > > > > > #else /* !__KERNEL__ */ > > > > > > > > /* > > > > > > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > > > > > > > > > > > > > > > > Thanks tested the implemation, it works as expected. > > > > > > > > > > > > Great! > > > > > > > > > > > > > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > > > > > expected behaviour? > > > > > > > > > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > > > > > do incremental build. (I tested it with the incremental build environment) > > > > > > > > > > > > > > > > Thanks, your observation made me to further experiment ther incremental build. > > > > > > > > > > Below are the observations I have: > > > > > > > > > > When I use GCC for a build; yes, the modified default.conf was observed on > > > > > the target. > > > > > > > > > > But when I use clang; either with FULL or THIN LTO, the modified > > > > > default.conf doesnt get reflected on the target. > > > > > > > > Hmm, curious. So you just add 'CC=clang' on the make command line, right? > > > Yes, CC=clang ARCH=arm64 LLVM=1. As specified here: > > > https://docs.kernel.org/kbuild/llvm.html. > > > > > > > Can you confirm that following line in your build log, > > > > > > > > GEN lib/default.bconf > > > > > > > Yes, I do see above line. Indeed lib/default.bconf will get incremental > > > change. > > > > > > GEN lib/default.bconf > > > CC lib/bootconfig.o > > > AR lib/lib.a > > > > > > > and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? > > > > > > > Yes, verified timestamp for all above artifacts including vmlinux.o. > > > > > > ex: > > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 22K Mar 22 14:50 > > > ../out/lib/bootconfig.o > > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 355 Mar 22 14:50 > > > ../out/lib/default.bconf > > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 54M Mar 22 14:50 ../out/vmlinux.o > > > > > > As said incremnetal change was refelected in artifact default.bconf. > > > But not in vmlinux.o/vmlinux, used below command to verify. > > > > Interesting! This sounds clang's issue, because the make command rebuilds > > the object file including new default.bconf, but the linker (lld?) > > doesn't link it again correctly. > > > > > > > > llvm-objdump -s -j .init.data ../out/vmlinux > > > > > > On target too, /proc/bootconfig shows old data. > > > > > > > And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? > > > > > > > Yes; CONFIG_LTO_NONE=y issue not observed even with LLVM binutils. > > > > And this issue is related to LTO. Maybe LTO ignores the '.init.data' > > section update. (Perhaps, LTO only checks the function code hash or > > something like that instead of the timestamp, and ignore whole object > > file if all of them are not updated.) > Thanks for the reasoning, seems to be. The same symptom observed with > /proc/config.gz too. Thanks for confirmation of config.gz. Yes, that is also using ".incbin" directive in inline-asm. I think that is the key. Thank you, -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-23 0:16 ` Masami Hiramatsu 2022-03-23 15:56 ` Padmanabha Srinivasaiah @ 2022-03-23 17:11 ` Nick Desaulniers 2022-03-24 1:10 ` Masami Hiramatsu 1 sibling, 1 reply; 20+ messages in thread From: Nick Desaulniers @ 2022-03-23 17:11 UTC (permalink / raw) To: Masami Hiramatsu, Sami Tolvanen Cc: Padmanabha Srinivasaiah, Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap, Nathan Chancellor, llvm, Masahiro Yamada, Linux Kbuild mailing list On Tue, Mar 22, 2022 at 5:16 PM Masami Hiramatsu <mhiramat@kernel.org> wrote: > > On Tue, 22 Mar 2022 20:02:19 +0100 > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > Hello Masami Hiramatsu, > > > > On Tue, Mar 22, 2022 at 12:03:11PM +0900, Masami Hiramatsu wrote: > > > On Mon, 21 Mar 2022 19:35:00 +0100 > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > Hello Masami Hiramatsu, > > > > > > > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > > > > expected behaviour? > > > > > > > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > > > > do incremental build. (I tested it with the incremental build environment) > > > > > > > > > > > > > Thanks, your observation made me to further experiment ther incremental build. > > > > > > > > Below are the observations I have: > > > > > > > > When I use GCC for a build; yes, the modified default.conf was observed on > > > > the target. > > > > > > > > But when I use clang; either with FULL or THIN LTO, the modified > > > > default.conf doesnt get reflected on the target. > > > > > > Hmm, curious. So you just add 'CC=clang' on the make command line, right? > > Yes, CC=clang ARCH=arm64 LLVM=1. As specified here: > > https://docs.kernel.org/kbuild/llvm.html. You should just need LLVM=1 (and ARCH=arm64) at this point. LLVM=1 implies CC=clang. Also, here's the start of the lore thread for folks: https://lore.kernel.org/linux-doc/164724892075.731226.14103557516176115189.stgit@devnote2/ > > > > > Can you confirm that following line in your build log, > > > > > > GEN lib/default.bconf > > > > > Yes, I do see above line. Indeed lib/default.bconf will get incremental > > change. > > > > GEN lib/default.bconf > > CC lib/bootconfig.o > > AR lib/lib.a > > > > > and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? > > > > > Yes, verified timestamp for all above artifacts including vmlinux.o. > > > > ex: > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 22K Mar 22 14:50 > > ../out/lib/bootconfig.o > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 355 Mar 22 14:50 > > ../out/lib/default.bconf > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 54M Mar 22 14:50 ../out/vmlinux.o > > > > As said incremnetal change was refelected in artifact default.bconf. > > But not in vmlinux.o/vmlinux, used below command to verify. > > Interesting! This sounds clang's issue, because the make command rebuilds > the object file including new default.bconf, but the linker (lld?) > doesn't link it again correctly. Sounds like missing FORCE directives in the Makefiles, perhaps? Sami, do you recall any issues like this when implementing commit dc5723b02e52 ("kbuild: add support for Clang LTO") ? > > > > > llvm-objdump -s -j .init.data ../out/vmlinux > > > > On target too, /proc/bootconfig shows old data. > > > > > And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? > > > > > Yes; CONFIG_LTO_NONE=y issue not observed even with LLVM binutils. > > And this issue is related to LTO. Maybe LTO ignores the '.init.data' > section update. (Perhaps, LTO only checks the function code hash or > something like that instead of the timestamp, and ignore whole object > file if all of them are not updated.) Sounds like this is a result of the above issue? -- Thanks, ~Nick Desaulniers ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-23 17:11 ` Nick Desaulniers @ 2022-03-24 1:10 ` Masami Hiramatsu 0 siblings, 0 replies; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-24 1:10 UTC (permalink / raw) To: Nick Desaulniers Cc: Sami Tolvanen, Padmanabha Srinivasaiah, Steven Rostedt, LKML, Jonathan Corbet, linux-doc, Randy Dunlap, Nathan Chancellor, llvm, Masahiro Yamada, Linux Kbuild mailing list Hello Nick, On Wed, 23 Mar 2022 10:11:53 -0700 Nick Desaulniers <ndesaulniers@google.com> wrote: > On Tue, Mar 22, 2022 at 5:16 PM Masami Hiramatsu <mhiramat@kernel.org> wrote: > > > > On Tue, 22 Mar 2022 20:02:19 +0100 > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > Hello Masami Hiramatsu, > > > > > > On Tue, Mar 22, 2022 at 12:03:11PM +0900, Masami Hiramatsu wrote: > > > > On Mon, 21 Mar 2022 19:35:00 +0100 > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > On Fri, Mar 18, 2022 at 10:14:45AM +0900, Masami Hiramatsu wrote: > > > > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > > > > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > > > > > > > > > Hello Masami Hiramatsu, > > > > > > > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > > > > > expected behaviour? > > > > > > > > > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > > > > > do incremental build. (I tested it with the incremental build environment) > > > > > > > > > > > > > > > > Thanks, your observation made me to further experiment ther incremental build. > > > > > > > > > > Below are the observations I have: > > > > > > > > > > When I use GCC for a build; yes, the modified default.conf was observed on > > > > > the target. > > > > > > > > > > But when I use clang; either with FULL or THIN LTO, the modified > > > > > default.conf doesnt get reflected on the target. > > > > > > > > Hmm, curious. So you just add 'CC=clang' on the make command line, right? > > > Yes, CC=clang ARCH=arm64 LLVM=1. As specified here: > > > https://docs.kernel.org/kbuild/llvm.html. > > You should just need LLVM=1 (and ARCH=arm64) at this point. LLVM=1 > implies CC=clang. OK. > > Also, here's the start of the lore thread for folks: > https://lore.kernel.org/linux-doc/164724892075.731226.14103557516176115189.stgit@devnote2/ Thanks for the link! > > > > > > > > Can you confirm that following line in your build log, > > > > > > > > GEN lib/default.bconf > > > > > > > Yes, I do see above line. Indeed lib/default.bconf will get incremental > > > change. > > > > > > GEN lib/default.bconf > > > CC lib/bootconfig.o > > > AR lib/lib.a > > > > > > > and the timestamp of lib/bootconfig.o is built after lib/default.bconf file? > > > > > > > Yes, verified timestamp for all above artifacts including vmlinux.o. > > > > > > ex: > > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 22K Mar 22 14:50 > > > ../out/lib/bootconfig.o > > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 355 Mar 22 14:50 > > > ../out/lib/default.bconf > > > -rw-rw-r-- 1 psrinivasaia psrinivasaia 54M Mar 22 14:50 ../out/vmlinux.o > > > > > > As said incremnetal change was refelected in artifact default.bconf. > > > But not in vmlinux.o/vmlinux, used below command to verify. > > > > Interesting! This sounds clang's issue, because the make command rebuilds > > the object file including new default.bconf, but the linker (lld?) > > doesn't link it again correctly. > > Sounds like missing FORCE directives in the Makefiles, perhaps? Hmm, as you can see in my patch, the default.bconf (contents) already has the FORCE directive as below. +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) +# Since the specified bootconfig file can be switched, we forcibly update the +# default.bconf file always. +$(obj)/default.bconf: FORCE + $(call cmd,defbconf) + +quiet_cmd_defbconf = GEN $@ + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ +clean-files += default.bconf +$(obj)/bootconfig.o: $(obj)/default.bconf +endif And since bootconfig.o depends on the default.bconf, it is at least compiled as Padmanabha reported above. If I missed something, please tell me. > > Sami, do you recall any issues like this when implementing > commit dc5723b02e52 ("kbuild: add support for Clang LTO") > ? > > > > > > > > > llvm-objdump -s -j .init.data ../out/vmlinux > > > > > > On target too, /proc/bootconfig shows old data. > > > > > > > And is that related to CONFIG_LTO? What happen if CONFIG_LTO=n? > > > > > > > Yes; CONFIG_LTO_NONE=y issue not observed even with LLVM binutils. > > > > And this issue is related to LTO. Maybe LTO ignores the '.init.data' > > section update. (Perhaps, LTO only checks the function code hash or > > something like that instead of the timestamp, and ignore whole object > > file if all of them are not updated.) > > Sounds like this is a result of the above issue? As I said above, I used FORCE for the default.bconf and confirmed that the bootconfig.c is compiled (updated). Thus I think FORCE correctly works. I'm not sure how LTO is implemented, but if the LTO works based on the intermediate representation(IR), I guess it doesn't handle inline asm ".incbin" directive in IR. I mean if the linker only checks the inline asm as a "string" in the .c file, it will miss the update of the contents of .incbin directive, because inline asm code itself is not changed. However the object file itself is updated, since the .incbin directive embeds an external file to the object file. This is just my guess. I would like to ask LLVM maintainers to help checking the safeness of using ".incbin" directive with LTO. (Note that this is also affects other parts which uses .incbin, like /proc/config.gz) Thank you, -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-18 1:14 ` Masami Hiramatsu 2022-03-21 18:35 ` Padmanabha Srinivasaiah @ 2022-03-26 2:34 ` Masahiro Yamada 2022-03-26 12:40 ` Masami Hiramatsu 1 sibling, 1 reply; 20+ messages in thread From: Masahiro Yamada @ 2022-03-26 2:34 UTC (permalink / raw) To: Masami Hiramatsu Cc: Padmanabha Srinivasaiah, Steven Rostedt, LKML, Jonathan Corbet, open list:DOCUMENTATION, Randy Dunlap On Fri, Mar 18, 2022 at 10:14 AM Masami Hiramatsu <mhiramat@kernel.org> wrote: > > On Wed, 16 Mar 2022 20:16:49 +0100 > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > Hello Masami Hiramatsu, > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > This allows kernel developer to embed a default bootconfig file in > > > the kernel instead of embedding it in the initrd. This will be good > > > for who are using the kernel without initrd, or who needs a default > > > bootconfigs. > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > Note that you still need 'bootconfig' command line option to load the > > > embedded bootconfig. Also if you boot using an initrd with a different > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > of the default bootconfig. > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > --- > > > include/linux/bootconfig.h | 10 ++++++++++ > > > init/Kconfig | 21 +++++++++++++++++++++ > > > init/main.c | 13 ++++++++----- > > > lib/.gitignore | 1 + > > > lib/Makefile | 12 ++++++++++++ > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > --- a/include/linux/bootconfig.h > > > +++ b/include/linux/bootconfig.h > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > /* XBC cleanup data structures */ > > > void __init xbc_exit(void); > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > +#else > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > +{ > > > + return NULL; > > > +} > > > +#endif > > > + > > > #endif > > > diff --git a/init/Kconfig b/init/Kconfig > > > index e9119bf54b1f..70440804874d 100644 > > > --- a/init/Kconfig > > > +++ b/init/Kconfig > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > If unsure, say Y. > > > > > > +config EMBED_BOOT_CONFIG > > > + bool "Embed bootconfig file in the kernel" > > > + depends on BOOT_CONFIG > > > + default n > > > + help > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > + image. But if the system doesn't support initrd, this option will > > > + help you by embedding a bootconfig file while building the kernel. > > > + > > > + If unsure, say N. > > > + > > > +config EMBED_BOOT_CONFIG_FILE > > > + string "Embedded bootconfig file path" > > > + default "" > > > + depends on EMBED_BOOT_CONFIG > > > + help > > > + Specify a bootconfig file which will be embedded to the kernel. > > > + This bootconfig will be used if there is no initrd or no other > > > + bootconfig in the initrd. > > > + > > > choice > > > prompt "Compiler optimization level" > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > diff --git a/init/main.c b/init/main.c > > > index 421050be5039..3803bf2e22ea 100644 > > > --- a/init/main.c > > > +++ b/init/main.c > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > early_param("loglevel", loglevel); > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > { > > > u32 size, csum; > > > char *data; > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > const char *msg; > > > int pos; > > > - u32 size; > > > + size_t size; > > > char *data, *err; > > > int ret; > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > data = get_boot_config_from_initrd(&size); > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > + if (!data) > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > } > > > > > > if (size >= XBC_DATA_MAX) { > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > - size, XBC_DATA_MAX); > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > + (long)size, XBC_DATA_MAX); > > > return; > > > } > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > msg, pos); > > > } else { > > > xbc_get_info(&ret, NULL); > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > /* keys starting with "kernel." are passed via cmdline */ > > > extra_command_line = xbc_make_cmdline("kernel"); > > > /* Also, "init." keys are init arguments */ > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > index e5e217b8307b..30a2a5db7033 100644 > > > --- a/lib/.gitignore > > > +++ b/lib/.gitignore > > > @@ -6,3 +6,4 @@ > > > /oid_registry_data.c > > > /test_fortify.log > > > /test_fortify/*.log > > > +/default.bconf > > > diff --git a/lib/Makefile b/lib/Makefile > > > index 300f569c626b..8183785ee99d 100644 > > > --- a/lib/Makefile > > > +++ b/lib/Makefile > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > +# default.bconf file always. > > > +$(obj)/default.bconf: FORCE > > > + $(call cmd,defbconf) > > > + > > > +quiet_cmd_defbconf = GEN $@ > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > +clean-files += default.bconf > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > +endif > > > + > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > --- a/lib/bootconfig.c > > > +++ b/lib/bootconfig.c > > > @@ -12,6 +12,29 @@ > > > #include <linux/kernel.h> > > > #include <linux/memblock.h> > > > #include <linux/string.h> > > > + > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > +asm ( > > > +" .pushsection .init.data, \"aw\" \n" > > > +" .global embedded_bootconfig_data \n" > > > +"embedded_bootconfig_data: \n" > > > +" .incbin \"lib/default.bconf\" \n" > > > +" .global embedded_bootconfig_data_end \n" > > > +"embedded_bootconfig_data_end: \n" > > > +" .popsection \n" > > > +); > > > + > > > +extern __visible char embedded_bootconfig_data[]; > > > +extern __visible char embedded_bootconfig_data_end[]; > > > + > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > +{ > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > +} > > > + > > > +#endif > > > + > > > #else /* !__KERNEL__ */ > > > /* > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > Thanks tested the implemation, it works as expected. > > Great! > > > > > Also noted that a change in default.bconf requries a clean build, is it > > expected behaviour? > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > do incremental build. (I tested it with the incremental build environment) So, default.bconf is always re-generated, causing bootconfig.o to be always rebuilt, causing vmlinux to be always rebuilt. This is absolutely unacceptable. If you do not change the source tree at all, the incremental build must be really quick, simply doing nothing. You can check how $(obj)/config_data avoids the unneeded timestamp update. BTW, it is already possible to embed kernel parameters into the kernel. Is this another implementation of CONFIG_CMDLINE? > Thank you, > > > > > Thanks and Regards, > > Padmanabha.S > > > -- > Masami Hiramatsu <mhiramat@kernel.org> -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-26 2:34 ` Masahiro Yamada @ 2022-03-26 12:40 ` Masami Hiramatsu 2022-03-26 13:54 ` Steven Rostedt 0 siblings, 1 reply; 20+ messages in thread From: Masami Hiramatsu @ 2022-03-26 12:40 UTC (permalink / raw) To: Masahiro Yamada Cc: Padmanabha Srinivasaiah, Steven Rostedt, LKML, Jonathan Corbet, open list:DOCUMENTATION, Randy Dunlap On Sat, 26 Mar 2022 11:34:45 +0900 Masahiro Yamada <masahiroy@kernel.org> wrote: > On Fri, Mar 18, 2022 at 10:14 AM Masami Hiramatsu <mhiramat@kernel.org> wrote: > > > > On Wed, 16 Mar 2022 20:16:49 +0100 > > Padmanabha Srinivasaiah <treasure4paddy@gmail.com> wrote: > > > > > Hello Masami Hiramatsu, > > > > > > On Mon, Mar 14, 2022 at 06:08:41PM +0900, Masami Hiramatsu wrote: > > > > This allows kernel developer to embed a default bootconfig file in > > > > the kernel instead of embedding it in the initrd. This will be good > > > > for who are using the kernel without initrd, or who needs a default > > > > bootconfigs. > > > > This needs to set two kconfigs: CONFIG_EMBED_BOOT_CONFIG=y and set > > > > the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. > > > > > > > > Note that you still need 'bootconfig' command line option to load the > > > > embedded bootconfig. Also if you boot using an initrd with a different > > > > bootconfig, the kernel will use the bootconfig in the initrd, instead > > > > of the default bootconfig. > > > > > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > > > --- > > > > include/linux/bootconfig.h | 10 ++++++++++ > > > > init/Kconfig | 21 +++++++++++++++++++++ > > > > init/main.c | 13 ++++++++----- > > > > lib/.gitignore | 1 + > > > > lib/Makefile | 12 ++++++++++++ > > > > lib/bootconfig.c | 23 +++++++++++++++++++++++ > > > > 6 files changed, 75 insertions(+), 5 deletions(-) > > > > > > > > diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h > > > > index a4665c7ab07c..5dbda5e3e9bb 100644 > > > > --- a/include/linux/bootconfig.h > > > > +++ b/include/linux/bootconfig.h > > > > @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_size); > > > > /* XBC cleanup data structures */ > > > > void __init xbc_exit(void); > > > > > > > > +/* XBC embedded bootconfig data in kernel */ > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size); > > > > +#else > > > > +static inline char *xbc_get_embedded_bootconfig(size_t *size) > > > > +{ > > > > + return NULL; > > > > +} > > > > +#endif > > > > + > > > > #endif > > > > diff --git a/init/Kconfig b/init/Kconfig > > > > index e9119bf54b1f..70440804874d 100644 > > > > --- a/init/Kconfig > > > > +++ b/init/Kconfig > > > > @@ -1357,6 +1357,27 @@ config BOOT_CONFIG > > > > > > > > If unsure, say Y. > > > > > > > > +config EMBED_BOOT_CONFIG > > > > + bool "Embed bootconfig file in the kernel" > > > > + depends on BOOT_CONFIG > > > > + default n > > > > + help > > > > + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the > > > > + kernel. Usually, the bootconfig file is loaded with the initrd > > > > + image. But if the system doesn't support initrd, this option will > > > > + help you by embedding a bootconfig file while building the kernel. > > > > + > > > > + If unsure, say N. > > > > + > > > > +config EMBED_BOOT_CONFIG_FILE > > > > + string "Embedded bootconfig file path" > > > > + default "" > > > > + depends on EMBED_BOOT_CONFIG > > > > + help > > > > + Specify a bootconfig file which will be embedded to the kernel. > > > > + This bootconfig will be used if there is no initrd or no other > > > > + bootconfig in the initrd. > > > > + > > > > choice > > > > prompt "Compiler optimization level" > > > > default CC_OPTIMIZE_FOR_PERFORMANCE > > > > diff --git a/init/main.c b/init/main.c > > > > index 421050be5039..3803bf2e22ea 100644 > > > > --- a/init/main.c > > > > +++ b/init/main.c > > > > @@ -265,7 +265,7 @@ static int __init loglevel(char *str) > > > > early_param("loglevel", loglevel); > > > > > > > > #ifdef CONFIG_BLK_DEV_INITRD > > > > -static void * __init get_boot_config_from_initrd(u32 *_size) > > > > +static void * __init get_boot_config_from_initrd(size_t *_size) > > > > { > > > > u32 size, csum; > > > > char *data; > > > > @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) > > > > static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; > > > > const char *msg; > > > > int pos; > > > > - u32 size; > > > > + size_t size; > > > > char *data, *err; > > > > int ret; > > > > > > > > /* Cut out the bootconfig data even if we have no bootconfig option */ > > > > data = get_boot_config_from_initrd(&size); > > > > + /* If there is no bootconfig in initrd, try embedded one. */ > > > > + if (!data) > > > > + data = xbc_get_embedded_bootconfig(&size); > > > > > > > > strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); > > > > err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, > > > > @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) > > > > } > > > > > > > > if (size >= XBC_DATA_MAX) { > > > > - pr_err("bootconfig size %d greater than max size %d\n", > > > > - size, XBC_DATA_MAX); > > > > + pr_err("bootconfig size %ld greater than max size %d\n", > > > > + (long)size, XBC_DATA_MAX); > > > > return; > > > > } > > > > > > > > @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) > > > > msg, pos); > > > > } else { > > > > xbc_get_info(&ret, NULL); > > > > - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); > > > > + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); > > > > /* keys starting with "kernel." are passed via cmdline */ > > > > extra_command_line = xbc_make_cmdline("kernel"); > > > > /* Also, "init." keys are init arguments */ > > > > diff --git a/lib/.gitignore b/lib/.gitignore > > > > index e5e217b8307b..30a2a5db7033 100644 > > > > --- a/lib/.gitignore > > > > +++ b/lib/.gitignore > > > > @@ -6,3 +6,4 @@ > > > > /oid_registry_data.c > > > > /test_fortify.log > > > > /test_fortify/*.log > > > > +/default.bconf > > > > diff --git a/lib/Makefile b/lib/Makefile > > > > index 300f569c626b..8183785ee99d 100644 > > > > --- a/lib/Makefile > > > > +++ b/lib/Makefile > > > > @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ > > > > $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) > > > > lib-$(CONFIG_LIBFDT) += $(libfdt_files) > > > > > > > > +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) > > > > +# Since the specified bootconfig file can be switched, we forcibly update the > > > > +# default.bconf file always. > > > > +$(obj)/default.bconf: FORCE > > > > + $(call cmd,defbconf) > > > > + > > > > +quiet_cmd_defbconf = GEN $@ > > > > + cmd_defbconf = cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > $@ > > > > +clean-files += default.bconf > > > > +$(obj)/bootconfig.o: $(obj)/default.bconf > > > > +endif > > > > + > > > > lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o > > > > > > > > obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o > > > > diff --git a/lib/bootconfig.c b/lib/bootconfig.c > > > > index 74f3201ab8e5..3a3bf3a208e3 100644 > > > > --- a/lib/bootconfig.c > > > > +++ b/lib/bootconfig.c > > > > @@ -12,6 +12,29 @@ > > > > #include <linux/kernel.h> > > > > #include <linux/memblock.h> > > > > #include <linux/string.h> > > > > + > > > > +#ifdef CONFIG_EMBED_BOOT_CONFIG > > > > +asm ( > > > > +" .pushsection .init.data, \"aw\" \n" > > > > +" .global embedded_bootconfig_data \n" > > > > +"embedded_bootconfig_data: \n" > > > > +" .incbin \"lib/default.bconf\" \n" > > > > +" .global embedded_bootconfig_data_end \n" > > > > +"embedded_bootconfig_data_end: \n" > > > > +" .popsection \n" > > > > +); > > > > + > > > > +extern __visible char embedded_bootconfig_data[]; > > > > +extern __visible char embedded_bootconfig_data_end[]; > > > > + > > > > +char * __init xbc_get_embedded_bootconfig(size_t *size) > > > > +{ > > > > + *size = embedded_bootconfig_data_end - embedded_bootconfig_data; > > > > + return (*size) ? embedded_bootconfig_data : NULL; > > > > +} > > > > + > > > > +#endif > > > > + > > > > #else /* !__KERNEL__ */ > > > > /* > > > > * NOTE: This is only for tools/bootconfig, because tools/bootconfig will > > > > > > > > > > Thanks tested the implemation, it works as expected. > > > > Great! > > > > > > > > Also noted that a change in default.bconf requries a clean build, is it > > > expected behaviour? > > > > default.bconf will be always updated if CONFIG_EMBED_BOOT_CONFIG=y. So you can > > do incremental build. (I tested it with the incremental build environment) > > > > > So, default.bconf is always re-generated, > causing bootconfig.o to be always rebuilt, > causing vmlinux to be always rebuilt. > > This is absolutely unacceptable. > > If you do not change the source tree at all, > the incremental build must be really quick, > simply doing nothing. > > You can check how $(obj)/config_data > avoids the unneeded timestamp update. OK, thanks for the information! Let me check to learn how I can avoid rebuilding it. I also found the Documentation/kbuild/makefile.rst, which is very helpful! I'll update the patch. > > > > BTW, it is already possible to embed kernel parameters > into the kernel. > Is this another implementation of CONFIG_CMDLINE? Yes, it is the bootconfig version of the CONFIG_CMDLINE. Since some boot-time tracing feature depends on the bootconfig (those can not be set via kernel cmdline), we need this feature for those features on non-initrd boot system. Thank you! > > > > > > > > > > Thank you, > > > > > > > > Thanks and Regards, > > > Padmanabha.S > > > > > > -- > > Masami Hiramatsu <mhiramat@kernel.org> > > > > -- > Best Regards > Masahiro Yamada -- Masami Hiramatsu <mhiramat@kernel.org> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel 2022-03-26 12:40 ` Masami Hiramatsu @ 2022-03-26 13:54 ` Steven Rostedt 0 siblings, 0 replies; 20+ messages in thread From: Steven Rostedt @ 2022-03-26 13:54 UTC (permalink / raw) To: Masami Hiramatsu Cc: Masahiro Yamada, Padmanabha Srinivasaiah, LKML, Jonathan Corbet, open list:DOCUMENTATION, Randy Dunlap On Sat, 26 Mar 2022 21:40:40 +0900 Masami Hiramatsu <mhiramat@kernel.org> wrote: > > BTW, it is already possible to embed kernel parameters > > into the kernel. > > Is this another implementation of CONFIG_CMDLINE? If one changes CONFIG_CMDLINE, does it require a rebuild of vmlinux? > > Yes, it is the bootconfig version of the CONFIG_CMDLINE. > Since some boot-time tracing feature depends on the bootconfig (those can > not be set via kernel cmdline), we need this feature for those features > on non-initrd boot system. Yes, the kernel command line has a fixed size, and with tracing options, we can easily go over it. bootconfig is a way to have an unlimited size and also be able to have a better and more reasonable formatting to express options for things like tracing. -- Steve ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2022-03-26 13:54 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-03-14 1:53 [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 1/3] bootconfig: Check the checksum before removing the bootconfig from initrd Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel Masami Hiramatsu 2022-03-14 1:54 ` [PATCH v2 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel Masami Hiramatsu 2022-03-14 2:03 ` Randy Dunlap 2022-03-14 8:03 ` Masami Hiramatsu -- strict thread matches above, loose matches on Subject: below -- 2022-03-14 9:08 [PATCH v2 0/3] bootconfig: Support embedding a bootconfig in kernel for non initrd boot Masami Hiramatsu 2022-03-14 9:08 ` [PATCH v2 2/3] bootconfig: Support embedding a bootconfig file in kernel Masami Hiramatsu 2022-03-16 19:16 ` Padmanabha Srinivasaiah 2022-03-18 1:14 ` Masami Hiramatsu 2022-03-21 18:35 ` Padmanabha Srinivasaiah 2022-03-22 3:03 ` Masami Hiramatsu 2022-03-22 19:02 ` Padmanabha Srinivasaiah 2022-03-23 0:16 ` Masami Hiramatsu 2022-03-23 15:56 ` Padmanabha Srinivasaiah 2022-03-24 1:05 ` Masami Hiramatsu 2022-03-23 17:11 ` Nick Desaulniers 2022-03-24 1:10 ` Masami Hiramatsu 2022-03-26 2:34 ` Masahiro Yamada 2022-03-26 12:40 ` Masami Hiramatsu 2022-03-26 13:54 ` Steven Rostedt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).