提交 3b61044c 编写于 作者: L Li Huafei 提交者: Jialin Zhang

livepatch: Cleanup klp_mem_prepare()

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I6NVPT

--------------------------------

When klp_mem_prepare() fails, the requested resources are not cleared.
We'd better clean up each newly requested resource upon error return.
Signed-off-by: NLi Huafei <lihuafei1@huawei.com>
Reviewed-by: NXu Kuohai <xukuohai@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Signed-off-by: NZheng Yejian <zhengyejian1@huawei.com>
Reviewed-by: NXu Kuohai <xukuohai@huawei.com>
Signed-off-by: NJialin Zhang <zhangjialin11@huawei.com>
上级 e01e7676
...@@ -1408,33 +1408,34 @@ static void func_node_free(struct klp_func *func) ...@@ -1408,33 +1408,34 @@ static void func_node_free(struct klp_func *func)
} }
} }
static int klp_mem_prepare(struct klp_patch *patch) static void klp_mem_recycle(struct klp_patch *patch)
{ {
struct klp_object *obj; struct klp_object *obj;
struct klp_func *func; struct klp_func *func;
klp_for_each_object(patch, obj) { klp_for_each_object(patch, obj) {
klp_for_each_func(obj, func) { klp_for_each_func(obj, func) {
func->func_node = func_node_alloc(func); func_node_free(func);
if (func->func_node == NULL) {
pr_err("alloc func_node failed\n");
return -ENOMEM;
}
} }
} }
return 0;
} }
static void klp_mem_recycle(struct klp_patch *patch) static int klp_mem_prepare(struct klp_patch *patch)
{ {
struct klp_object *obj; struct klp_object *obj;
struct klp_func *func; struct klp_func *func;
klp_for_each_object(patch, obj) { klp_for_each_object(patch, obj) {
klp_for_each_func(obj, func) { klp_for_each_func(obj, func) {
func_node_free(func); func->func_node = func_node_alloc(func);
if (func->func_node == NULL) {
klp_mem_recycle(patch);
pr_err("alloc func_node failed\n");
return -ENOMEM;
}
} }
} }
return 0;
} }
static int __klp_disable_patch(struct klp_patch *patch) static int __klp_disable_patch(struct klp_patch *patch)
...@@ -1697,8 +1698,11 @@ static int __klp_enable_patch(struct klp_patch *patch) ...@@ -1697,8 +1698,11 @@ static int __klp_enable_patch(struct klp_patch *patch)
arch_klp_code_modify_prepare(); arch_klp_code_modify_prepare();
ret = klp_mem_prepare(patch); ret = klp_mem_prepare(patch);
if (ret == 0) if (ret) {
ret = stop_machine(klp_try_enable_patch, &patch_data, cpu_online_mask); arch_klp_code_modify_post_process();
return ret;
}
ret = stop_machine(klp_try_enable_patch, &patch_data, cpu_online_mask);
arch_klp_code_modify_post_process(); arch_klp_code_modify_post_process();
if (ret) { if (ret) {
klp_mem_recycle(patch); klp_mem_recycle(patch);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册