lkml.org 
[lkml]   [2010]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 03/18] rcu: integrate rcu_dereference_check() message into lockdep
    Date
    Make rcu_dereference_check() print the list of held locks in addition
    to the stack dump to ease debugging.

    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    include/linux/lockdep.h | 4 ++++
    include/linux/rcupdate.h | 4 ++--
    kernel/lockdep.c | 18 ++++++++++++++++++
    3 files changed, 24 insertions(+), 2 deletions(-)
    diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
    index 9ccf0e2..10206a8 100644
    --- a/include/linux/lockdep.h
    +++ b/include/linux/lockdep.h
    @@ -534,4 +534,8 @@ do { \
    # define might_lock_read(lock) do { } while (0)
    #endif

    +#ifdef CONFIG_PROVE_RCU
    +extern void lockdep_rcu_dereference(const char *file, const int line);
    +#endif
    +
    #endif /* __LINUX_LOCKDEP_H */
    diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
    index 839d296..1a4de31 100644
    --- a/include/linux/rcupdate.h
    +++ b/include/linux/rcupdate.h
    @@ -182,8 +182,8 @@ static inline int rcu_read_lock_sched_held(void)
    */
    #define rcu_dereference_check(p, c) \
    ({ \
    - if (debug_locks) \
    - WARN_ON_ONCE(!(c)); \
    + if (debug_locks && !(c)) \
    + lockdep_rcu_dereference(__FILE__, __LINE__); \
    rcu_dereference_raw(p); \
    })

    diff --git a/kernel/lockdep.c b/kernel/lockdep.c
    index 5feaddc..a44c1b2 100644
    --- a/kernel/lockdep.c
    +++ b/kernel/lockdep.c
    @@ -3809,3 +3809,21 @@ void lockdep_sys_exit(void)
    lockdep_print_held_locks(curr);
    }
    }
    +
    +void lockdep_rcu_dereference(const char *file, const int line)
    +{
    + struct task_struct *curr = current;
    +
    + if (!debug_locks_off())
    + return;
    + printk("\n==============================================\n");
    + printk( "[ BUG: Unsafe rcu_dereference_check() usage! ]\n");
    + printk( "----------------------------------------------\n");
    + printk("%s:%d invoked rcu_dereference_check() without protection!\n",
    + file, line);
    + printk("\nother info that might help us debug this:\n\n");
    + lockdep_print_held_locks(curr);
    + printk("\nstack backtrace:\n");
    + dump_stack();
    +}
    +EXPORT_SYMBOL_GPL(lockdep_rcu_dereference);
    --
    1.6.6


    \
     
     \ /
      Last update: 2010-02-17 21:35    [from the cache]
    ©2003-2011 Jasper Spaans