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 <duyuy...@gmail.com>
---
 kernel/locking/lockdep.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index a2d5148..0456f75 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -861,6 +861,7 @@ static bool class_lock_list_valid(struct lock_class *c, 
struct list_head *h)
 
 #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)
@@ -2668,6 +2669,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)
 {
@@ -2872,9 +2874,12 @@ static inline int 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())
@@ -4824,6 +4829,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
@@ -5268,6 +5276,7 @@ void __init lockdep_init(void)
                + sizeof(lock_chains)
                + sizeof(lock_chains_in_use)
                + sizeof(chain_hlocks)
+               + sizeof(chain_hlocks_type)
 #endif
                ) / 1024
                );
-- 
1.8.3.1

Reply via email to