All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yuyang Du <duyuyang@gmail.com>
To: peterz@infradead.org, will.deacon@arm.com, mingo@kernel.org
Cc: bvanassche@acm.org, ming.lei@redhat.com,
	linux-kernel@vger.kernel.org, Yuyang Du <duyuyang@gmail.com>
Subject: [PATCH v2 09/19] locking/lockdep: Define INITIAL_CHAIN_KEY for chain keys to start with
Date: Mon, 18 Mar 2019 16:57:23 +0800	[thread overview]
Message-ID: <20190318085733.3143-10-duyuyang@gmail.com> (raw)
In-Reply-To: <20190318085733.3143-1-duyuyang@gmail.com>

Chain keys are computed using Jenkins hash function, which needs an initial
hash to start with. Dedicate a macro to make this clear and configurable. A
later patch changes this initial chain key.

Signed-off-by: Yuyang Du <duyuyang@gmail.com>
---
 include/linux/lockdep.h  |  1 +
 init/init_task.c         |  2 +-
 kernel/locking/lockdep.c | 18 +++++++++---------
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 49b928f..dd8cf33 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -222,6 +222,7 @@ struct lock_chain {
  * bitfield and hitting the BUG in hlock_class().
  */
 #define MAX_LOCKDEP_KEYS		((1UL << MAX_LOCKDEP_KEYS_BITS) - 1)
+#define INITIAL_CHAIN_KEY		0
 
 struct held_lock {
 	/*
diff --git a/init/init_task.c b/init/init_task.c
index 9460878..ff3e8bf 100644
--- a/init/init_task.c
+++ b/init/init_task.c
@@ -166,7 +166,7 @@ struct task_struct init_task
 #endif
 #ifdef CONFIG_LOCKDEP
 	.lockdep_depth = 0, /* no locks held yet */
-	.curr_chain_key = 0,
+	.curr_chain_key = INITIAL_CHAIN_KEY,
 	.lockdep_recursion = 0,
 #endif
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 737fe0a..5459d37 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -361,7 +361,7 @@ static inline u64 iterate_chain_key(u64 key, u32 idx)
 inline void lockdep_init_task(struct task_struct *task)
 {
 	task->lockdep_depth = 0; /* no locks held yet */
-	task->curr_chain_key = 0;
+	task->curr_chain_key = INITIAL_CHAIN_KEY;
 	task->lockdep_recursion = 0;
 }
 
@@ -867,7 +867,7 @@ static bool class_lock_list_valid(struct lock_class *c, struct list_head *h)
 static bool check_lock_chain_key(struct lock_chain *chain)
 {
 #ifdef CONFIG_PROVE_LOCKING
-	u64 chain_key = 0;
+	u64 chain_key = INITIAL_CHAIN_KEY;
 	int i;
 
 	for (i = chain->base; i < chain->base + chain->depth; i++)
@@ -2430,7 +2430,7 @@ static u64 print_chain_key_iteration(int class_idx, u64 chain_key)
 print_chain_keys_held_locks(struct task_struct *curr, struct held_lock *hlock_next)
 {
 	struct held_lock *hlock;
-	u64 chain_key = 0;
+	u64 chain_key = INITIAL_CHAIN_KEY;
 	int depth = curr->lockdep_depth;
 	int i = get_first_held_lock(curr, hlock_next);
 
@@ -2450,7 +2450,7 @@ static u64 print_chain_key_iteration(int class_idx, u64 chain_key)
 static void print_chain_keys_chain(struct lock_chain *chain)
 {
 	int i;
-	u64 chain_key = 0;
+	u64 chain_key = INITIAL_CHAIN_KEY;
 	int class_id;
 
 	printk("depth: %u\n", chain->depth);
@@ -2754,7 +2754,7 @@ static void check_chain_key(struct task_struct *curr)
 #ifdef CONFIG_DEBUG_LOCKDEP
 	struct held_lock *hlock, *prev_hlock = NULL;
 	unsigned int i;
-	u64 chain_key = 0;
+	u64 chain_key = INITIAL_CHAIN_KEY;
 
 	for (i = 0; i < curr->lockdep_depth; i++) {
 		hlock = curr->held_locks + i;
@@ -2778,7 +2778,7 @@ static void check_chain_key(struct task_struct *curr)
 
 		if (prev_hlock && (prev_hlock->irq_context !=
 							hlock->irq_context))
-			chain_key = 0;
+			chain_key = INITIAL_CHAIN_KEY;
 		chain_key = iterate_chain_key(chain_key, hlock->class_idx);
 		prev_hlock = hlock;
 	}
@@ -3691,14 +3691,14 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
 		/*
 		 * How can we have a chain hash when we ain't got no keys?!
 		 */
-		if (DEBUG_LOCKS_WARN_ON(chain_key != 0))
+		if (DEBUG_LOCKS_WARN_ON(chain_key != INITIAL_CHAIN_KEY))
 			return 0;
 		chain_head = 1;
 	}
 
 	hlock->prev_chain_key = chain_key;
 	if (separate_irq_context(curr, hlock)) {
-		chain_key = 0;
+		chain_key = INITIAL_CHAIN_KEY;
 		chain_head = 1;
 	}
 	chain_key = iterate_chain_key(chain_key, class_idx);
@@ -4539,7 +4539,7 @@ static void remove_class_from_lock_chain(struct pending_free *pf,
 	return;
 
 recalc:
-	chain_key = 0;
+	chain_key = INITIAL_CHAIN_KEY;
 	for (i = chain->base; i < chain->base + chain->depth; i++)
 		chain_key = iterate_chain_key(chain_key, chain_hlocks[i] + 1);
 	if (chain->depth && chain->chain_key == chain_key)
-- 
1.8.3.1


  parent reply	other threads:[~2019-03-18  8:58 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-18  8:57 [PATCH v2 00/19] locking/lockdep: Add comments and make some code Yuyang Du
2019-03-18  8:57 ` [PATCH v2 01/19] locking/lockdep: Change all print_*() return type to void Yuyang Du
2019-03-18  9:45   ` Joe Perches
2019-03-19  3:28     ` Yuyang Du
2019-03-19 16:30     ` Bart Van Assche
2019-03-18  8:57 ` [PATCH v2 02/19] locking/lockdep: Add description and explanation in lockdep design doc Yuyang Du
2019-03-18  8:57 ` [PATCH v2 03/19] locking/lockdep: Adjust lock usage bit character checks Yuyang Du
2019-03-18  8:57 ` [PATCH v2 04/19] locking/lockdep: Remove useless conditional macro Yuyang Du
2019-03-18  8:57 ` [PATCH v2 05/19] locking/lockdep: Adjust indents for function definitions Yuyang Du
2019-03-19 16:33   ` Bart Van Assche
2019-03-19 16:36     ` Peter Zijlstra
2019-03-18  8:57 ` [PATCH v2 06/19] locking/lockdep: Print the right depth for chain key colission Yuyang Du
2019-03-18  8:57 ` [PATCH v2 07/19] locking/lockdep: Update obsolete struct field description Yuyang Du
2019-03-19 16:35   ` Bart Van Assche
2019-03-19 16:44     ` Peter Zijlstra
2019-03-18  8:57 ` [PATCH v2 08/19] locking/lockdep: Use lockdep_init_task for task initiation consistently Yuyang Du
2019-03-18  8:57 ` Yuyang Du [this message]
2019-03-18  8:57 ` [PATCH v2 10/19] locking/lockdep: Change the range of class_idx in held_lock struct Yuyang Du
2019-03-18  8:57 ` [PATCH v2 11/19] locking/lockdep: Remove unused argument in validate_chain() Yuyang Du
2019-03-19 16:45   ` Bart Van Assche
2019-03-18  8:57 ` [PATCH v2 12/19] locking/lockdep: Update comment Yuyang Du
2019-03-18  8:57 ` [PATCH v2 13/19] locking/lockdep: Remove unnecessary function pointer argument Yuyang Du
2019-03-19 16:48   ` Bart Van Assche
2019-03-18  8:57 ` [PATCH v2 14/19] locking/lockdep: Change type of the element field in circular_queue Yuyang Du
2019-03-19 16:50   ` Bart Van Assche
2019-03-19 16:51   ` Bart Van Assche
2019-03-18  8:57 ` [PATCH v2 15/19] locking/lockdep: Remove __cq_empty() Yuyang Du
2019-03-19 16:54   ` Bart Van Assche
2019-03-20  2:30     ` Yuyang Du
2019-03-18  8:57 ` [PATCH v2 16/19] locking/lockdep: Use function pointer to avoid constant checks Yuyang Du
2019-03-19 16:56   ` Bart Van Assche
2019-03-18  8:57 ` [PATCH v2 17/19] locking/lockdep: Combine check_noncircular and check_redundant Yuyang Du
2019-03-18  8:57 ` [PATCH v2 18/19] locking/lockdep: Update comments on dependency search Yuyang Du
2019-03-18  8:57 ` [PATCH v2 19/19] locking/lockdep: Change if to else-if when checking bfs errors Yuyang Du
2019-03-19 16:29   ` Bart Van Assche
2019-03-19 17:19     ` Joe Perches
2019-03-20  2:02     ` Yuyang Du

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190318085733.3143-10-duyuyang@gmail.com \
    --to=duyuyang@gmail.com \
    --cc=bvanassche@acm.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ming.lei@redhat.com \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.