Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
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: * @astate: current active state 24: * @object: pointer to the real object 25: * @descr: pointer to an object type specific debug description structure 26: */ 27: struct debug_obj { 28: struct hlist_node node; 29: enum debug_obj_state state; 30: unsigned int astate; 31: void *object; 32: struct debug_obj_descr *descr; 33: }; 34: 35: /** 36: * struct debug_obj_descr - object type specific debug description structure 37: * 38: * @name: name of the object typee 39: * @debug_hint: function returning address, which have associated 40: * kernel symbol, to allow identify the object 41: * @fixup_init: fixup function, which is called when the init check 42: * fails 43: * @fixup_activate: fixup function, which is called when the activate check 44: * fails 45: * @fixup_destroy: fixup function, which is called when the destroy check 46: * fails 47: * @fixup_free: fixup function, which is called when the free check 48: * fails 49: * @fixup_assert_init: fixup function, which is called when the assert_init 50: * check fails 51: */ 52: struct debug_obj_descr { 53: const char *name; 54: void *(*debug_hint) (void *addr); 55: int (*fixup_init) (void *addr, enum debug_obj_state state); 56: int (*fixup_activate) (void *addr, enum debug_obj_state state); 57: int (*fixup_destroy) (void *addr, enum debug_obj_state state); 58: int (*fixup_free) (void *addr, enum debug_obj_state state); 59: int (*fixup_assert_init)(void *addr, enum debug_obj_state state); 60: }; 61: 62: #ifdef CONFIG_DEBUG_OBJECTS 63: extern void debug_object_init (void *addr, struct debug_obj_descr *descr); 64: extern void 65: debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr); 66: extern int debug_object_activate (void *addr, struct debug_obj_descr *descr); 67: extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr); 68: extern void debug_object_destroy (void *addr, struct debug_obj_descr *descr); 69: extern void debug_object_free (void *addr, struct debug_obj_descr *descr); 70: extern void debug_object_assert_init(void *addr, struct debug_obj_descr *descr); 71: 72: /* 73: * Active state: 74: * - Set at 0 upon initialization. 75: * - Must return to 0 before deactivation. 76: */ 77: extern void 78: debug_object_active_state(void *addr, struct debug_obj_descr *descr, 79: unsigned int expect, unsigned int next); 80: 81: extern void debug_objects_early_init(void); 82: extern void debug_objects_mem_init(void); 83: #else 84: static inline void 85: debug_object_init (void *addr, struct debug_obj_descr *descr) { } 86: static inline void 87: debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr) { } 88: static inline int 89: debug_object_activate (void *addr, struct debug_obj_descr *descr) { return 0; } 90: static inline void 91: debug_object_deactivate(void *addr, struct debug_obj_descr *descr) { } 92: static inline void 93: debug_object_destroy (void *addr, struct debug_obj_descr *descr) { } 94: static inline void 95: debug_object_free (void *addr, struct debug_obj_descr *descr) { } 96: static inline void 97: debug_object_assert_init(void *addr, struct debug_obj_descr *descr) { } 98: 99: static inline void debug_objects_early_init(void) { } 100: static inline void debug_objects_mem_init(void) { } 101: #endif 102: 103: #ifdef CONFIG_DEBUG_OBJECTS_FREE 104: extern void debug_check_no_obj_freed(const void *address, unsigned long size); 105: #else 106: static inline void 107: debug_check_no_obj_freed(const void *address, unsigned long size) { } 108: #endif 109: 110: #endif 111: