lkml.org 
[lkml]   [2007]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 01/13] lockdep: fix mismatched lockdep_depth/curr_chain_hash

    -stable review patch. If anyone has any objections, please let us know.

    ------------------

    From: Gregory Haskins <ghaskins@novell.com>

    patch 3aa416b07f0adf01c090baab26fb70c35ec17623 in mainline.

    It is possible for the current->curr_chain_key to become inconsistent
    with the current index if the chain fails to validate. The end result
    is that future lock_acquire() operations may inadvertently fail to find
    a hit in the cache resulting in a new node being added to the graph for
    every acquire.


    Signed-off-by: Gregory Haskins <ghaskins@novell.com>
    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Cc: Chuck Ebbert <cebbert@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    kernel/lockdep.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    --- a/kernel/lockdep.c
    +++ b/kernel/lockdep.c
    @@ -1521,7 +1521,7 @@ cache_hit:
    }

    static int validate_chain(struct task_struct *curr, struct lockdep_map *lock,
    - struct held_lock *hlock, int chain_head)
    + struct held_lock *hlock, int chain_head, u64 chain_key)
    {
    /*
    * Trylock needs to maintain the stack of held locks, but it
    @@ -1534,7 +1534,7 @@ static int validate_chain(struct task_st
    * graph_lock for us)
    */
    if (!hlock->trylock && (hlock->check == 2) &&
    - lookup_chain_cache(curr->curr_chain_key, hlock->class)) {
    + lookup_chain_cache(chain_key, hlock->class)) {
    /*
    * Check whether last held lock:
    *
    @@ -1576,7 +1576,7 @@ static int validate_chain(struct task_st
    #else
    static inline int validate_chain(struct task_struct *curr,
    struct lockdep_map *lock, struct held_lock *hlock,
    - int chain_head)
    + int chain_head, u64 chain_key)
    {
    return 1;
    }
    @@ -2450,11 +2450,11 @@ static int __lock_acquire(struct lockdep
    chain_head = 1;
    }
    chain_key = iterate_chain_key(chain_key, id);
    - curr->curr_chain_key = chain_key;

    - if (!validate_chain(curr, lock, hlock, chain_head))
    + if (!validate_chain(curr, lock, hlock, chain_head, chain_key))
    return 0;

    + curr->curr_chain_key = chain_key;
    curr->lockdep_depth++;
    check_chain_key(curr);
    #ifdef CONFIG_DEBUG_LOCKDEP
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-11-15 07:15    [W:3.748 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site