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, joe@perches.com,
	Yuyang Du <duyuyang@gmail.com>
Subject: [PATCH v3 03/18] locking/lockdep: Adjust lock usage bit character checks
Date: Thu, 21 Mar 2019 15:57:10 +0800	[thread overview]
Message-ID: <20190321075725.14054-4-duyuyang@gmail.com> (raw)
In-Reply-To: <20190321075725.14054-1-duyuyang@gmail.com>

The lock usage bit characters are defined and determined with tricks. Use a
macro and add some explanation to make it a bit clearer. Then adjust the
logic to check the usage, which optimizes the code a bit.

No functional change.

Signed-off-by: Yuyang Du <duyuyang@gmail.com>
---
 kernel/locking/lockdep.c           | 21 ++++++++++++++++-----
 kernel/locking/lockdep_internals.h |  1 +
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 41137ad..db0473d 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -514,15 +514,26 @@ static inline unsigned long lock_flag(enum lock_usage_bit bit)
 
 static char get_usage_char(struct lock_class *class, enum lock_usage_bit bit)
 {
+	/*
+	 * The usage character defaults to '.' (i.e., irqs disabled and not in
+	 * irq context), which is the safest usage category.
+	 */
 	char c = '.';
 
-	if (class->usage_mask & lock_flag(bit + 2))
+	/*
+	 * The order of the following usage checks matters, which will
+	 * result in the outcome character as follows:
+	 *
+	 * - '+': irq is enabled and not in irq context
+	 * - '-': in irq context and irq is disabled
+	 * - '?': in irq context and irq is enabled
+	 */
+	if (class->usage_mask & lock_flag(bit + LOCK_USAGE_TO_ENABLED_STEP)) {
 		c = '+';
-	if (class->usage_mask & lock_flag(bit)) {
-		c = '-';
-		if (class->usage_mask & lock_flag(bit + 2))
+		if (class->usage_mask & lock_flag(bit))
 			c = '?';
-	}
+	} else if (class->usage_mask & lock_flag(bit))
+		c = '-';
 
 	return c;
 }
diff --git a/kernel/locking/lockdep_internals.h b/kernel/locking/lockdep_internals.h
index d4c1974..2fd31d5 100644
--- a/kernel/locking/lockdep_internals.h
+++ b/kernel/locking/lockdep_internals.h
@@ -25,6 +25,7 @@ enum lock_usage_bit {
 #define LOCK_USAGE_READ_MASK 1
 #define LOCK_USAGE_DIR_MASK  2
 #define LOCK_USAGE_STATE_MASK (~(LOCK_USAGE_READ_MASK | LOCK_USAGE_DIR_MASK))
+#define LOCK_USAGE_TO_ENABLED_STEP 2
 
 /*
  * Usage-state bitmasks:
-- 
1.8.3.1


  parent reply	other threads:[~2019-03-21  7:57 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-21  7:57 [PATCH v3 00/18] locking/lockdep: Add comments and make some code Yuyang Du
2019-03-21  7:57 ` [PATCH v3 01/18] locking/lockdep: Change all print_*() return type to void Yuyang Du
2019-03-21  7:57 ` [PATCH v3 02/18] locking/lockdep: Add description and explanation in lockdep design doc Yuyang Du
2019-03-21  7:57 ` Yuyang Du [this message]
2019-03-21  7:57 ` [PATCH v3 04/18] locking/lockdep: Remove useless conditional macro Yuyang Du
2019-03-21  7:57 ` [PATCH v3 05/18] locking/lockdep: Print the right depth for chain key colission Yuyang Du
2019-03-21  7:57 ` [PATCH v3 06/18] locking/lockdep: Update obsolete struct field description Yuyang Du
2019-03-21  7:57 ` [PATCH v3 07/18] locking/lockdep: Use lockdep_init_task for task initiation consistently Yuyang Du
2019-03-21  7:57 ` [PATCH v3 08/18] locking/lockdep: Define INITIAL_CHAIN_KEY for chain keys to start with Yuyang Du
2019-03-21  7:57 ` [PATCH v3 09/18] locking/lockdep: Change the range of class_idx in held_lock struct Yuyang Du
2019-03-21  7:57 ` [PATCH v3 10/18] locking/lockdep: Remove unused argument in validate_chain() and check_deadlock() Yuyang Du
2019-03-21  7:57 ` [PATCH v3 11/18] locking/lockdep: Update comment Yuyang Du
2019-03-21  7:57 ` [PATCH v3 12/18] locking/lockdep: Remove unnecessary function pointer argument Yuyang Du
2019-03-21  7:57 ` [PATCH v3 13/18] locking/lockdep: Change type of the element field in circular_queue Yuyang Du
2019-03-21  7:57 ` [PATCH v3 14/18] locking/lockdep: Change the return type of __cq_dequeue() Yuyang Du
2019-03-21  7:57 ` [PATCH v3 15/18] locking/lockdep: Avoid constant checks in __bfs by using offset reference Yuyang Du
2019-03-21  7:57 ` [PATCH v3 16/18] locking/lockdep: Combine check_noncircular and check_redundant Yuyang Du
2019-03-21  7:57 ` [PATCH v3 17/18] locking/lockdep: Update comments on dependency search Yuyang Du
2019-03-21  7:57 ` [PATCH v3 18/18] locking/lockdep: Add explanation to lock usage rules in lockdep design doc Yuyang Du
2019-04-04  5:03   ` Question on a lockdep test case about mixed read-write ABBA 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=20190321075725.14054-4-duyuyang@gmail.com \
    --to=duyuyang@gmail.com \
    --cc=bvanassche@acm.org \
    --cc=joe@perches.com \
    --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.