lkml.org 
[lkml]   [2010]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2.6.34-rc5 03/12] rcu: leave lockdep enabled after RCU lockdep splat
    Date
    From: Lai Jiangshan <laijs@cn.fujitsu.com>

    There is no need to disable lockdep after an RCU lockdep splat, so
    remove the debug_lockdeps_off() from lockdep_rcu_dereference().
    To avoid repeated lockdep splats, use a static variable in the
    inlined rcu_dereference_check() and rcu_dereference_protected()
    macros so that a given instance splats only once, but so that
    multiple instances can be detected per boot.

    Requested-by: Eric Paris <eparis@redhat.com>
    Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
    Tested-by: Eric Paris <eparis@redhat.com>
    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    include/linux/rcupdate.h | 15 +++++++++++----
    kernel/lockdep.c | 2 --
    2 files changed, 11 insertions(+), 6 deletions(-)

    diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
    index 07db2fe..ec9ab49 100644
    --- a/include/linux/rcupdate.h
    +++ b/include/linux/rcupdate.h
    @@ -190,6 +190,15 @@ static inline int rcu_read_lock_sched_held(void)

    #ifdef CONFIG_PROVE_RCU

    +#define __do_rcu_dereference_check(c) \
    + do { \
    + static bool __warned; \
    + if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \
    + __warned = true; \
    + lockdep_rcu_dereference(__FILE__, __LINE__); \
    + } \
    + } while (0)
    +
    /**
    * rcu_dereference_check - rcu_dereference with debug checking
    * @p: The pointer to read, prior to dereferencing
    @@ -219,8 +228,7 @@ static inline int rcu_read_lock_sched_held(void)
    */
    #define rcu_dereference_check(p, c) \
    ({ \
    - if (debug_lockdep_rcu_enabled() && !(c)) \
    - lockdep_rcu_dereference(__FILE__, __LINE__); \
    + __do_rcu_dereference_check(c); \
    rcu_dereference_raw(p); \
    })

    @@ -237,8 +245,7 @@ static inline int rcu_read_lock_sched_held(void)
    */
    #define rcu_dereference_protected(p, c) \
    ({ \
    - if (debug_lockdep_rcu_enabled() && !(c)) \
    - lockdep_rcu_dereference(__FILE__, __LINE__); \
    + __do_rcu_dereference_check(c); \
    (p); \
    })

    diff --git a/kernel/lockdep.c b/kernel/lockdep.c
    index 2594e1c..03dd1fa 100644
    --- a/kernel/lockdep.c
    +++ b/kernel/lockdep.c
    @@ -3801,8 +3801,6 @@ void lockdep_rcu_dereference(const char *file, const int line)
    {
    struct task_struct *curr = current;

    - if (!debug_locks_off())
    - return;
    printk("\n===================================================\n");
    printk( "[ INFO: suspicious rcu_dereference_check() usage. ]\n");
    printk( "---------------------------------------------------\n");
    --
    1.7.0


    \
     
     \ /
      Last update: 2010-04-23 21:47    [W:0.021 / U:88.544 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site