Commit b525fcaf authored by Petr Pavlu's avatar Petr Pavlu Committed by Josh Poimboeuf
Browse files

livepatch: Free klp_{object,func}_ext data after initialization



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: default avatarPetr Pavlu <petr.pavlu@suse.com>
Acked-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
Acked-by: default avatarMiroslav Benes <mbenes@suse.cz>
Reviewed-by: default avatarAaron Tomlin <atomlin@atomlin.com>
Link: https://patch.msgid.link/20260123102825.3521961-3-petr.pavlu@suse.com


Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
parent ab108154
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+2 −2
Original line number Diff line number Diff line
@@ -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)) }
+1 −1
Original line number Diff line number Diff line
@@ -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")		||
+5 −5
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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.
 */