psi: introduce state_mask to represent stalled psi states
[linux-2.6-microblaze.git] / kernel / livepatch / core.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LIVEPATCH_CORE_H
3 #define _LIVEPATCH_CORE_H
4
5 #include <linux/livepatch.h>
6
7 extern struct mutex klp_mutex;
8 extern struct list_head klp_patches;
9
10 #define klp_for_each_patch_safe(patch, tmp_patch)               \
11         list_for_each_entry_safe(patch, tmp_patch, &klp_patches, list)
12
13 #define klp_for_each_patch(patch)       \
14         list_for_each_entry(patch, &klp_patches, list)
15
16 void klp_free_patch_start(struct klp_patch *patch);
17 void klp_discard_replaced_patches(struct klp_patch *new_patch);
18 void klp_discard_nops(struct klp_patch *new_patch);
19
20 static inline bool klp_is_object_loaded(struct klp_object *obj)
21 {
22         return !obj->name || obj->mod;
23 }
24
25 static inline int klp_pre_patch_callback(struct klp_object *obj)
26 {
27         int ret = 0;
28
29         if (obj->callbacks.pre_patch)
30                 ret = (*obj->callbacks.pre_patch)(obj);
31
32         obj->callbacks.post_unpatch_enabled = !ret;
33
34         return ret;
35 }
36
37 static inline void klp_post_patch_callback(struct klp_object *obj)
38 {
39         if (obj->callbacks.post_patch)
40                 (*obj->callbacks.post_patch)(obj);
41 }
42
43 static inline void klp_pre_unpatch_callback(struct klp_object *obj)
44 {
45         if (obj->callbacks.pre_unpatch)
46                 (*obj->callbacks.pre_unpatch)(obj);
47 }
48
49 static inline void klp_post_unpatch_callback(struct klp_object *obj)
50 {
51         if (obj->callbacks.post_unpatch_enabled &&
52             obj->callbacks.post_unpatch)
53                 (*obj->callbacks.post_unpatch)(obj);
54
55         obj->callbacks.post_unpatch_enabled = false;
56 }
57
58 #endif /* _LIVEPATCH_CORE_H */