Lines Matching refs:patch

106 static struct klp_object *klp_find_object(struct klp_patch *patch,  in klp_find_object()  argument
111 klp_for_each_object(patch, obj) { in klp_find_object()
359 static int __klp_disable_patch(struct klp_patch *patch);
364 struct klp_patch *patch; in enabled_store() local
372 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
376 if (patch->enabled == enabled) { in enabled_store()
389 if (patch == klp_transition_patch) in enabled_store()
392 ret = __klp_disable_patch(patch); in enabled_store()
407 struct klp_patch *patch; in enabled_show() local
409 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
410 return sysfs_emit(buf, "%d\n", patch->enabled); in enabled_show()
416 struct klp_patch *patch; in transition_show() local
418 patch = container_of(kobj, struct klp_patch, kobj); in transition_show()
419 return sysfs_emit(buf, "%d\n", patch == klp_transition_patch); in transition_show()
425 struct klp_patch *patch; in force_store() local
438 patch = container_of(kobj, struct klp_patch, kobj); in force_store()
439 if (patch != klp_transition_patch) { in force_store()
454 struct klp_patch *patch; in replace_show() local
456 patch = container_of(kobj, struct klp_patch, kobj); in replace_show()
457 return sysfs_emit(buf, "%d\n", patch->replace); in replace_show()
463 struct klp_patch *patch, *this_patch; in stack_order_show() local
470 klp_for_each_patch(patch) { in stack_order_show()
472 if (patch == this_patch) in stack_order_show()
520 static void klp_init_object_early(struct klp_patch *patch,
524 struct klp_patch *patch) in klp_alloc_object_dynamic() argument
540 klp_init_object_early(patch, obj); in klp_alloc_object_dynamic()
580 static int klp_add_object_nops(struct klp_patch *patch, in klp_add_object_nops() argument
586 obj = klp_find_object(patch, old_obj); in klp_add_object_nops()
589 obj = klp_alloc_object_dynamic(old_obj->name, patch); in klp_add_object_nops()
615 static int klp_add_nops(struct klp_patch *patch) in klp_add_nops() argument
624 err = klp_add_object_nops(patch, old_obj); in klp_add_nops()
635 struct klp_patch *patch; in klp_kobj_release_patch() local
637 patch = container_of(kobj, struct klp_patch, kobj); in klp_kobj_release_patch()
638 complete(&patch->finish); in klp_kobj_release_patch()
706 static void __klp_free_objects(struct klp_patch *patch, bool nops_only) in __klp_free_objects() argument
710 klp_for_each_object_safe(patch, obj, tmp_obj) { in __klp_free_objects()
721 static void klp_free_objects(struct klp_patch *patch) in klp_free_objects() argument
723 __klp_free_objects(patch, false); in klp_free_objects()
726 static void klp_free_objects_dynamic(struct klp_patch *patch) in klp_free_objects_dynamic() argument
728 __klp_free_objects(patch, true); in klp_free_objects_dynamic()
738 static void klp_free_patch_start(struct klp_patch *patch) in klp_free_patch_start() argument
740 if (!list_empty(&patch->list)) in klp_free_patch_start()
741 list_del(&patch->list); in klp_free_patch_start()
743 klp_free_objects(patch); in klp_free_patch_start()
754 static void klp_free_patch_finish(struct klp_patch *patch) in klp_free_patch_finish() argument
762 kobject_put(&patch->kobj); in klp_free_patch_finish()
763 wait_for_completion(&patch->finish); in klp_free_patch_finish()
766 if (!patch->forced) in klp_free_patch_finish()
767 module_put(patch->mod); in klp_free_patch_finish()
777 struct klp_patch *patch = in klp_free_patch_work_fn() local
780 klp_free_patch_finish(patch); in klp_free_patch_work_fn()
783 void klp_free_patch_async(struct klp_patch *patch) in klp_free_patch_async() argument
785 klp_free_patch_start(patch); in klp_free_patch_async()
786 schedule_work(&patch->free_work); in klp_free_patch_async()
829 static int klp_write_object_relocs(struct klp_patch *patch, in klp_write_object_relocs() argument
834 struct klp_modinfo *info = patch->mod->klp_info; in klp_write_object_relocs()
842 ret = klp_write_section_relocs(patch->mod, info->sechdrs, in klp_write_object_relocs()
844 patch->mod->core_kallsyms.strtab, in klp_write_object_relocs()
853 static int klp_apply_object_relocs(struct klp_patch *patch, in klp_apply_object_relocs() argument
856 return klp_write_object_relocs(patch, obj, true); in klp_apply_object_relocs()
859 static void klp_clear_object_relocs(struct klp_patch *patch, in klp_clear_object_relocs() argument
862 klp_write_object_relocs(patch, obj, false); in klp_clear_object_relocs()
866 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
879 ret = klp_apply_object_relocs(patch, obj); in klp_init_object_loaded()
914 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
929 ret = kobject_add(&obj->kobj, &patch->kobj, "%s", name); in klp_init_object()
940 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
952 static void klp_init_object_early(struct klp_patch *patch, in klp_init_object_early() argument
957 list_add_tail(&obj->node, &patch->obj_list); in klp_init_object_early()
960 static void klp_init_patch_early(struct klp_patch *patch) in klp_init_patch_early() argument
965 INIT_LIST_HEAD(&patch->list); in klp_init_patch_early()
966 INIT_LIST_HEAD(&patch->obj_list); in klp_init_patch_early()
967 kobject_init(&patch->kobj, &klp_ktype_patch); in klp_init_patch_early()
968 patch->enabled = false; in klp_init_patch_early()
969 patch->forced = false; in klp_init_patch_early()
970 INIT_WORK(&patch->free_work, klp_free_patch_work_fn); in klp_init_patch_early()
971 init_completion(&patch->finish); in klp_init_patch_early()
973 klp_for_each_object_static(patch, obj) { in klp_init_patch_early()
974 klp_init_object_early(patch, obj); in klp_init_patch_early()
982 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
987 ret = kobject_add(&patch->kobj, klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
991 if (patch->replace) { in klp_init_patch()
992 ret = klp_add_nops(patch); in klp_init_patch()
997 klp_for_each_object(patch, obj) { in klp_init_patch()
998 ret = klp_init_object(patch, obj); in klp_init_patch()
1003 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
1008 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
1012 if (WARN_ON(!patch->enabled)) in __klp_disable_patch()
1018 klp_init_transition(patch, KLP_TRANSITION_UNPATCHED); in __klp_disable_patch()
1020 klp_for_each_object(patch, obj) in __klp_disable_patch()
1034 patch->enabled = false; in __klp_disable_patch()
1040 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
1048 if (WARN_ON(patch->enabled)) in __klp_enable_patch()
1051 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
1053 klp_init_transition(patch, KLP_TRANSITION_PATCHED); in __klp_enable_patch()
1064 klp_for_each_object(patch, obj) { in __klp_enable_patch()
1084 patch->enabled = true; in __klp_enable_patch()
1089 pr_warn("failed to enable patch '%s'\n", patch->mod->name); in __klp_enable_patch()
1108 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
1113 if (!patch || !patch->mod || !patch->objs) in klp_enable_patch()
1116 klp_for_each_object_static(patch, obj) { in klp_enable_patch()
1122 if (!is_livepatch_module(patch->mod)) { in klp_enable_patch()
1124 patch->mod->name); in klp_enable_patch()
1138 if (!klp_is_patch_compatible(patch)) { in klp_enable_patch()
1140 patch->mod->name); in klp_enable_patch()
1145 if (!try_module_get(patch->mod)) { in klp_enable_patch()
1150 klp_init_patch_early(patch); in klp_enable_patch()
1152 ret = klp_init_patch(patch); in klp_enable_patch()
1156 ret = __klp_enable_patch(patch); in klp_enable_patch()
1165 klp_free_patch_start(patch); in klp_enable_patch()
1169 klp_free_patch_finish(patch); in klp_enable_patch()
1233 struct klp_patch *patch; in klp_cleanup_module_patches_limited() local
1236 klp_for_each_patch(patch) { in klp_cleanup_module_patches_limited()
1237 if (patch == limit) in klp_cleanup_module_patches_limited()
1240 klp_for_each_object(patch, obj) { in klp_cleanup_module_patches_limited()
1244 if (patch != klp_transition_patch) in klp_cleanup_module_patches_limited()
1248 patch->mod->name, obj->mod->name); in klp_cleanup_module_patches_limited()
1252 klp_clear_object_relocs(patch, obj); in klp_cleanup_module_patches_limited()
1262 struct klp_patch *patch; in klp_module_coming() local
1281 klp_for_each_patch(patch) { in klp_module_coming()
1282 klp_for_each_object(patch, obj) { in klp_module_coming()
1288 ret = klp_init_object_loaded(patch, obj); in klp_module_coming()
1291 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
1296 patch->mod->name, obj->mod->name); in klp_module_coming()
1308 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
1314 if (patch != klp_transition_patch) in klp_module_coming()
1331 patch->mod->name, obj->mod->name, obj->mod->name); in klp_module_coming()
1334 klp_cleanup_module_patches_limited(mod, patch); in klp_module_coming()