mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
b1e4d9d82d
I am going to introduce debugobjects infrastructure to USB subsystem. But before this, I found the code of debugobjects could be improved. This patchset will make fixup functions return bool type instead of int. Because fixup only need report success or no. boolean is the 'real' type. This patch (of 7): The object debugging infrastructure core provides some fixup callbacks for the subsystem who use it. These callbacks are called from the debug code whenever a problem in debug_object_init is detected. And debugobjects core suppose them returns 1 when the fixup was successful, otherwise 0. So the return type is boolean. A bad thing is that debug_object_fixup use the return value for arithmetic operation. It confused me that what is the reall return type. Reading over the whole code, I found some place do use the return value incorrectly(see next patch). So why use bool type instead? Signed-off-by: Du, Changbin <changbin.du@intel.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Josh Triplett <josh@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tejun Heo <tj@kernel.org> Cc: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
112 lines
3.7 KiB
C
112 lines
3.7 KiB
C
#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
|
|
* @astate: current active state
|
|
* @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;
|
|
unsigned int astate;
|
|
void *object;
|
|
struct debug_obj_descr *descr;
|
|
};
|
|
|
|
/**
|
|
* struct debug_obj_descr - object type specific debug description structure
|
|
*
|
|
* @name: name of the object typee
|
|
* @debug_hint: function returning address, which have associated
|
|
* kernel symbol, to allow identify the object
|
|
* @fixup_init: fixup function, which is called when the init check
|
|
* fails. All fixup functions must return true if fixup
|
|
* was successful, otherwise return false
|
|
* @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
|
|
* @fixup_assert_init: fixup function, which is called when the assert_init
|
|
* check fails
|
|
*/
|
|
struct debug_obj_descr {
|
|
const char *name;
|
|
void *(*debug_hint)(void *addr);
|
|
bool (*fixup_init)(void *addr, enum debug_obj_state state);
|
|
bool (*fixup_activate)(void *addr, enum debug_obj_state state);
|
|
bool (*fixup_destroy)(void *addr, enum debug_obj_state state);
|
|
bool (*fixup_free)(void *addr, enum debug_obj_state state);
|
|
bool (*fixup_assert_init)(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 int 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);
|
|
extern void debug_object_assert_init(void *addr, struct debug_obj_descr *descr);
|
|
|
|
/*
|
|
* 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);
|
|
|
|
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 int
|
|
debug_object_activate (void *addr, struct debug_obj_descr *descr) { return 0; }
|
|
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_object_assert_init(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
|