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()
463 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
468 if (!list_is_last(&patch->list, &klp_patches) && in __klp_disable_patch()
469 list_next_entry(patch, list)->state == KLP_ENABLED) in __klp_disable_patch()
472 pr_notice("disabling patch '%s'\n", patch->mod->name); in __klp_disable_patch()
474 for (obj = patch->objs; obj->funcs; obj++) { in __klp_disable_patch()
479 patch->state = KLP_DISABLED; in __klp_disable_patch()
492 int klp_disable_patch(struct klp_patch *patch) in klp_disable_patch() argument
498 if (!klp_is_patch_registered(patch)) { in klp_disable_patch()
503 if (patch->state == KLP_DISABLED) { in klp_disable_patch()
508 ret = __klp_disable_patch(patch); in klp_disable_patch()
516 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
521 if (WARN_ON(patch->state != KLP_DISABLED)) in __klp_enable_patch()
525 if (patch->list.prev != &klp_patches && in __klp_enable_patch()
526 list_prev_entry(patch, list)->state == KLP_DISABLED) in __klp_enable_patch()
532 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
534 for (obj = patch->objs; obj->funcs; obj++) { in __klp_enable_patch()
543 patch->state = KLP_ENABLED; in __klp_enable_patch()
548 WARN_ON(__klp_disable_patch(patch)); in __klp_enable_patch()
561 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
567 if (!klp_is_patch_registered(patch)) { in klp_enable_patch()
572 ret = __klp_enable_patch(patch); in klp_enable_patch()
593 struct klp_patch *patch; in enabled_store() local
604 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
608 if (val == patch->state) { in enabled_store()
615 ret = __klp_enable_patch(patch); in enabled_store()
619 ret = __klp_disable_patch(patch); in enabled_store()
636 struct klp_patch *patch; in enabled_show() local
638 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
639 return snprintf(buf, PAGE_SIZE-1, "%d\n", patch->state); in enabled_show()
699 static void klp_free_objects_limited(struct klp_patch *patch, in klp_free_objects_limited() argument
704 for (obj = patch->objs; obj->funcs && obj != limit; obj++) { in klp_free_objects_limited()
710 static void klp_free_patch(struct klp_patch *patch) in klp_free_patch() argument
712 klp_free_objects_limited(patch, NULL); in klp_free_patch()
713 if (!list_empty(&patch->list)) in klp_free_patch()
714 list_del(&patch->list); in klp_free_patch()
715 kobject_put(&patch->kobj); in klp_free_patch()
728 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
735 ret = klp_write_object_relocations(patch->mod, obj); in klp_init_object_loaded()
749 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
764 obj->kobj = kobject_create_and_add(name, &patch->kobj); in klp_init_object()
775 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
788 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
793 if (!patch->objs) in klp_init_patch()
798 patch->state = KLP_DISABLED; in klp_init_patch()
800 ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch, in klp_init_patch()
801 klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
805 for (obj = patch->objs; obj->funcs; obj++) { in klp_init_patch()
806 ret = klp_init_object(patch, obj); in klp_init_patch()
811 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
818 klp_free_objects_limited(patch, obj); in klp_init_patch()
819 kobject_put(&patch->kobj); in klp_init_patch()
833 int klp_unregister_patch(struct klp_patch *patch) in klp_unregister_patch() argument
839 if (!klp_is_patch_registered(patch)) { in klp_unregister_patch()
844 if (patch->state == KLP_ENABLED) { in klp_unregister_patch()
849 klp_free_patch(patch); in klp_unregister_patch()
866 int klp_register_patch(struct klp_patch *patch) in klp_register_patch() argument
873 if (!patch || !patch->mod) in klp_register_patch()
883 if (!try_module_get(patch->mod)) in klp_register_patch()
886 ret = klp_init_patch(patch); in klp_register_patch()
888 module_put(patch->mod); in klp_register_patch()
894 static void klp_module_notify_coming(struct klp_patch *patch, in klp_module_notify_coming() argument
897 struct module *pmod = patch->mod; in klp_module_notify_coming()
901 ret = klp_init_object_loaded(patch, obj); in klp_module_notify_coming()
905 if (patch->state == KLP_DISABLED) in klp_module_notify_coming()
920 static void klp_module_notify_going(struct klp_patch *patch, in klp_module_notify_going() argument
923 struct module *pmod = patch->mod; in klp_module_notify_going()
926 if (patch->state == KLP_DISABLED) in klp_module_notify_going()
942 struct klp_patch *patch; in klp_module_notify() local
959 list_for_each_entry(patch, &klp_patches, list) { in klp_module_notify()
960 for (obj = patch->objs; obj->funcs; obj++) { in klp_module_notify()
966 klp_module_notify_coming(patch, obj); in klp_module_notify()
968 klp_module_notify_going(patch, obj); in klp_module_notify()