Line data Source code
1 : #ifndef _LINUX_DEBUGOBJECTS_H
2 : #define _LINUX_DEBUGOBJECTS_H
3 :
4 : #include <linux/list.h>
5 : #include <linux/spinlock.h>
6 :
7 : enum debug_obj_state {
8 : ODEBUG_STATE_NONE,
9 : ODEBUG_STATE_INIT,
10 : ODEBUG_STATE_INACTIVE,
11 : ODEBUG_STATE_ACTIVE,
12 : ODEBUG_STATE_DESTROYED,
13 : ODEBUG_STATE_NOTAVAILABLE,
14 : ODEBUG_STATE_MAX,
15 : };
16 :
17 : struct debug_obj_descr;
18 :
19 : /**
20 : * struct debug_obj - representaion of an tracked object
21 : * @node: hlist node to link the object into the tracker list
22 : * @state: tracked object state
23 : * @object: pointer to the real object
24 : * @descr: pointer to an object type specific debug description structure
25 : */
26 : struct debug_obj {
27 : struct hlist_node node;
28 : enum debug_obj_state state;
29 : void *object;
30 : struct debug_obj_descr *descr;
31 : };
32 :
33 : /**
34 : * struct debug_obj_descr - object type specific debug description structure
35 : * @name: name of the object typee
36 : * @fixup_init: fixup function, which is called when the init check
37 : * fails
38 : * @fixup_activate: fixup function, which is called when the activate check
39 : * fails
40 : * @fixup_destroy: fixup function, which is called when the destroy check
41 : * fails
42 : * @fixup_free: fixup function, which is called when the free check
43 : * fails
44 : */
45 : struct debug_obj_descr {
46 : const char *name;
47 :
48 : int (*fixup_init) (void *addr, enum debug_obj_state state);
49 : int (*fixup_activate) (void *addr, enum debug_obj_state state);
50 : int (*fixup_destroy) (void *addr, enum debug_obj_state state);
51 : int (*fixup_free) (void *addr, enum debug_obj_state state);
52 : };
53 :
54 : #ifdef CONFIG_DEBUG_OBJECTS
55 : extern void debug_object_init (void *addr, struct debug_obj_descr *descr);
56 : extern void
57 : debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr);
58 : extern void debug_object_activate (void *addr, struct debug_obj_descr *descr);
59 : extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr);
60 : extern void debug_object_destroy (void *addr, struct debug_obj_descr *descr);
61 : extern void debug_object_free (void *addr, struct debug_obj_descr *descr);
62 :
63 : extern void debug_objects_early_init(void);
64 : extern void debug_objects_mem_init(void);
65 : #else
66 : static inline void
67 : debug_object_init (void *addr, struct debug_obj_descr *descr) { }
68 : static inline void
69 : debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr) { }
70 : static inline void
71 : debug_object_activate (void *addr, struct debug_obj_descr *descr) { }
72 : static inline void
73 : debug_object_deactivate(void *addr, struct debug_obj_descr *descr) { }
74 : static inline void
75 : debug_object_destroy (void *addr, struct debug_obj_descr *descr) { }
76 : static inline void
77 : debug_object_free (void *addr, struct debug_obj_descr *descr) { }
78 :
79 : static inline void debug_objects_early_init(void) { }
80 : static inline void debug_objects_mem_init(void) { }
81 : #endif
82 :
83 : #ifdef CONFIG_DEBUG_OBJECTS_FREE
84 : extern void debug_check_no_obj_freed(const void *address, unsigned long size);
85 : #else
86 : static inline void
87 : debug_check_no_obj_freed(const void *address, unsigned long size) { }
88 : #endif
89 :
90 1 : #endif
|