]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
livepatch: Free klp_{object,func}_ext data after initialization
authorPetr Pavlu <petr.pavlu@suse.com>
Fri, 23 Jan 2026 10:26:57 +0000 (11:26 +0100)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Thu, 5 Feb 2026 16:00:45 +0000 (08:00 -0800)
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>
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>
Link: https://patch.msgid.link/20260123102825.3521961-3-petr.pavlu@suse.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
scripts/livepatch/init.c
scripts/module.lds.S
tools/objtool/check.c
tools/objtool/include/objtool/klp.h
tools/objtool/klp-diff.c

index 9e315fc857bd82f04b3cc6d1529f9e897e211168..638c95cffe76de43b6e5471454eb6d64e282472a 100644 (file)
@@ -19,7 +19,7 @@ static int __init livepatch_mod_init(void)
        unsigned int nr_objs;
        int ret;
 
-       obj_exts = klp_find_section_by_name(THIS_MODULE, "__klp_objects",
+       obj_exts = klp_find_section_by_name(THIS_MODULE, ".init.klp_objects",
                                            &obj_exts_sec_size);
        nr_objs = obj_exts_sec_size / sizeof(*obj_exts);
        if (!nr_objs) {
index 383d19beffb4918501dcbb110ae5e9a47792c173..054ef99e828867695480c68c6c193b4a78015115 100644 (file)
@@ -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)) }
index 3f7999317f4dfacbcec5163a536556873221a0f6..933868ee3beb2282c795bbc8c9870ae40b1474c2 100644 (file)
@@ -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")             ||
index ad830a7ce55b6ee263da6d65475772935206fff5..e32e5e8bc631294471726ff05b71eb56adf2e008 100644 (file)
@@ -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
index d94531e3f64e3d673afa53785c9153ab88acfa1a..1e649a3eb4cdf36c365cd3cf635f13e0c6f8cc16 100644 (file)
@@ -1436,7 +1436,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.
  */