Skip to content

Commit

Permalink
debugobjects: Add hint for better object identification
Browse files Browse the repository at this point in the history
In complex subsystems like mac80211 structures can contain several
timers and work structs, so identifying a specific instance from the
call trace and object type output of debugobjects can be hard.

Allow the subsystems which support debugobjects to provide a hint
function. This function returns a pointer to a kernel address
(preferrably the objects callback function) which is printed along
with the debugobjects type.

Add hint methods for timer_list, work_struct and hrtimer.

[ tglx: Massaged changelog, made it compile ]

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
LKML-Reference: <20110307085809.GA9334@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Stanislaw Gruszka authored and Thomas Gleixner committed Mar 8, 2011
1 parent a5abba9 commit 9977728
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 4 deletions.
5 changes: 4 additions & 1 deletion include/linux/debugobjects.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ struct debug_obj {

/**
* 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
* @fixup_activate: fixup function, which is called when the activate check
Expand All @@ -46,7 +49,7 @@ struct debug_obj {
*/
struct debug_obj_descr {
const char *name;

void *(*debug_hint) (void *addr);
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);
Expand Down
6 changes: 6 additions & 0 deletions kernel/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,11 @@ EXPORT_SYMBOL_GPL(ktime_add_safe);

static struct debug_obj_descr hrtimer_debug_descr;

static void *hrtimer_debug_hint(void *addr)
{
return ((struct hrtimer *) addr)->function;
}

/*
* fixup_init is called when:
* - an active object is initialized
Expand Down Expand Up @@ -393,6 +398,7 @@ static int hrtimer_fixup_free(void *addr, enum debug_obj_state state)

static struct debug_obj_descr hrtimer_debug_descr = {
.name = "hrtimer",
.debug_hint = hrtimer_debug_hint,
.fixup_init = hrtimer_fixup_init,
.fixup_activate = hrtimer_fixup_activate,
.fixup_free = hrtimer_fixup_free,
Expand Down
6 changes: 6 additions & 0 deletions kernel/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,11 @@ static void timer_stats_account_timer(struct timer_list *timer) {}

static struct debug_obj_descr timer_debug_descr;

static void *timer_debug_hint(void *addr)
{
return ((struct timer_list *) addr)->function;
}

/*
* fixup_init is called when:
* - an active object is initialized
Expand Down Expand Up @@ -477,6 +482,7 @@ static int timer_fixup_free(void *addr, enum debug_obj_state state)

static struct debug_obj_descr timer_debug_descr = {
.name = "timer_list",
.debug_hint = timer_debug_hint,
.fixup_init = timer_fixup_init,
.fixup_activate = timer_fixup_activate,
.fixup_free = timer_fixup_free,
Expand Down
6 changes: 6 additions & 0 deletions kernel/workqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,11 @@ static inline int __next_wq_cpu(int cpu, const struct cpumask *mask,

static struct debug_obj_descr work_debug_descr;

static void *work_debug_hint(void *addr)
{
return ((struct work_struct *) addr)->func;
}

/*
* fixup_init is called when:
* - an active object is initialized
Expand Down Expand Up @@ -387,6 +392,7 @@ static int work_fixup_free(void *addr, enum debug_obj_state state)

static struct debug_obj_descr work_debug_descr = {
.name = "work_struct",
.debug_hint = work_debug_hint,
.fixup_init = work_fixup_init,
.fixup_activate = work_fixup_activate,
.fixup_free = work_fixup_free,
Expand Down
9 changes: 6 additions & 3 deletions lib/debugobjects.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,14 +249,17 @@ static struct debug_bucket *get_bucket(unsigned long addr)

static void debug_print_object(struct debug_obj *obj, char *msg)
{
struct debug_obj_descr *descr = obj->descr;
static int limit;

if (limit < 5 && obj->descr != descr_test) {
if (limit < 5 && descr != descr_test) {
void *hint = descr->debug_hint ?
descr->debug_hint(obj->object) : NULL;
limit++;
WARN(1, KERN_ERR "ODEBUG: %s %s (active state %u) "
"object type: %s\n",
"object type: %s hint: %pS\n",
msg, obj_states[obj->state], obj->astate,
obj->descr->name);
descr->name, hint);
}
debug_objects_warnings++;
}
Expand Down

0 comments on commit 9977728

Please sign in to comment.