Skip to content

Commit

Permalink
livepatch: make kobject in klp_object statically allocated
Browse files Browse the repository at this point in the history
Make kobj variable (of type struct kobject) statically allocated in
klp_object structure. It will allow us to move in the func-object-patch
hierarchy through kobject links.

The only reason to have it dynamic was to not have empty release
callback in the code. However we have empty callbacks for function and
patch in the code now, so it is no longer valid and the advantage of
static allocation is clear.

Signed-off-by: Miroslav Benes <[email protected]>
Signed-off-by: Jiri Slaby <[email protected]>
Acked-by: Josh Poimboeuf <[email protected]>
Signed-off-by: Jiri Kosina <[email protected]>
  • Loading branch information
mirab authored and Jiri Kosina committed May 19, 2015
1 parent 36e505c commit cad706d
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
2 changes: 1 addition & 1 deletion include/linux/livepatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ struct klp_object {
struct klp_func *funcs;

/* internal */
struct kobject *kobj;
struct kobject kobj;
struct module *mod;
enum klp_state state;
};
Expand Down
22 changes: 16 additions & 6 deletions kernel/livepatch/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,15 @@ static struct kobj_type klp_ktype_patch = {
.default_attrs = klp_patch_attrs,
};

static void klp_kobj_release_object(struct kobject *kobj)
{
}

static struct kobj_type klp_ktype_object = {
.release = klp_kobj_release_object,
.sysfs_ops = &kobj_sysfs_ops,
};

static void klp_kobj_release_func(struct kobject *kobj)
{
}
Expand Down Expand Up @@ -695,7 +704,7 @@ static void klp_free_objects_limited(struct klp_patch *patch,

for (obj = patch->objs; obj->funcs && obj != limit; obj++) {
klp_free_funcs_limited(obj, NULL);
kobject_put(obj->kobj);
kobject_put(&obj->kobj);
}
}

Expand All @@ -713,7 +722,7 @@ static int klp_init_func(struct klp_object *obj, struct klp_func *func)
func->state = KLP_DISABLED;

return kobject_init_and_add(&func->kobj, &klp_ktype_func,
obj->kobj, "%s", func->old_name);
&obj->kobj, "%s", func->old_name);
}

/* parts of the initialization that is done only when the object is loaded */
Expand Down Expand Up @@ -753,9 +762,10 @@ static int klp_init_object(struct klp_patch *patch, struct klp_object *obj)
klp_find_object_module(obj);

name = klp_is_module(obj) ? obj->name : "vmlinux";
obj->kobj = kobject_create_and_add(name, &patch->kobj);
if (!obj->kobj)
return -ENOMEM;
ret = kobject_init_and_add(&obj->kobj, &klp_ktype_object,
&patch->kobj, "%s", name);
if (ret)
return ret;

for (func = obj->funcs; func->old_name; func++) {
ret = klp_init_func(obj, func);
Expand All @@ -773,7 +783,7 @@ static int klp_init_object(struct klp_patch *patch, struct klp_object *obj)

free:
klp_free_funcs_limited(obj, func);
kobject_put(obj->kobj);
kobject_put(&obj->kobj);
return ret;
}

Expand Down

0 comments on commit cad706d

Please sign in to comment.