* [PATCH 0/2] Improve handling of the __klp_{objects,funcs} sections in modules
@ 2026-01-14 12:29 Petr Pavlu
2026-01-14 12:29 ` [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules Petr Pavlu
2026-01-14 12:29 ` [PATCH 2/2] livepatch: Free klp_{object,func}_ext data after initialization Petr Pavlu
0 siblings, 2 replies; 6+ messages in thread
From: Petr Pavlu @ 2026-01-14 12:29 UTC (permalink / raw)
To: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek,
Joe Lawrence
Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen,
Aaron Tomlin, Peter Zijlstra, live-patching, linux-modules,
linux-kernel
Petr Pavlu (2):
livepatch: Fix having __klp_objects relics in non-livepatch modules
livepatch: Free klp_{object,func}_ext data after initialization
include/linux/livepatch.h | 3 +++
kernel/livepatch/core.c | 21 +++++++++++++++++++++
scripts/livepatch/init.c | 17 ++++++-----------
scripts/module.lds.S | 9 ++-------
tools/objtool/check.c | 2 +-
tools/objtool/include/objtool/klp.h | 10 +++++-----
tools/objtool/klp-diff.c | 2 +-
7 files changed, 39 insertions(+), 25 deletions(-)
base-commit: f0b9d8eb98dfee8d00419aa07543bdc2c1a44fb1
--
2.52.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules 2026-01-14 12:29 [PATCH 0/2] Improve handling of the __klp_{objects,funcs} sections in modules Petr Pavlu @ 2026-01-14 12:29 ` Petr Pavlu 2026-01-19 22:19 ` Joe Lawrence 2026-01-14 12:29 ` [PATCH 2/2] livepatch: Free klp_{object,func}_ext data after initialization Petr Pavlu 1 sibling, 1 reply; 6+ messages in thread From: Petr Pavlu @ 2026-01-14 12:29 UTC (permalink / raw) To: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Joe Lawrence Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Peter Zijlstra, live-patching, linux-modules, linux-kernel The linker script scripts/module.lds.S specifies that all input __klp_objects sections should be consolidated into an output section of the same name, and start/stop symbols should be created to enable scripts/livepatch/init.c to locate this data. This start/stop pattern is not ideal for modules because the symbols are created even if no __klp_objects input sections are present. Consequently, a dummy __klp_objects section also appears in the resulting module. This unnecessarily pollutes non-livepatch modules. Instead, since modules are relocatable files, the usual method for locating consolidated data in a module is to read its section table. This approach avoids the aforementioned problem. The klp_modinfo already stores a copy of the entire section table with the final addresses. Introduce a helper function that scripts/livepatch/init.c can call to obtain the location of the __klp_objects section from this data. Signed-off-by: Petr Pavlu <petr.pavlu@suse.com> --- include/linux/livepatch.h | 3 +++ kernel/livepatch/core.c | 20 ++++++++++++++++++++ scripts/livepatch/init.c | 17 ++++++----------- scripts/module.lds.S | 7 +------ 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h index 772919e8096a..ca90adbe89ed 100644 --- a/include/linux/livepatch.h +++ b/include/linux/livepatch.h @@ -175,6 +175,9 @@ int klp_enable_patch(struct klp_patch *); int klp_module_coming(struct module *mod); void klp_module_going(struct module *mod); +struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, + unsigned int *nr_objs); + void klp_copy_process(struct task_struct *child); void klp_update_patch_state(struct task_struct *task); diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 9917756dae46..4e0ac47b3623 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -1356,6 +1356,26 @@ void klp_module_going(struct module *mod) mutex_unlock(&klp_mutex); } +struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, + unsigned int *nr_objs) +{ + struct klp_modinfo *info = mod->klp_info; + + for (int i = 1; i < info->hdr.e_shnum; i++) { + Elf_Shdr *shdr = &info->sechdrs[i]; + + if (strcmp(info->secstrings + shdr->sh_name, "__klp_objects")) + continue; + + *nr_objs = shdr->sh_size / sizeof(struct klp_object_ext); + return (struct klp_object_ext *)shdr->sh_addr; + } + + *nr_objs = 0; + return NULL; +} +EXPORT_SYMBOL_GPL(klp_build_locate_init_objects); + static int __init klp_init(void) { klp_root_kobj = kobject_create_and_add("livepatch", kernel_kobj); diff --git a/scripts/livepatch/init.c b/scripts/livepatch/init.c index 2274d8f5a482..23e037d6de19 100644 --- a/scripts/livepatch/init.c +++ b/scripts/livepatch/init.c @@ -9,19 +9,16 @@ #include <linux/slab.h> #include <linux/livepatch.h> -extern struct klp_object_ext __start_klp_objects[]; -extern struct klp_object_ext __stop_klp_objects[]; - static struct klp_patch *patch; static int __init livepatch_mod_init(void) { + struct klp_object_ext *obj_exts; struct klp_object *objs; unsigned int nr_objs; int ret; - nr_objs = __stop_klp_objects - __start_klp_objects; - + obj_exts = klp_build_locate_init_objects(THIS_MODULE, &nr_objs); if (!nr_objs) { pr_err("nothing to patch!\n"); ret = -EINVAL; @@ -41,7 +38,7 @@ static int __init livepatch_mod_init(void) } for (int i = 0; i < nr_objs; i++) { - struct klp_object_ext *obj_ext = __start_klp_objects + i; + struct klp_object_ext *obj_ext = obj_exts + i; struct klp_func_ext *funcs_ext = obj_ext->funcs; unsigned int nr_funcs = obj_ext->nr_funcs; struct klp_func *funcs = objs[i].funcs; @@ -90,12 +87,10 @@ static int __init livepatch_mod_init(void) static void __exit livepatch_mod_exit(void) { - unsigned int nr_objs; - - nr_objs = __stop_klp_objects - __start_klp_objects; + struct klp_object *obj; - for (int i = 0; i < nr_objs; i++) - kfree(patch->objs[i].funcs); + klp_for_each_object_static(patch, obj) + kfree(obj->funcs); kfree(patch->objs); kfree(patch); diff --git a/scripts/module.lds.S b/scripts/module.lds.S index 3037d5e5527c..383d19beffb4 100644 --- a/scripts/module.lds.S +++ b/scripts/module.lds.S @@ -35,12 +35,7 @@ SECTIONS { __patchable_function_entries : { *(__patchable_function_entries) } __klp_funcs 0: ALIGN(8) { KEEP(*(__klp_funcs)) } - - __klp_objects 0: ALIGN(8) { - __start_klp_objects = .; - KEEP(*(__klp_objects)) - __stop_klp_objects = .; - } + __klp_objects 0: ALIGN(8) { KEEP(*(__klp_objects)) } #ifdef CONFIG_ARCH_USES_CFI_TRAPS __kcfi_traps : { KEEP(*(.kcfi_traps)) } -- 2.52.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules 2026-01-14 12:29 ` [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules Petr Pavlu @ 2026-01-19 22:19 ` Joe Lawrence 2026-01-20 17:48 ` Petr Pavlu 0 siblings, 1 reply; 6+ messages in thread From: Joe Lawrence @ 2026-01-19 22:19 UTC (permalink / raw) To: Petr Pavlu Cc: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Luis Chamberlain, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Peter Zijlstra, live-patching, linux-modules, linux-kernel On Wed, Jan 14, 2026 at 01:29:53PM +0100, Petr Pavlu wrote: > The linker script scripts/module.lds.S specifies that all input > __klp_objects sections should be consolidated into an output section of > the same name, and start/stop symbols should be created to enable > scripts/livepatch/init.c to locate this data. > > This start/stop pattern is not ideal for modules because the symbols are > created even if no __klp_objects input sections are present. > Consequently, a dummy __klp_objects section also appears in the > resulting module. This unnecessarily pollutes non-livepatch modules. > > Instead, since modules are relocatable files, the usual method for > locating consolidated data in a module is to read its section table. > This approach avoids the aforementioned problem. > > The klp_modinfo already stores a copy of the entire section table with > the final addresses. Introduce a helper function that > scripts/livepatch/init.c can call to obtain the location of the > __klp_objects section from this data. > > Signed-off-by: Petr Pavlu <petr.pavlu@suse.com> > --- > include/linux/livepatch.h | 3 +++ > kernel/livepatch/core.c | 20 ++++++++++++++++++++ > scripts/livepatch/init.c | 17 ++++++----------- > scripts/module.lds.S | 7 +------ > 4 files changed, 30 insertions(+), 17 deletions(-) > > diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h > index 772919e8096a..ca90adbe89ed 100644 > --- a/include/linux/livepatch.h > +++ b/include/linux/livepatch.h > @@ -175,6 +175,9 @@ int klp_enable_patch(struct klp_patch *); > int klp_module_coming(struct module *mod); > void klp_module_going(struct module *mod); > > +struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, > + unsigned int *nr_objs); > + > void klp_copy_process(struct task_struct *child); > void klp_update_patch_state(struct task_struct *task); > > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c > index 9917756dae46..4e0ac47b3623 100644 > --- a/kernel/livepatch/core.c > +++ b/kernel/livepatch/core.c > @@ -1356,6 +1356,26 @@ void klp_module_going(struct module *mod) > mutex_unlock(&klp_mutex); > } > > +struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, > + unsigned int *nr_objs) > +{ > + struct klp_modinfo *info = mod->klp_info; > + > + for (int i = 1; i < info->hdr.e_shnum; i++) { > + Elf_Shdr *shdr = &info->sechdrs[i]; > + > + if (strcmp(info->secstrings + shdr->sh_name, "__klp_objects")) > + continue; > + Since this function is doing a string comparision to find the ELF section, would it make sense to open up the API by allowing to caller to specify the sh_name? That would give scripts/livepatch/init.c future flexibility in finding similarly crafted data structures. Disregard if there is already a pattern of doing it this way :) > + *nr_objs = shdr->sh_size / sizeof(struct klp_object_ext); > + return (struct klp_object_ext *)shdr->sh_addr; > + } > + > + *nr_objs = 0; > + return NULL; > +} > +EXPORT_SYMBOL_GPL(klp_build_locate_init_objects); > + > static int __init klp_init(void) > { > klp_root_kobj = kobject_create_and_add("livepatch", kernel_kobj); > diff --git a/scripts/livepatch/init.c b/scripts/livepatch/init.c > index 2274d8f5a482..23e037d6de19 100644 > --- a/scripts/livepatch/init.c > +++ b/scripts/livepatch/init.c > @@ -9,19 +9,16 @@ > #include <linux/slab.h> > #include <linux/livepatch.h> > > -extern struct klp_object_ext __start_klp_objects[]; > -extern struct klp_object_ext __stop_klp_objects[]; > - > static struct klp_patch *patch; > > static int __init livepatch_mod_init(void) > { > + struct klp_object_ext *obj_exts; > struct klp_object *objs; > unsigned int nr_objs; > int ret; > > - nr_objs = __stop_klp_objects - __start_klp_objects; > - > + obj_exts = klp_build_locate_init_objects(THIS_MODULE, &nr_objs); > if (!nr_objs) { > pr_err("nothing to patch!\n"); > ret = -EINVAL; > @@ -41,7 +38,7 @@ static int __init livepatch_mod_init(void) > } > > for (int i = 0; i < nr_objs; i++) { > - struct klp_object_ext *obj_ext = __start_klp_objects + i; > + struct klp_object_ext *obj_ext = obj_exts + i; > struct klp_func_ext *funcs_ext = obj_ext->funcs; > unsigned int nr_funcs = obj_ext->nr_funcs; > struct klp_func *funcs = objs[i].funcs; > @@ -90,12 +87,10 @@ static int __init livepatch_mod_init(void) > > static void __exit livepatch_mod_exit(void) > { > - unsigned int nr_objs; > - > - nr_objs = __stop_klp_objects - __start_klp_objects; > + struct klp_object *obj; > > - for (int i = 0; i < nr_objs; i++) > - kfree(patch->objs[i].funcs); > + klp_for_each_object_static(patch, obj) > + kfree(obj->funcs); > > kfree(patch->objs); > kfree(patch); > diff --git a/scripts/module.lds.S b/scripts/module.lds.S > index 3037d5e5527c..383d19beffb4 100644 > --- a/scripts/module.lds.S > +++ b/scripts/module.lds.S > @@ -35,12 +35,7 @@ SECTIONS { > __patchable_function_entries : { *(__patchable_function_entries) } > > __klp_funcs 0: ALIGN(8) { KEEP(*(__klp_funcs)) } > - > - __klp_objects 0: ALIGN(8) { > - __start_klp_objects = .; > - KEEP(*(__klp_objects)) > - __stop_klp_objects = .; > - } > + __klp_objects 0: ALIGN(8) { KEEP(*(__klp_objects)) } > > #ifdef CONFIG_ARCH_USES_CFI_TRAPS > __kcfi_traps : { KEEP(*(.kcfi_traps)) } > -- > 2.52.0 > Acked-by: Joe Lawrence <joe.lawrence@redhat.com> -- Joe ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules 2026-01-19 22:19 ` Joe Lawrence @ 2026-01-20 17:48 ` Petr Pavlu 0 siblings, 0 replies; 6+ messages in thread From: Petr Pavlu @ 2026-01-20 17:48 UTC (permalink / raw) To: Joe Lawrence Cc: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Luis Chamberlain, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Peter Zijlstra, live-patching, linux-modules, linux-kernel On 1/19/26 11:19 PM, Joe Lawrence wrote: > On Wed, Jan 14, 2026 at 01:29:53PM +0100, Petr Pavlu wrote: >> The linker script scripts/module.lds.S specifies that all input >> __klp_objects sections should be consolidated into an output section of >> the same name, and start/stop symbols should be created to enable >> scripts/livepatch/init.c to locate this data. >> >> This start/stop pattern is not ideal for modules because the symbols are >> created even if no __klp_objects input sections are present. >> Consequently, a dummy __klp_objects section also appears in the >> resulting module. This unnecessarily pollutes non-livepatch modules. >> >> Instead, since modules are relocatable files, the usual method for >> locating consolidated data in a module is to read its section table. >> This approach avoids the aforementioned problem. >> >> The klp_modinfo already stores a copy of the entire section table with >> the final addresses. Introduce a helper function that >> scripts/livepatch/init.c can call to obtain the location of the >> __klp_objects section from this data. >> >> Signed-off-by: Petr Pavlu <petr.pavlu@suse.com> >> --- >> include/linux/livepatch.h | 3 +++ >> kernel/livepatch/core.c | 20 ++++++++++++++++++++ >> scripts/livepatch/init.c | 17 ++++++----------- >> scripts/module.lds.S | 7 +------ >> 4 files changed, 30 insertions(+), 17 deletions(-) >> >> diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h >> index 772919e8096a..ca90adbe89ed 100644 >> --- a/include/linux/livepatch.h >> +++ b/include/linux/livepatch.h >> @@ -175,6 +175,9 @@ int klp_enable_patch(struct klp_patch *); >> int klp_module_coming(struct module *mod); >> void klp_module_going(struct module *mod); >> >> +struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, >> + unsigned int *nr_objs); >> + >> void klp_copy_process(struct task_struct *child); >> void klp_update_patch_state(struct task_struct *task); >> >> diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c >> index 9917756dae46..4e0ac47b3623 100644 >> --- a/kernel/livepatch/core.c >> +++ b/kernel/livepatch/core.c >> @@ -1356,6 +1356,26 @@ void klp_module_going(struct module *mod) >> mutex_unlock(&klp_mutex); >> } >> >> +struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, >> + unsigned int *nr_objs) >> +{ >> + struct klp_modinfo *info = mod->klp_info; >> + >> + for (int i = 1; i < info->hdr.e_shnum; i++) { >> + Elf_Shdr *shdr = &info->sechdrs[i]; >> + >> + if (strcmp(info->secstrings + shdr->sh_name, "__klp_objects")) >> + continue; >> + > > Since this function is doing a string comparision to find the ELF > section, would it make sense to open up the API by allowing to caller to > specify the sh_name? That would give scripts/livepatch/init.c future > flexibility in finding similarly crafted data structures. Disregard if > there is already a pattern of doing it this way :) Makes sense. I'll change the function signature to: void *klp_locate_section_objs(const struct module *mod, const char *name, size_t object_size, unsigned int *nr_objs); -- Thanks, Petr ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] livepatch: Free klp_{object,func}_ext data after initialization 2026-01-14 12:29 [PATCH 0/2] Improve handling of the __klp_{objects,funcs} sections in modules Petr Pavlu 2026-01-14 12:29 ` [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules Petr Pavlu @ 2026-01-14 12:29 ` Petr Pavlu 2026-01-19 22:22 ` Joe Lawrence 1 sibling, 1 reply; 6+ messages in thread From: Petr Pavlu @ 2026-01-14 12:29 UTC (permalink / raw) To: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Joe Lawrence Cc: Luis Chamberlain, Petr Pavlu, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Peter Zijlstra, live-patching, linux-modules, linux-kernel The klp_object_ext and klp_func_ext data, which are stored in the __klp_objects and __klp_funcs sections, respectively, are not needed after they are used to create the actual klp_object and klp_func instances. This operation is implemented by the init function in scripts/livepatch/init.c. Prefix the two sections with ".init" so they are freed after the module is initializated. Signed-off-by: Petr Pavlu <petr.pavlu@suse.com> --- kernel/livepatch/core.c | 3 ++- scripts/module.lds.S | 4 ++-- tools/objtool/check.c | 2 +- tools/objtool/include/objtool/klp.h | 10 +++++----- tools/objtool/klp-diff.c | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 4e0ac47b3623..3621a7c1b737 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -1364,7 +1364,8 @@ struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, for (int i = 1; i < info->hdr.e_shnum; i++) { Elf_Shdr *shdr = &info->sechdrs[i]; - if (strcmp(info->secstrings + shdr->sh_name, "__klp_objects")) + if (strcmp(info->secstrings + shdr->sh_name, + ".init.klp_objects")) continue; *nr_objs = shdr->sh_size / sizeof(struct klp_object_ext); diff --git a/scripts/module.lds.S b/scripts/module.lds.S index 383d19beffb4..054ef99e8288 100644 --- a/scripts/module.lds.S +++ b/scripts/module.lds.S @@ -34,8 +34,8 @@ SECTIONS { __patchable_function_entries : { *(__patchable_function_entries) } - __klp_funcs 0: ALIGN(8) { KEEP(*(__klp_funcs)) } - __klp_objects 0: ALIGN(8) { KEEP(*(__klp_objects)) } + .init.klp_funcs 0 : ALIGN(8) { KEEP(*(.init.klp_funcs)) } + .init.klp_objects 0 : ALIGN(8) { KEEP(*(.init.klp_objects)) } #ifdef CONFIG_ARCH_USES_CFI_TRAPS __kcfi_traps : { KEEP(*(.kcfi_traps)) } diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 3f7999317f4d..933868ee3beb 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -4761,7 +4761,7 @@ static int validate_ibt(struct objtool_file *file) !strcmp(sec->name, "__bug_table") || !strcmp(sec->name, "__ex_table") || !strcmp(sec->name, "__jump_table") || - !strcmp(sec->name, "__klp_funcs") || + !strcmp(sec->name, ".init.klp_funcs") || !strcmp(sec->name, "__mcount_loc") || !strcmp(sec->name, ".llvm.call-graph-profile") || !strcmp(sec->name, ".llvm_bb_addr_map") || diff --git a/tools/objtool/include/objtool/klp.h b/tools/objtool/include/objtool/klp.h index ad830a7ce55b..e32e5e8bc631 100644 --- a/tools/objtool/include/objtool/klp.h +++ b/tools/objtool/include/objtool/klp.h @@ -6,12 +6,12 @@ #define SHN_LIVEPATCH 0xff20 /* - * __klp_objects and __klp_funcs are created by klp diff and used by the patch - * module init code to build the klp_patch, klp_object and klp_func structs - * needed by the livepatch API. + * .init.klp_objects and .init.klp_funcs are created by klp diff and used by the + * patch module init code to build the klp_patch, klp_object and klp_func + * structs needed by the livepatch API. */ -#define KLP_OBJECTS_SEC "__klp_objects" -#define KLP_FUNCS_SEC "__klp_funcs" +#define KLP_OBJECTS_SEC ".init.klp_objects" +#define KLP_FUNCS_SEC ".init.klp_funcs" /* * __klp_relocs is an intermediate section which are created by klp diff and diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c index 4d1f9e9977eb..fd64d5e3c3b6 100644 --- a/tools/objtool/klp-diff.c +++ b/tools/objtool/klp-diff.c @@ -1439,7 +1439,7 @@ static int clone_special_sections(struct elfs *e) } /* - * Create __klp_objects and __klp_funcs sections which are intermediate + * Create .init.klp_objects and .init.klp_funcs sections which are intermediate * sections provided as input to the patch module's init code for building the * klp_patch, klp_object and klp_func structs for the livepatch API. */ -- 2.52.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] livepatch: Free klp_{object,func}_ext data after initialization 2026-01-14 12:29 ` [PATCH 2/2] livepatch: Free klp_{object,func}_ext data after initialization Petr Pavlu @ 2026-01-19 22:22 ` Joe Lawrence 0 siblings, 0 replies; 6+ messages in thread From: Joe Lawrence @ 2026-01-19 22:22 UTC (permalink / raw) To: Petr Pavlu Cc: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Luis Chamberlain, Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Peter Zijlstra, live-patching, linux-modules, linux-kernel On Wed, Jan 14, 2026 at 01:29:54PM +0100, Petr Pavlu wrote: > The klp_object_ext and klp_func_ext data, which are stored in the > __klp_objects and __klp_funcs sections, respectively, are not needed > after they are used to create the actual klp_object and klp_func > instances. This operation is implemented by the init function in > scripts/livepatch/init.c. > > Prefix the two sections with ".init" so they are freed after the module > is initializated. > > Signed-off-by: Petr Pavlu <petr.pavlu@suse.com> > --- > kernel/livepatch/core.c | 3 ++- > scripts/module.lds.S | 4 ++-- > tools/objtool/check.c | 2 +- > tools/objtool/include/objtool/klp.h | 10 +++++----- > tools/objtool/klp-diff.c | 2 +- > 5 files changed, 11 insertions(+), 10 deletions(-) > > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c > index 4e0ac47b3623..3621a7c1b737 100644 > --- a/kernel/livepatch/core.c > +++ b/kernel/livepatch/core.c > @@ -1364,7 +1364,8 @@ struct klp_object_ext *klp_build_locate_init_objects(const struct module *mod, > for (int i = 1; i < info->hdr.e_shnum; i++) { > Elf_Shdr *shdr = &info->sechdrs[i]; > > - if (strcmp(info->secstrings + shdr->sh_name, "__klp_objects")) > + if (strcmp(info->secstrings + shdr->sh_name, > + ".init.klp_objects")) > continue; > > *nr_objs = shdr->sh_size / sizeof(struct klp_object_ext); > diff --git a/scripts/module.lds.S b/scripts/module.lds.S > index 383d19beffb4..054ef99e8288 100644 > --- a/scripts/module.lds.S > +++ b/scripts/module.lds.S > @@ -34,8 +34,8 @@ SECTIONS { > > __patchable_function_entries : { *(__patchable_function_entries) } > > - __klp_funcs 0: ALIGN(8) { KEEP(*(__klp_funcs)) } > - __klp_objects 0: ALIGN(8) { KEEP(*(__klp_objects)) } > + .init.klp_funcs 0 : ALIGN(8) { KEEP(*(.init.klp_funcs)) } > + .init.klp_objects 0 : ALIGN(8) { KEEP(*(.init.klp_objects)) } > > #ifdef CONFIG_ARCH_USES_CFI_TRAPS > __kcfi_traps : { KEEP(*(.kcfi_traps)) } > diff --git a/tools/objtool/check.c b/tools/objtool/check.c > index 3f7999317f4d..933868ee3beb 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -4761,7 +4761,7 @@ static int validate_ibt(struct objtool_file *file) > !strcmp(sec->name, "__bug_table") || > !strcmp(sec->name, "__ex_table") || > !strcmp(sec->name, "__jump_table") || > - !strcmp(sec->name, "__klp_funcs") || > + !strcmp(sec->name, ".init.klp_funcs") || > !strcmp(sec->name, "__mcount_loc") || > !strcmp(sec->name, ".llvm.call-graph-profile") || > !strcmp(sec->name, ".llvm_bb_addr_map") || > diff --git a/tools/objtool/include/objtool/klp.h b/tools/objtool/include/objtool/klp.h > index ad830a7ce55b..e32e5e8bc631 100644 > --- a/tools/objtool/include/objtool/klp.h > +++ b/tools/objtool/include/objtool/klp.h > @@ -6,12 +6,12 @@ > #define SHN_LIVEPATCH 0xff20 > > /* > - * __klp_objects and __klp_funcs are created by klp diff and used by the patch > - * module init code to build the klp_patch, klp_object and klp_func structs > - * needed by the livepatch API. > + * .init.klp_objects and .init.klp_funcs are created by klp diff and used by the > + * patch module init code to build the klp_patch, klp_object and klp_func > + * structs needed by the livepatch API. > */ > -#define KLP_OBJECTS_SEC "__klp_objects" > -#define KLP_FUNCS_SEC "__klp_funcs" > +#define KLP_OBJECTS_SEC ".init.klp_objects" > +#define KLP_FUNCS_SEC ".init.klp_funcs" > > /* > * __klp_relocs is an intermediate section which are created by klp diff and > diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c > index 4d1f9e9977eb..fd64d5e3c3b6 100644 > --- a/tools/objtool/klp-diff.c > +++ b/tools/objtool/klp-diff.c > @@ -1439,7 +1439,7 @@ static int clone_special_sections(struct elfs *e) > } > > /* > - * Create __klp_objects and __klp_funcs sections which are intermediate > + * Create .init.klp_objects and .init.klp_funcs sections which are intermediate > * sections provided as input to the patch module's init code for building the > * klp_patch, klp_object and klp_func structs for the livepatch API. > */ > -- > 2.52.0 > Acked-by: Joe Lawrence <joe.lawrence@redhat.com> -- Joe ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-01-20 17:48 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-14 12:29 [PATCH 0/2] Improve handling of the __klp_{objects,funcs} sections in modules Petr Pavlu
2026-01-14 12:29 ` [PATCH 1/2] livepatch: Fix having __klp_objects relics in non-livepatch modules Petr Pavlu
2026-01-19 22:19 ` Joe Lawrence
2026-01-20 17:48 ` Petr Pavlu
2026-01-14 12:29 ` [PATCH 2/2] livepatch: Free klp_{object,func}_ext data after initialization Petr Pavlu
2026-01-19 22:22 ` Joe Lawrence
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox