lkml.org 
[lkml]   [2019]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 20/30] locking/lockdep: Introduce chain_hlocks_type for held lock's read-write type
    Date
    Lock chain needs to include information about the read-write lock type. To
    that end, introduce:

    chain_hlocks_type[MAX_LOCKDEP_CHAIN_HLOCKS]

    in addition to:

    chain_hlocks[MAX_LOCKDEP_CHAIN_HLOCKS]

    Signed-off-by: Yuyang Du <duyuyang@gmail.com>
    ---
    kernel/locking/lockdep.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
    index 2329add..27eeacc 100644
    --- a/kernel/locking/lockdep.c
    +++ b/kernel/locking/lockdep.c
    @@ -882,6 +882,7 @@ static bool class_lock_list_valid(struct lock_class *c, int forward)

    #ifdef CONFIG_PROVE_LOCKING
    static u16 chain_hlocks[MAX_LOCKDEP_CHAIN_HLOCKS];
    +static u16 chain_hlocks_type[MAX_LOCKDEP_CHAIN_HLOCKS];
    #endif

    static bool check_lock_chain_key(struct lock_chain *chain)
    @@ -2592,6 +2593,7 @@ static inline void inc_chains(void)
    static DECLARE_BITMAP(lock_chains_in_use, MAX_LOCKDEP_CHAINS);
    int nr_chain_hlocks;
    static u16 chain_hlocks[MAX_LOCKDEP_CHAIN_HLOCKS];
    +static u16 chain_hlocks_type[MAX_LOCKDEP_CHAIN_HLOCKS];

    struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i)
    {
    @@ -2795,9 +2797,13 @@ static inline struct lock_chain *add_chain_cache(struct task_struct *curr,
    chain->base = nr_chain_hlocks;
    for (j = 0; j < chain->depth - 1; j++, i++) {
    int lock_id = curr->held_locks[i].class_idx;
    + int lock_type = curr->held_locks[i].read;
    +
    chain_hlocks[chain->base + j] = lock_id;
    + chain_hlocks_type[chain->base + j] = lock_type;
    }
    chain_hlocks[chain->base + j] = class - lock_classes;
    + chain_hlocks_type[chain->base + j] = hlock->read;
    nr_chain_hlocks += chain->depth;
    } else {
    if (!debug_locks_off_graph_unlock())
    @@ -4811,6 +4817,9 @@ static void remove_class_from_lock_chain(struct pending_free *pf,
    memmove(&chain_hlocks[i], &chain_hlocks[i + 1],
    (chain->base + chain->depth - i) *
    sizeof(chain_hlocks[0]));
    + memmove(&chain_hlocks_type[i], &chain_hlocks_type[i + 1],
    + (chain->base + chain->depth - i) *
    + sizeof(chain_hlocks_type[0]));
    }
    /*
    * Each lock class occurs at most once in a lock chain so once
    @@ -5278,6 +5287,7 @@ void __init lockdep_init(void)
    + sizeof(lock_chains_in_use)
    + sizeof(lock_chains_in_dep)
    + sizeof(chain_hlocks)
    + + sizeof(chain_hlocks_type)
    #endif
    ) / 1024
    );
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2019-06-28 11:18    [W:4.076 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site