lkml.org 
[lkml]   [2011]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv2 1/3] debugobjects: Be smarter about static objects
    Date
    Remove the WARN_ON() in timer_fixup_activate() and actually use
    the return code from fixup to tell the debugobjects code to print
    a warning. This provides better diagnostic information via a nice
    debugobjects warning instead of a simple WARN_ON(1) in the timer
    code with no information as to what is wrong. We also assign a
    dummy timer callback so that if the timer is actually set to
    fire we don't oops.

    Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
    Cc: Christine Chan <cschan@codeaurora.org>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    ---
    kernel/timer.c | 9 ++++++++-
    lib/debugobjects.c | 15 +++++++++++----
    2 files changed, 19 insertions(+), 5 deletions(-)

    diff --git a/kernel/timer.c b/kernel/timer.c
    index dbaa624..317087d 100644
    --- a/kernel/timer.c
    +++ b/kernel/timer.c
    @@ -427,6 +427,12 @@ static int timer_fixup_init(void *addr, enum debug_obj_state state)
    }
    }

    +/* Stub timer callback for improperly used timers. */
    +static void stub_timer(unsigned long data)
    +{
    + WARN_ON(1);
    +}
    +
    /*
    * fixup_activate is called when:
    * - an active object is activated
    @@ -450,7 +456,8 @@ static int timer_fixup_activate(void *addr, enum debug_obj_state state)
    debug_object_activate(timer, &timer_debug_descr);
    return 0;
    } else {
    - WARN_ON_ONCE(1);
    + setup_timer(timer, stub_timer, 0);
    + return 1;
    }
    return 0;

    diff --git a/lib/debugobjects.c b/lib/debugobjects.c
    index a78b7c6..0b07cc5 100644
    --- a/lib/debugobjects.c
    +++ b/lib/debugobjects.c
    @@ -268,12 +268,15 @@ static void debug_print_object(struct debug_obj *obj, char *msg)
    * Try to repair the damage, so we have a better chance to get useful
    * debug output.
    */
    -static void
    +static int
    debug_object_fixup(int (*fixup)(void *addr, enum debug_obj_state state),
    void * addr, enum debug_obj_state state)
    {
    + int fixed = 0;
    if (fixup)
    - debug_objects_fixups += fixup(addr, state);
    + fixed = fixup(addr, state);
    + debug_objects_fixups += fixed;
    + return fixed;
    }

    static void debug_object_is_on_stack(void *addr, int onstack)
    @@ -386,6 +389,9 @@ void debug_object_activate(void *addr, struct debug_obj_descr *descr)
    struct debug_bucket *db;
    struct debug_obj *obj;
    unsigned long flags;
    + struct debug_obj o = { .object = addr,
    + .state = ODEBUG_STATE_NOTAVAILABLE,
    + .descr = descr };

    if (!debug_objects_enabled)
    return;
    @@ -425,8 +431,9 @@ void debug_object_activate(void *addr, struct debug_obj_descr *descr)
    * let the type specific code decide whether this is
    * true or not.
    */
    - debug_object_fixup(descr->fixup_activate, addr,
    - ODEBUG_STATE_NOTAVAILABLE);
    + if (debug_object_fixup(descr->fixup_activate, addr,
    + ODEBUG_STATE_NOTAVAILABLE))
    + debug_print_object(&o, "activate");
    }

    /**
    --
    Sent by an employee of the Qualcomm Innovation Center, Inc.
    The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.


    \
     
     \ /
      Last update: 2011-11-08 04:51    [W:0.024 / U:59.068 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site