Commit fb9edbe9 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Ingo Molnar

lockdep: Make held_lock->check and "int check" argument bool

The "int check" argument of lock_acquire() and held_lock->check are
misleading. This is actually a boolean: 2 means "true", everything
else is "false".

And there is no need to pass 1 or 0 to lock_acquire() depending on
CONFIG_PROVE_LOCKING, __lock_acquire() checks prove_locking at the
start and clears "check" if !CONFIG_PROVE_LOCKING.

Note: probably we can simply kill this member/arg. The only explicit
user of check => 0 is rcu_lock_acquire(), perhaps we can change it to
use lock_acquire(trylock =>, read => 2). __lockdep_no_validate means
check => 0 implicitly, but we can change validate_chain() to check
hlock->instance->key instead. Not to mention it would be nice to get
rid of lockdep_set_novalidate_class().
Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Cc: Dave Jones <davej@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20140120182006.GA26495@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent ddf1d169
...@@ -39,17 +39,10 @@ ...@@ -39,17 +39,10 @@
lock_acquire(&(l)->dep_map, s, t, r, c, n, i) lock_acquire(&(l)->dep_map, s, t, r, c, n, i)
# define __rel(l, n, i) \ # define __rel(l, n, i) \
lock_release(&(l)->dep_map, n, i) lock_release(&(l)->dep_map, n, i)
# ifdef CONFIG_PROVE_LOCKING #define lockdep_acquire(l, s, t, i) __acq(l, s, t, 0, 1, NULL, i)
# define lockdep_acquire(l, s, t, i) __acq(l, s, t, 0, 2, NULL, i) #define lockdep_acquire_nest(l, s, t, n, i) __acq(l, s, t, 0, 1, n, i)
# define lockdep_acquire_nest(l, s, t, n, i) __acq(l, s, t, 0, 2, n, i) #define lockdep_acquire_read(l, s, t, i) __acq(l, s, t, 1, 1, NULL, i)
# define lockdep_acquire_read(l, s, t, i) __acq(l, s, t, 1, 2, NULL, i) #define lockdep_release(l, n, i) __rel(l, n, i)
# define lockdep_release(l, n, i) __rel(l, n, i)
# else
# define lockdep_acquire(l, s, t, i) __acq(l, s, t, 0, 1, NULL, i)
# define lockdep_acquire_nest(l, s, t, n, i) __acq(l, s, t, 0, 1, n, i)
# define lockdep_acquire_read(l, s, t, i) __acq(l, s, t, 1, 1, NULL, i)
# define lockdep_release(l, n, i) __rel(l, n, i)
# endif
#else #else
# define lockdep_acquire(l, s, t, i) do { } while (0) # define lockdep_acquire(l, s, t, i) do { } while (0)
# define lockdep_acquire_nest(l, s, t, n, i) do { } while (0) # define lockdep_acquire_nest(l, s, t, n, i) do { } while (0)
......
...@@ -252,9 +252,9 @@ struct held_lock { ...@@ -252,9 +252,9 @@ struct held_lock {
unsigned int trylock:1; /* 16 bits */ unsigned int trylock:1; /* 16 bits */
unsigned int read:2; /* see lock_acquire() comment */ unsigned int read:2; /* see lock_acquire() comment */
unsigned int check:2; /* see lock_acquire() comment */ unsigned int check:1; /* see lock_acquire() comment */
unsigned int hardirqs_off:1; unsigned int hardirqs_off:1;
unsigned int references:11; /* 32 bits */ unsigned int references:12; /* 32 bits */
}; };
/* /*
...@@ -326,9 +326,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock, ...@@ -326,9 +326,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock,
* *
* Values for check: * Values for check:
* *
* 0: disabled * 0: simple checks (freeing, held-at-exit-time, etc.)
* 1: simple checks (freeing, held-at-exit-time, etc.) * 1: full validation
* 2: full validation
*/ */
extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass, extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
int trylock, int read, int check, int trylock, int read, int check,
...@@ -479,15 +478,9 @@ static inline void print_irqtrace_events(struct task_struct *curr) ...@@ -479,15 +478,9 @@ static inline void print_irqtrace_events(struct task_struct *curr)
* on the per lock-class debug mode: * on the per lock-class debug mode:
*/ */
#ifdef CONFIG_PROVE_LOCKING #define lock_acquire_exclusive(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, n, i)
#define lock_acquire_exclusive(l, s, t, n, i) lock_acquire(l, s, t, 0, 2, n, i) #define lock_acquire_shared(l, s, t, n, i) lock_acquire(l, s, t, 1, 1, n, i)
#define lock_acquire_shared(l, s, t, n, i) lock_acquire(l, s, t, 1, 2, n, i) #define lock_acquire_shared_recursive(l, s, t, n, i) lock_acquire(l, s, t, 2, 1, n, i)
#define lock_acquire_shared_recursive(l, s, t, n, i) lock_acquire(l, s, t, 2, 2, n, i)
#else
#define lock_acquire_exclusive(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, n, i)
#define lock_acquire_shared(l, s, t, n, i) lock_acquire(l, s, t, 1, 1, n, i)
#define lock_acquire_shared_recursive(l, s, t, n, i) lock_acquire(l, s, t, 2, 1, n, i)
#endif
#define spin_acquire(l, s, t, i) lock_acquire_exclusive(l, s, t, NULL, i) #define spin_acquire(l, s, t, i) lock_acquire_exclusive(l, s, t, NULL, i)
#define spin_acquire_nest(l, s, t, n, i) lock_acquire_exclusive(l, s, t, n, i) #define spin_acquire_nest(l, s, t, n, i) lock_acquire_exclusive(l, s, t, n, i)
...@@ -518,13 +511,13 @@ static inline void print_irqtrace_events(struct task_struct *curr) ...@@ -518,13 +511,13 @@ static inline void print_irqtrace_events(struct task_struct *curr)
# define might_lock(lock) \ # define might_lock(lock) \
do { \ do { \
typecheck(struct lockdep_map *, &(lock)->dep_map); \ typecheck(struct lockdep_map *, &(lock)->dep_map); \
lock_acquire(&(lock)->dep_map, 0, 0, 0, 2, NULL, _THIS_IP_); \ lock_acquire(&(lock)->dep_map, 0, 0, 0, 1, NULL, _THIS_IP_); \
lock_release(&(lock)->dep_map, 0, _THIS_IP_); \ lock_release(&(lock)->dep_map, 0, _THIS_IP_); \
} while (0) } while (0)
# define might_lock_read(lock) \ # define might_lock_read(lock) \
do { \ do { \
typecheck(struct lockdep_map *, &(lock)->dep_map); \ typecheck(struct lockdep_map *, &(lock)->dep_map); \
lock_acquire(&(lock)->dep_map, 0, 0, 1, 2, NULL, _THIS_IP_); \ lock_acquire(&(lock)->dep_map, 0, 0, 1, 1, NULL, _THIS_IP_); \
lock_release(&(lock)->dep_map, 0, _THIS_IP_); \ lock_release(&(lock)->dep_map, 0, _THIS_IP_); \
} while (0) } while (0)
#else #else
......
...@@ -314,7 +314,7 @@ static inline bool rcu_lockdep_current_cpu_online(void) ...@@ -314,7 +314,7 @@ static inline bool rcu_lockdep_current_cpu_online(void)
static inline void rcu_lock_acquire(struct lockdep_map *map) static inline void rcu_lock_acquire(struct lockdep_map *map)
{ {
lock_acquire(map, 0, 0, 2, 1, NULL, _THIS_IP_); lock_acquire(map, 0, 0, 2, 0, NULL, _THIS_IP_);
} }
static inline void rcu_lock_release(struct lockdep_map *map) static inline void rcu_lock_release(struct lockdep_map *map)
......
...@@ -2098,7 +2098,7 @@ static int validate_chain(struct task_struct *curr, struct lockdep_map *lock, ...@@ -2098,7 +2098,7 @@ static int validate_chain(struct task_struct *curr, struct lockdep_map *lock,
* (If lookup_chain_cache() returns with 1 it acquires * (If lookup_chain_cache() returns with 1 it acquires
* graph_lock for us) * graph_lock for us)
*/ */
if (!hlock->trylock && (hlock->check == 2) && if (!hlock->trylock && hlock->check &&
lookup_chain_cache(curr, hlock, chain_key)) { lookup_chain_cache(curr, hlock, chain_key)) {
/* /*
* Check whether last held lock: * Check whether last held lock:
...@@ -3055,9 +3055,6 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, ...@@ -3055,9 +3055,6 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
int class_idx; int class_idx;
u64 chain_key; u64 chain_key;
if (!prove_locking)
check = 1;
if (unlikely(!debug_locks)) if (unlikely(!debug_locks))
return 0; return 0;
...@@ -3069,8 +3066,8 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, ...@@ -3069,8 +3066,8 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) if (DEBUG_LOCKS_WARN_ON(!irqs_disabled()))
return 0; return 0;
if (lock->key == &__lockdep_no_validate__) if (!prove_locking || lock->key == &__lockdep_no_validate__)
check = 1; check = 0;
if (subclass < NR_LOCKDEP_CACHING_CLASSES) if (subclass < NR_LOCKDEP_CACHING_CLASSES)
class = lock->class_cache[subclass]; class = lock->class_cache[subclass];
...@@ -3138,7 +3135,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, ...@@ -3138,7 +3135,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
hlock->holdtime_stamp = lockstat_clock(); hlock->holdtime_stamp = lockstat_clock();
#endif #endif
if (check == 2 && !mark_irqflags(curr, hlock)) if (check && !mark_irqflags(curr, hlock))
return 0; return 0;
/* mark it as used: */ /* mark it as used: */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment