diff options
-rw-r--r-- | kernel/locking/lockdep.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index 109b56267c8f..a033df00fd1d 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c | |||
@@ -500,15 +500,26 @@ static inline unsigned long lock_flag(enum lock_usage_bit bit) | |||
500 | 500 | ||
501 | static char get_usage_char(struct lock_class *class, enum lock_usage_bit bit) | 501 | static char get_usage_char(struct lock_class *class, enum lock_usage_bit bit) |
502 | { | 502 | { |
503 | /* | ||
504 | * The usage character defaults to '.' (i.e., irqs disabled and not in | ||
505 | * irq context), which is the safest usage category. | ||
506 | */ | ||
503 | char c = '.'; | 507 | char c = '.'; |
504 | 508 | ||
505 | if (class->usage_mask & lock_flag(bit + LOCK_USAGE_DIR_MASK)) | 509 | /* |
510 | * The order of the following usage checks matters, which will | ||
511 | * result in the outcome character as follows: | ||
512 | * | ||
513 | * - '+': irq is enabled and not in irq context | ||
514 | * - '-': in irq context and irq is disabled | ||
515 | * - '?': in irq context and irq is enabled | ||
516 | */ | ||
517 | if (class->usage_mask & lock_flag(bit + LOCK_USAGE_DIR_MASK)) { | ||
506 | c = '+'; | 518 | c = '+'; |
507 | if (class->usage_mask & lock_flag(bit)) { | 519 | if (class->usage_mask & lock_flag(bit)) |
508 | c = '-'; | ||
509 | if (class->usage_mask & lock_flag(bit + LOCK_USAGE_DIR_MASK)) | ||
510 | c = '?'; | 520 | c = '?'; |
511 | } | 521 | } else if (class->usage_mask & lock_flag(bit)) |
522 | c = '-'; | ||
512 | 523 | ||
513 | return c; | 524 | return c; |
514 | } | 525 | } |