aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/livepatch/core.c
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2019-05-03 09:26:25 -0400
committerJiri Kosina <jkosina@suse.cz>2019-05-03 15:11:23 -0400
commitf68d67cf2f83dc82675969724b59ca7c6da43fa9 (patch)
tree6e31bc1427031d1cf8321f4fa0aece2aa7feb4c7 /kernel/livepatch/core.c
parent4d141ab3416d90f87775f5dee725efdf40110a8f (diff)
livepatch: Remove duplicated code for early initialization
kobject_init() call added one more operation that has to be done when doing the early initialization of both static and dynamic livepatch structures. It would have been easier when the early initialization code was not duplicated. Let's deduplicate it for future generations of livepatching hackers. The patch does not change the existing behavior. Signed-off-by: Petr Mladek <pmladek@suse.com> Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com> Acked-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'kernel/livepatch/core.c')
-rw-r--r--kernel/livepatch/core.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 42385f23252a..f12c0eabd843 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -426,10 +426,13 @@ static void klp_free_object_dynamic(struct klp_object *obj)
426 kfree(obj); 426 kfree(obj);
427} 427}
428 428
429static struct kobj_type klp_ktype_object; 429static void klp_init_func_early(struct klp_object *obj,
430static struct kobj_type klp_ktype_func; 430 struct klp_func *func);
431static void klp_init_object_early(struct klp_patch *patch,
432 struct klp_object *obj);
431 433
432static struct klp_object *klp_alloc_object_dynamic(const char *name) 434static struct klp_object *klp_alloc_object_dynamic(const char *name,
435 struct klp_patch *patch)
433{ 436{
434 struct klp_object *obj; 437 struct klp_object *obj;
435 438
@@ -445,8 +448,7 @@ static struct klp_object *klp_alloc_object_dynamic(const char *name)
445 } 448 }
446 } 449 }
447 450
448 INIT_LIST_HEAD(&obj->func_list); 451 klp_init_object_early(patch, obj);
449 kobject_init(&obj->kobj, &klp_ktype_object);
450 obj->dynamic = true; 452 obj->dynamic = true;
451 453
452 return obj; 454 return obj;
@@ -475,7 +477,7 @@ static struct klp_func *klp_alloc_func_nop(struct klp_func *old_func,
475 } 477 }
476 } 478 }
477 479
478 kobject_init(&func->kobj, &klp_ktype_func); 480 klp_init_func_early(obj, func);
479 /* 481 /*
480 * func->new_func is same as func->old_func. These addresses are 482 * func->new_func is same as func->old_func. These addresses are
481 * set when the object is loaded, see klp_init_object_loaded(). 483 * set when the object is loaded, see klp_init_object_loaded().
@@ -495,11 +497,9 @@ static int klp_add_object_nops(struct klp_patch *patch,
495 obj = klp_find_object(patch, old_obj); 497 obj = klp_find_object(patch, old_obj);
496 498
497 if (!obj) { 499 if (!obj) {
498 obj = klp_alloc_object_dynamic(old_obj->name); 500 obj = klp_alloc_object_dynamic(old_obj->name, patch);
499 if (!obj) 501 if (!obj)
500 return -ENOMEM; 502 return -ENOMEM;
501
502 list_add_tail(&obj->node, &patch->obj_list);
503 } 503 }
504 504
505 klp_for_each_func(old_obj, old_func) { 505 klp_for_each_func(old_obj, old_func) {
@@ -510,8 +510,6 @@ static int klp_add_object_nops(struct klp_patch *patch,
510 func = klp_alloc_func_nop(old_func, obj); 510 func = klp_alloc_func_nop(old_func, obj);
511 if (!func) 511 if (!func)
512 return -ENOMEM; 512 return -ENOMEM;
513
514 list_add_tail(&func->node, &obj->func_list);
515 } 513 }
516 514
517 return 0; 515 return 0;
@@ -802,6 +800,21 @@ static int klp_init_object(struct klp_patch *patch, struct klp_object *obj)
802 return ret; 800 return ret;
803} 801}
804 802
803static void klp_init_func_early(struct klp_object *obj,
804 struct klp_func *func)
805{
806 kobject_init(&func->kobj, &klp_ktype_func);
807 list_add_tail(&func->node, &obj->func_list);
808}
809
810static void klp_init_object_early(struct klp_patch *patch,
811 struct klp_object *obj)
812{
813 INIT_LIST_HEAD(&obj->func_list);
814 kobject_init(&obj->kobj, &klp_ktype_object);
815 list_add_tail(&obj->node, &patch->obj_list);
816}
817
805static int klp_init_patch_early(struct klp_patch *patch) 818static int klp_init_patch_early(struct klp_patch *patch)
806{ 819{
807 struct klp_object *obj; 820 struct klp_object *obj;
@@ -822,13 +835,10 @@ static int klp_init_patch_early(struct klp_patch *patch)
822 if (!obj->funcs) 835 if (!obj->funcs)
823 return -EINVAL; 836 return -EINVAL;
824 837
825 INIT_LIST_HEAD(&obj->func_list); 838 klp_init_object_early(patch, obj);
826 kobject_init(&obj->kobj, &klp_ktype_object);
827 list_add_tail(&obj->node, &patch->obj_list);
828 839
829 klp_for_each_func_static(obj, func) { 840 klp_for_each_func_static(obj, func) {
830 kobject_init(&func->kobj, &klp_ktype_func); 841 klp_init_func_early(obj, func);
831 list_add_tail(&func->node, &obj->func_list);
832 } 842 }
833 } 843 }
834 844