kfree(obj);
 }
 
-static struct kobj_type klp_ktype_object;
-static struct kobj_type klp_ktype_func;
+static void klp_init_func_early(struct klp_object *obj,
+                               struct klp_func *func);
+static void klp_init_object_early(struct klp_patch *patch,
+                                 struct klp_object *obj);
 
-static struct klp_object *klp_alloc_object_dynamic(const char *name)
+static struct klp_object *klp_alloc_object_dynamic(const char *name,
+                                                  struct klp_patch *patch)
 {
        struct klp_object *obj;
 
                }
        }
 
-       INIT_LIST_HEAD(&obj->func_list);
-       kobject_init(&obj->kobj, &klp_ktype_object);
+       klp_init_object_early(patch, obj);
        obj->dynamic = true;
 
        return obj;
                }
        }
 
-       kobject_init(&func->kobj, &klp_ktype_func);
+       klp_init_func_early(obj, func);
        /*
         * func->new_func is same as func->old_func. These addresses are
         * set when the object is loaded, see klp_init_object_loaded().
        obj = klp_find_object(patch, old_obj);
 
        if (!obj) {
-               obj = klp_alloc_object_dynamic(old_obj->name);
+               obj = klp_alloc_object_dynamic(old_obj->name, patch);
                if (!obj)
                        return -ENOMEM;
-
-               list_add_tail(&obj->node, &patch->obj_list);
        }
 
        klp_for_each_func(old_obj, old_func) {
                func = klp_alloc_func_nop(old_func, obj);
                if (!func)
                        return -ENOMEM;
-
-               list_add_tail(&func->node, &obj->func_list);
        }
 
        return 0;
        return ret;
 }
 
+static void klp_init_func_early(struct klp_object *obj,
+                               struct klp_func *func)
+{
+       kobject_init(&func->kobj, &klp_ktype_func);
+       list_add_tail(&func->node, &obj->func_list);
+}
+
+static void klp_init_object_early(struct klp_patch *patch,
+                                 struct klp_object *obj)
+{
+       INIT_LIST_HEAD(&obj->func_list);
+       kobject_init(&obj->kobj, &klp_ktype_object);
+       list_add_tail(&obj->node, &patch->obj_list);
+}
+
 static int klp_init_patch_early(struct klp_patch *patch)
 {
        struct klp_object *obj;
                if (!obj->funcs)
                        return -EINVAL;
 
-               INIT_LIST_HEAD(&obj->func_list);
-               kobject_init(&obj->kobj, &klp_ktype_object);
-               list_add_tail(&obj->node, &patch->obj_list);
+               klp_init_object_early(patch, obj);
 
                klp_for_each_func_static(obj, func) {
-                       kobject_init(&func->kobj, &klp_ktype_func);
-                       list_add_tail(&func->node, &obj->func_list);
+                       klp_init_func_early(obj, func);
                }
        }