lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 175/779] locking/lockdep: Fix lockdep_init_map_*() confusion
    Date
    From: Peter Zijlstra <peterz@infradead.org>

    [ Upstream commit eae6d58d67d9739be5f7ae2dbead1d0ef6528243 ]

    Commit dfd5e3f5fe27 ("locking/lockdep: Mark local_lock_t") added yet
    another lockdep_init_map_*() variant, but forgot to update all the
    existing users of the most complicated version.

    This could lead to a loss of lock_type and hence an incorrect report.
    Given the relative rarity of both local_lock and these annotations,
    this is unlikely to happen in practise, still, best fix things.

    Fixes: dfd5e3f5fe27 ("locking/lockdep: Mark local_lock_t")
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/YqyEDtoan20K0CVD@worktop.programming.kicks-ass.net
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/linux/lockdep.h | 30 +++++++++++++++++-------------
    kernel/locking/lockdep.c | 7 ++++---
    2 files changed, 21 insertions(+), 16 deletions(-)

    diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
    index 9fe165beb0f9..aa0ecfc6cdb4 100644
    --- a/include/linux/lockdep.h
    +++ b/include/linux/lockdep.h
    @@ -192,7 +192,7 @@ static inline void
    lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
    struct lock_class_key *key, int subclass, u8 inner, u8 outer)
    {
    - lockdep_init_map_type(lock, name, key, subclass, inner, LD_WAIT_INV, LD_LOCK_NORMAL);
    + lockdep_init_map_type(lock, name, key, subclass, inner, outer, LD_LOCK_NORMAL);
    }

    static inline void
    @@ -215,24 +215,28 @@ static inline void lockdep_init_map(struct lockdep_map *lock, const char *name,
    * or they are too narrow (they suffer from a false class-split):
    */
    #define lockdep_set_class(lock, key) \
    - lockdep_init_map_waits(&(lock)->dep_map, #key, key, 0, \
    - (lock)->dep_map.wait_type_inner, \
    - (lock)->dep_map.wait_type_outer)
    + lockdep_init_map_type(&(lock)->dep_map, #key, key, 0, \
    + (lock)->dep_map.wait_type_inner, \
    + (lock)->dep_map.wait_type_outer, \
    + (lock)->dep_map.lock_type)

    #define lockdep_set_class_and_name(lock, key, name) \
    - lockdep_init_map_waits(&(lock)->dep_map, name, key, 0, \
    - (lock)->dep_map.wait_type_inner, \
    - (lock)->dep_map.wait_type_outer)
    + lockdep_init_map_type(&(lock)->dep_map, name, key, 0, \
    + (lock)->dep_map.wait_type_inner, \
    + (lock)->dep_map.wait_type_outer, \
    + (lock)->dep_map.lock_type)

    #define lockdep_set_class_and_subclass(lock, key, sub) \
    - lockdep_init_map_waits(&(lock)->dep_map, #key, key, sub,\
    - (lock)->dep_map.wait_type_inner, \
    - (lock)->dep_map.wait_type_outer)
    + lockdep_init_map_type(&(lock)->dep_map, #key, key, sub, \
    + (lock)->dep_map.wait_type_inner, \
    + (lock)->dep_map.wait_type_outer, \
    + (lock)->dep_map.lock_type)

    #define lockdep_set_subclass(lock, sub) \
    - lockdep_init_map_waits(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\
    - (lock)->dep_map.wait_type_inner, \
    - (lock)->dep_map.wait_type_outer)
    + lockdep_init_map_type(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\
    + (lock)->dep_map.wait_type_inner, \
    + (lock)->dep_map.wait_type_outer, \
    + (lock)->dep_map.lock_type)

    #define lockdep_set_novalidate_class(lock) \
    lockdep_set_class_and_name(lock, &__lockdep_no_validate__, #lock)
    diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
    index a30702b847ba..120bbdacd58b 100644
    --- a/kernel/locking/lockdep.c
    +++ b/kernel/locking/lockdep.c
    @@ -5202,9 +5202,10 @@ __lock_set_class(struct lockdep_map *lock, const char *name,
    return 0;
    }

    - lockdep_init_map_waits(lock, name, key, 0,
    - lock->wait_type_inner,
    - lock->wait_type_outer);
    + lockdep_init_map_type(lock, name, key, 0,
    + lock->wait_type_inner,
    + lock->wait_type_outer,
    + lock->lock_type);
    class = register_lock_class(lock, subclass, 0);
    hlock->class_idx = class - lock_classes;

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-15 20:37    [W:2.504 / U:0.456 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site