Lines Matching refs:patch
118 static bool klp_is_patch_registered(struct klp_patch *patch) in klp_is_patch_registered() argument
123 if (mypatch == patch) in klp_is_patch_registered()
472 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
477 if (!list_is_last(&patch->list, &klp_patches) && in __klp_disable_patch()
478 list_next_entry(patch, list)->state == KLP_ENABLED) in __klp_disable_patch()
481 pr_notice("disabling patch '%s'\n", patch->mod->name); in __klp_disable_patch()
483 klp_for_each_object(patch, obj) { in __klp_disable_patch()
488 patch->state = KLP_DISABLED; in __klp_disable_patch()
501 int klp_disable_patch(struct klp_patch *patch) in klp_disable_patch() argument
507 if (!klp_is_patch_registered(patch)) { in klp_disable_patch()
512 if (patch->state == KLP_DISABLED) { in klp_disable_patch()
517 ret = __klp_disable_patch(patch); in klp_disable_patch()
525 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
530 if (WARN_ON(patch->state != KLP_DISABLED)) in __klp_enable_patch()
534 if (patch->list.prev != &klp_patches && in __klp_enable_patch()
535 list_prev_entry(patch, list)->state == KLP_DISABLED) in __klp_enable_patch()
541 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
543 klp_for_each_object(patch, obj) { in __klp_enable_patch()
552 patch->state = KLP_ENABLED; in __klp_enable_patch()
557 WARN_ON(__klp_disable_patch(patch)); in __klp_enable_patch()
570 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
576 if (!klp_is_patch_registered(patch)) { in klp_enable_patch()
581 ret = __klp_enable_patch(patch); in klp_enable_patch()
602 struct klp_patch *patch; in enabled_store() local
613 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
617 if (val == patch->state) { in enabled_store()
624 ret = __klp_enable_patch(patch); in enabled_store()
628 ret = __klp_disable_patch(patch); in enabled_store()
645 struct klp_patch *patch; in enabled_show() local
647 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
648 return snprintf(buf, PAGE_SIZE-1, "%d\n", patch->state); in enabled_show()
717 static void klp_free_objects_limited(struct klp_patch *patch, in klp_free_objects_limited() argument
722 for (obj = patch->objs; obj->funcs && obj != limit; obj++) { in klp_free_objects_limited()
728 static void klp_free_patch(struct klp_patch *patch) in klp_free_patch() argument
730 klp_free_objects_limited(patch, NULL); in klp_free_patch()
731 if (!list_empty(&patch->list)) in klp_free_patch()
732 list_del(&patch->list); in klp_free_patch()
733 kobject_put(&patch->kobj); in klp_free_patch()
746 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
753 ret = klp_write_object_relocations(patch->mod, obj); in klp_init_object_loaded()
767 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
783 &patch->kobj, "%s", name); in klp_init_object()
794 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
807 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
812 if (!patch->objs) in klp_init_patch()
817 patch->state = KLP_DISABLED; in klp_init_patch()
819 ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch, in klp_init_patch()
820 klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
824 klp_for_each_object(patch, obj) { in klp_init_patch()
825 ret = klp_init_object(patch, obj); in klp_init_patch()
830 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
837 klp_free_objects_limited(patch, obj); in klp_init_patch()
838 kobject_put(&patch->kobj); in klp_init_patch()
852 int klp_unregister_patch(struct klp_patch *patch) in klp_unregister_patch() argument
858 if (!klp_is_patch_registered(patch)) { in klp_unregister_patch()
863 if (patch->state == KLP_ENABLED) { in klp_unregister_patch()
868 klp_free_patch(patch); in klp_unregister_patch()
885 int klp_register_patch(struct klp_patch *patch) in klp_register_patch() argument
892 if (!patch || !patch->mod) in klp_register_patch()
902 if (!try_module_get(patch->mod)) in klp_register_patch()
905 ret = klp_init_patch(patch); in klp_register_patch()
907 module_put(patch->mod); in klp_register_patch()
913 static int klp_module_notify_coming(struct klp_patch *patch, in klp_module_notify_coming() argument
916 struct module *pmod = patch->mod; in klp_module_notify_coming()
920 ret = klp_init_object_loaded(patch, obj); in klp_module_notify_coming()
927 if (patch->state == KLP_DISABLED) in klp_module_notify_coming()
940 static void klp_module_notify_going(struct klp_patch *patch, in klp_module_notify_going() argument
943 struct module *pmod = patch->mod; in klp_module_notify_going()
946 if (patch->state == KLP_DISABLED) in klp_module_notify_going()
963 struct klp_patch *patch; in klp_module_notify() local
980 list_for_each_entry(patch, &klp_patches, list) { in klp_module_notify()
981 klp_for_each_object(patch, obj) { in klp_module_notify()
987 ret = klp_module_notify_coming(patch, obj); in klp_module_notify()
991 patch->mod->name); in klp_module_notify()
994 klp_module_notify_going(patch, obj); in klp_module_notify()