Lines Matching refs:patch
85 static bool klp_is_patch_registered(struct klp_patch *patch) in klp_is_patch_registered() argument
90 if (mypatch == patch) in klp_is_patch_registered()
281 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
285 if (WARN_ON(!patch->enabled)) in __klp_disable_patch()
292 if (!list_is_last(&patch->list, &klp_patches) && in __klp_disable_patch()
293 list_next_entry(patch, list)->enabled) in __klp_disable_patch()
296 klp_init_transition(patch, KLP_UNPATCHED); in __klp_disable_patch()
298 klp_for_each_object(patch, obj) in __klp_disable_patch()
313 patch->enabled = false; in __klp_disable_patch()
326 int klp_disable_patch(struct klp_patch *patch) in klp_disable_patch() argument
332 if (!klp_is_patch_registered(patch)) { in klp_disable_patch()
337 if (!patch->enabled) { in klp_disable_patch()
342 ret = __klp_disable_patch(patch); in klp_disable_patch()
350 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
358 if (WARN_ON(patch->enabled)) in __klp_enable_patch()
362 if (patch->list.prev != &klp_patches && in __klp_enable_patch()
363 !list_prev_entry(patch, list)->enabled) in __klp_enable_patch()
370 if (!try_module_get(patch->mod)) in __klp_enable_patch()
373 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
375 klp_init_transition(patch, KLP_PATCHED); in __klp_enable_patch()
386 klp_for_each_object(patch, obj) { in __klp_enable_patch()
407 patch->enabled = true; in __klp_enable_patch()
411 pr_warn("failed to enable patch '%s'\n", patch->mod->name); in __klp_enable_patch()
426 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
432 if (!klp_is_patch_registered(patch)) { in klp_enable_patch()
437 ret = __klp_enable_patch(patch); in klp_enable_patch()
461 struct klp_patch *patch; in enabled_store() local
469 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
473 if (!klp_is_patch_registered(patch)) { in enabled_store()
482 if (patch->enabled == enabled) { in enabled_store()
488 if (patch == klp_transition_patch) { in enabled_store()
491 ret = __klp_enable_patch(patch); in enabled_store()
495 ret = __klp_disable_patch(patch); in enabled_store()
512 struct klp_patch *patch; in enabled_show() local
514 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
515 return snprintf(buf, PAGE_SIZE-1, "%d\n", patch->enabled); in enabled_show()
521 struct klp_patch *patch; in transition_show() local
523 patch = container_of(kobj, struct klp_patch, kobj); in transition_show()
525 patch == klp_transition_patch); in transition_show()
531 struct klp_patch *patch; in signal_store() local
544 patch = container_of(kobj, struct klp_patch, kobj); in signal_store()
545 if (patch != klp_transition_patch) { in signal_store()
560 struct klp_patch *patch; in force_store() local
573 patch = container_of(kobj, struct klp_patch, kobj); in force_store()
574 if (patch != klp_transition_patch) { in force_store()
600 struct klp_patch *patch; in klp_kobj_release_patch() local
602 patch = container_of(kobj, struct klp_patch, kobj); in klp_kobj_release_patch()
603 complete(&patch->finish); in klp_kobj_release_patch()
658 static void klp_free_objects_limited(struct klp_patch *patch, in klp_free_objects_limited() argument
663 for (obj = patch->objs; obj->funcs && obj != limit; obj++) { in klp_free_objects_limited()
669 static void klp_free_patch(struct klp_patch *patch) in klp_free_patch() argument
671 klp_free_objects_limited(patch, NULL); in klp_free_patch()
672 if (!list_empty(&patch->list)) in klp_free_patch()
673 list_del(&patch->list); in klp_free_patch()
699 void __weak arch_klp_init_object_loaded(struct klp_patch *patch, in arch_klp_init_object_loaded() argument
705 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
711 module_disable_ro(patch->mod); in klp_init_object_loaded()
712 ret = klp_write_object_relocations(patch->mod, obj); in klp_init_object_loaded()
714 module_enable_ro(patch->mod, true); in klp_init_object_loaded()
718 arch_klp_init_object_loaded(patch, obj); in klp_init_object_loaded()
719 module_enable_ro(patch->mod, true); in klp_init_object_loaded()
748 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
767 &patch->kobj, "%s", name); in klp_init_object()
778 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
791 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
796 if (!patch->objs) in klp_init_patch()
801 patch->enabled = false; in klp_init_patch()
802 init_completion(&patch->finish); in klp_init_patch()
804 ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch, in klp_init_patch()
805 klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
811 klp_for_each_object(patch, obj) { in klp_init_patch()
812 ret = klp_init_object(patch, obj); in klp_init_patch()
817 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
824 klp_free_objects_limited(patch, obj); in klp_init_patch()
828 kobject_put(&patch->kobj); in klp_init_patch()
829 wait_for_completion(&patch->finish); in klp_init_patch()
842 int klp_unregister_patch(struct klp_patch *patch) in klp_unregister_patch() argument
848 if (!klp_is_patch_registered(patch)) { in klp_unregister_patch()
853 if (patch->enabled) { in klp_unregister_patch()
858 klp_free_patch(patch); in klp_unregister_patch()
862 kobject_put(&patch->kobj); in klp_unregister_patch()
863 wait_for_completion(&patch->finish); in klp_unregister_patch()
884 int klp_register_patch(struct klp_patch *patch) in klp_register_patch() argument
886 if (!patch || !patch->mod) in klp_register_patch()
889 if (!is_livepatch_module(patch->mod)) { in klp_register_patch()
891 patch->mod->name); in klp_register_patch()
903 return klp_init_patch(patch); in klp_register_patch()
915 struct klp_patch *patch; in klp_cleanup_module_patches_limited() local
918 list_for_each_entry(patch, &klp_patches, list) { in klp_cleanup_module_patches_limited()
919 if (patch == limit) in klp_cleanup_module_patches_limited()
922 klp_for_each_object(patch, obj) { in klp_cleanup_module_patches_limited()
930 if (patch->enabled || patch == klp_transition_patch) { in klp_cleanup_module_patches_limited()
932 if (patch != klp_transition_patch) in klp_cleanup_module_patches_limited()
936 patch->mod->name, obj->mod->name); in klp_cleanup_module_patches_limited()
951 struct klp_patch *patch; in klp_module_coming() local
965 list_for_each_entry(patch, &klp_patches, list) { in klp_module_coming()
966 klp_for_each_object(patch, obj) { in klp_module_coming()
972 ret = klp_init_object_loaded(patch, obj); in klp_module_coming()
975 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
983 if (!patch->enabled && patch != klp_transition_patch) in klp_module_coming()
987 patch->mod->name, obj->mod->name); in klp_module_coming()
999 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
1005 if (patch != klp_transition_patch) in klp_module_coming()
1022 patch->mod->name, obj->mod->name, obj->mod->name); in klp_module_coming()
1024 klp_cleanup_module_patches_limited(mod, patch); in klp_module_coming()