|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef _LIVEPATCH_PATCH_H | 
|  | #define _LIVEPATCH_PATCH_H | 
|  |  | 
|  | #include <linux/livepatch.h> | 
|  | #include <linux/list.h> | 
|  | #include <linux/ftrace.h> | 
|  |  | 
|  | /** | 
|  | * struct klp_ops - structure for tracking registered ftrace ops structs | 
|  | * | 
|  | * A single ftrace_ops is shared between all enabled replacement functions | 
|  | * (klp_func structs) which have the same old_func.  This allows the switch | 
|  | * between function versions to happen instantaneously by updating the klp_ops | 
|  | * struct's func_stack list.  The winner is the klp_func at the top of the | 
|  | * func_stack (front of the list). | 
|  | * | 
|  | * @node:	node for the global klp_ops list | 
|  | * @func_stack:	list head for the stack of klp_func's (active func is on top) | 
|  | * @fops:	registered ftrace ops struct | 
|  | */ | 
|  | struct klp_ops { | 
|  | struct list_head node; | 
|  | struct list_head func_stack; | 
|  | struct ftrace_ops fops; | 
|  | }; | 
|  |  | 
|  | struct klp_ops *klp_find_ops(void *old_func); | 
|  |  | 
|  | int klp_patch_object(struct klp_object *obj); | 
|  | void klp_unpatch_object(struct klp_object *obj); | 
|  | void klp_unpatch_objects(struct klp_patch *patch); | 
|  | void klp_unpatch_objects_dynamic(struct klp_patch *patch); | 
|  |  | 
|  | #endif /* _LIVEPATCH_PATCH_H */ |