• Home
  • Raw
  • Download

Lines Matching refs:patch

91 static bool klp_is_patch_registered(struct klp_patch *patch)  in klp_is_patch_registered()  argument
96 if (mypatch == patch) in klp_is_patch_registered()
287 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
293 if (!list_is_last(&patch->list, &klp_patches) && in __klp_disable_patch()
294 list_next_entry(patch, list)->enabled) in __klp_disable_patch()
297 klp_init_transition(patch, KLP_UNPATCHED); in __klp_disable_patch()
310 patch->enabled = false; in __klp_disable_patch()
323 int klp_disable_patch(struct klp_patch *patch) in klp_disable_patch() argument
329 if (!klp_is_patch_registered(patch)) { in klp_disable_patch()
334 if (!patch->enabled) { in klp_disable_patch()
339 ret = __klp_disable_patch(patch); in klp_disable_patch()
347 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
355 if (WARN_ON(patch->enabled)) in __klp_enable_patch()
359 if (patch->list.prev != &klp_patches && in __klp_enable_patch()
360 !list_prev_entry(patch, list)->enabled) in __klp_enable_patch()
372 if (!try_module_get(patch->mod)) in __klp_enable_patch()
375 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
377 klp_init_transition(patch, KLP_PATCHED); in __klp_enable_patch()
388 klp_for_each_object(patch, obj) { in __klp_enable_patch()
395 patch->mod->name); in __klp_enable_patch()
404 patch->enabled = true; in __klp_enable_patch()
418 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
424 if (!klp_is_patch_registered(patch)) { in klp_enable_patch()
429 ret = __klp_enable_patch(patch); in klp_enable_patch()
451 struct klp_patch *patch; in enabled_store() local
459 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
463 if (!klp_is_patch_registered(patch)) { in enabled_store()
472 if (patch->enabled == enabled) { in enabled_store()
478 if (patch == klp_transition_patch) { in enabled_store()
481 ret = __klp_enable_patch(patch); in enabled_store()
485 ret = __klp_disable_patch(patch); in enabled_store()
502 struct klp_patch *patch; in enabled_show() local
504 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
505 return snprintf(buf, PAGE_SIZE-1, "%d\n", patch->enabled); in enabled_show()
511 struct klp_patch *patch; in transition_show() local
513 patch = container_of(kobj, struct klp_patch, kobj); in transition_show()
515 patch == klp_transition_patch); in transition_show()
528 struct klp_patch *patch; in klp_kobj_release_patch() local
530 patch = container_of(kobj, struct klp_patch, kobj); in klp_kobj_release_patch()
531 complete(&patch->finish); in klp_kobj_release_patch()
586 static void klp_free_objects_limited(struct klp_patch *patch, in klp_free_objects_limited() argument
591 for (obj = patch->objs; obj->funcs && obj != limit; obj++) { in klp_free_objects_limited()
597 static void klp_free_patch(struct klp_patch *patch) in klp_free_patch() argument
599 klp_free_objects_limited(patch, NULL); in klp_free_patch()
600 if (!list_empty(&patch->list)) in klp_free_patch()
601 list_del(&patch->list); in klp_free_patch()
627 void __weak arch_klp_init_object_loaded(struct klp_patch *patch, in arch_klp_init_object_loaded() argument
633 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
641 module_disable_ro(patch->mod); in klp_init_object_loaded()
642 ret = klp_write_object_relocations(patch->mod, obj); in klp_init_object_loaded()
644 module_enable_ro(patch->mod, true); in klp_init_object_loaded()
649 arch_klp_init_object_loaded(patch, obj); in klp_init_object_loaded()
650 module_enable_ro(patch->mod, true); in klp_init_object_loaded()
681 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
700 &patch->kobj, "%s", name); in klp_init_object()
711 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
724 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
729 if (!patch->objs) in klp_init_patch()
734 patch->enabled = false; in klp_init_patch()
735 init_completion(&patch->finish); in klp_init_patch()
737 ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch, in klp_init_patch()
738 klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
744 klp_for_each_object(patch, obj) { in klp_init_patch()
745 ret = klp_init_object(patch, obj); in klp_init_patch()
750 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
757 klp_free_objects_limited(patch, obj); in klp_init_patch()
761 kobject_put(&patch->kobj); in klp_init_patch()
762 wait_for_completion(&patch->finish); in klp_init_patch()
775 int klp_unregister_patch(struct klp_patch *patch) in klp_unregister_patch() argument
781 if (!klp_is_patch_registered(patch)) { in klp_unregister_patch()
786 if (patch->enabled) { in klp_unregister_patch()
791 klp_free_patch(patch); in klp_unregister_patch()
795 kobject_put(&patch->kobj); in klp_unregister_patch()
796 wait_for_completion(&patch->finish); in klp_unregister_patch()
817 int klp_register_patch(struct klp_patch *patch) in klp_register_patch() argument
819 if (!patch || !patch->mod) in klp_register_patch()
822 if (!is_livepatch_module(patch->mod)) { in klp_register_patch()
824 patch->mod->name); in klp_register_patch()
836 if (!klp_have_reliable_stack() && !patch->immediate) { in klp_register_patch()
841 return klp_init_patch(patch); in klp_register_patch()
853 struct klp_patch *patch; in klp_cleanup_module_patches_limited() local
856 list_for_each_entry(patch, &klp_patches, list) { in klp_cleanup_module_patches_limited()
857 if (patch == limit) in klp_cleanup_module_patches_limited()
860 klp_for_each_object(patch, obj) { in klp_cleanup_module_patches_limited()
868 if (patch->enabled || patch == klp_transition_patch) { in klp_cleanup_module_patches_limited()
870 patch->mod->name, obj->mod->name); in klp_cleanup_module_patches_limited()
883 struct klp_patch *patch; in klp_module_coming() local
897 list_for_each_entry(patch, &klp_patches, list) { in klp_module_coming()
898 klp_for_each_object(patch, obj) { in klp_module_coming()
904 ret = klp_init_object_loaded(patch, obj); in klp_module_coming()
907 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
915 if (!patch->enabled && patch != klp_transition_patch) in klp_module_coming()
919 patch->mod->name, obj->mod->name); in klp_module_coming()
924 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
942 patch->mod->name, obj->mod->name, obj->mod->name); in klp_module_coming()
945 klp_cleanup_module_patches_limited(mod, patch); in klp_module_coming()