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