livepatch: Use lists to manage patches, objects and functions

Currently klp_patch contains a pointer to a statically allocated array of
struct klp_object and struct klp_objects contains a pointer to a statically
allocated array of klp_func. In order to allow for the dynamic allocation
of objects and functions, link klp_patch, klp_object, and klp_func together
via linked lists. This allows us to more easily allocate new objects and
functions, while having the iterator be a simple linked list walk.

The static structures are added to the lists early. It allows to add
the dynamically allocated objects before klp_init_object() and
klp_init_func() calls. Therefore it reduces the further changes
to the code.

This patch does not change the existing behavior.

Signed-off-by: Jason Baron <jbaron@akamai.com>
[pmladek@suse.com: Initialize lists before init calls]
Signed-off-by: Petr Mladek <pmladek@suse.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jiri Kosina <jikos@kernel.org>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
Jason Baron 2019-01-09 13:43:24 +01:00 committed by Jiri Kosina
parent 958ef1e39d
commit 20e5502595
2 changed files with 24 additions and 4 deletions

View file

@ -659,20 +659,25 @@ static int klp_init_patch_early(struct klp_patch *patch)
return -EINVAL;
INIT_LIST_HEAD(&patch->list);
INIT_LIST_HEAD(&patch->obj_list);
patch->kobj_added = false;
patch->enabled = false;
patch->forced = false;
INIT_WORK(&patch->free_work, klp_free_patch_work_fn);
init_completion(&patch->finish);
klp_for_each_object(patch, obj) {
klp_for_each_object_static(patch, obj) {
if (!obj->funcs)
return -EINVAL;
INIT_LIST_HEAD(&obj->func_list);
obj->kobj_added = false;
list_add_tail(&obj->node, &patch->obj_list);
klp_for_each_func(obj, func)
klp_for_each_func_static(obj, func) {
func->kobj_added = false;
list_add_tail(&func->node, &obj->func_list);
}
}
if (!try_module_get(patch->mod))