struct klp_func will be used not only for functions to be patched but also for functions which must not be found on a stack. Move the initialization of needed struct members to a separate function, so the code can be reused.
Signed-off-by: Miroslav Benes mbenes@suse.cz --- kernel/livepatch/core.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-)
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 335d988bd811..3d8e3caf9f92 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -767,6 +767,28 @@ static int klp_apply_object_relocs(struct klp_patch *patch, return 0; }
+static int klp_init_old_func(struct klp_object *obj, + struct klp_func *func) +{ + int ret; + + ret = klp_find_object_symbol(obj->name, func->old_name, + func->old_sympos, + (unsigned long *)&func->old_func); + if (ret) + return ret; + + ret = kallsyms_lookup_size_offset((unsigned long)func->old_func, + &func->old_size, NULL); + if (!ret) { + pr_err("kallsyms size lookup failed for '%s'\n", + func->old_name); + return -ENOENT; + } + + return 0; +} + /* parts of the initialization that is done only when the object is loaded */ static int klp_init_object_loaded(struct klp_patch *patch, struct klp_object *obj) @@ -787,20 +809,10 @@ static int klp_init_object_loaded(struct klp_patch *patch, }
klp_for_each_func(obj, func) { - ret = klp_find_object_symbol(obj->name, func->old_name, - func->old_sympos, - (unsigned long *)&func->old_func); + ret = klp_init_old_func(obj, func); if (ret) return ret;
- ret = kallsyms_lookup_size_offset((unsigned long)func->old_func, - &func->old_size, NULL); - if (!ret) { - pr_err("kallsyms size lookup failed for '%s'\n", - func->old_name); - return -ENOENT; - } - if (func->nop) func->new_func = func->old_func;