Blame view

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