forked from luck/tmp_suning_uos_patched
lockdep,trace: Expose tracepoints
The lockdep tracepoints are under the lockdep recursion counter, this has a bunch of nasty side effects: - TRACE_IRQFLAGS doesn't work across the entire tracepoint - RCU-lockdep doesn't see the tracepoints either, hiding numerous "suspicious RCU usage" warnings. Pull the trace_lock_*() tracepoints completely out from under the lockdep recursion handling and completely rely on the trace level recusion handling -- also, tracing *SHOULD* not be taking locks in any case. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Marco Elver <elver@google.com> Link: https://lkml.kernel.org/r/20200821085348.782688941@infradead.org
This commit is contained in:
parent
044d0d6de9
commit
eb1f00237a
|
@ -4977,6 +4977,8 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip);
|
||||||
|
|
||||||
if (unlikely(current->lockdep_recursion)) {
|
if (unlikely(current->lockdep_recursion)) {
|
||||||
/* XXX allow trylock from NMI ?!? */
|
/* XXX allow trylock from NMI ?!? */
|
||||||
if (lockdep_nmi() && !trylock) {
|
if (lockdep_nmi() && !trylock) {
|
||||||
|
@ -5001,7 +5003,6 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
|
||||||
check_flags(flags);
|
check_flags(flags);
|
||||||
|
|
||||||
current->lockdep_recursion++;
|
current->lockdep_recursion++;
|
||||||
trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip);
|
|
||||||
__lock_acquire(lock, subclass, trylock, read, check,
|
__lock_acquire(lock, subclass, trylock, read, check,
|
||||||
irqs_disabled_flags(flags), nest_lock, ip, 0, 0);
|
irqs_disabled_flags(flags), nest_lock, ip, 0, 0);
|
||||||
lockdep_recursion_finish();
|
lockdep_recursion_finish();
|
||||||
|
@ -5013,13 +5014,15 @@ void lock_release(struct lockdep_map *lock, unsigned long ip)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
trace_lock_release(lock, ip);
|
||||||
|
|
||||||
if (unlikely(current->lockdep_recursion))
|
if (unlikely(current->lockdep_recursion))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
raw_local_irq_save(flags);
|
raw_local_irq_save(flags);
|
||||||
check_flags(flags);
|
check_flags(flags);
|
||||||
|
|
||||||
current->lockdep_recursion++;
|
current->lockdep_recursion++;
|
||||||
trace_lock_release(lock, ip);
|
|
||||||
if (__lock_release(lock, ip))
|
if (__lock_release(lock, ip))
|
||||||
check_chain_key(current);
|
check_chain_key(current);
|
||||||
lockdep_recursion_finish();
|
lockdep_recursion_finish();
|
||||||
|
@ -5205,8 +5208,6 @@ __lock_acquired(struct lockdep_map *lock, unsigned long ip)
|
||||||
hlock->holdtime_stamp = now;
|
hlock->holdtime_stamp = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_lock_acquired(lock, ip);
|
|
||||||
|
|
||||||
stats = get_lock_stats(hlock_class(hlock));
|
stats = get_lock_stats(hlock_class(hlock));
|
||||||
if (waittime) {
|
if (waittime) {
|
||||||
if (hlock->read)
|
if (hlock->read)
|
||||||
|
@ -5225,6 +5226,8 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
trace_lock_acquired(lock, ip);
|
||||||
|
|
||||||
if (unlikely(!lock_stat || !debug_locks))
|
if (unlikely(!lock_stat || !debug_locks))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -5234,7 +5237,6 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip)
|
||||||
raw_local_irq_save(flags);
|
raw_local_irq_save(flags);
|
||||||
check_flags(flags);
|
check_flags(flags);
|
||||||
current->lockdep_recursion++;
|
current->lockdep_recursion++;
|
||||||
trace_lock_contended(lock, ip);
|
|
||||||
__lock_contended(lock, ip);
|
__lock_contended(lock, ip);
|
||||||
lockdep_recursion_finish();
|
lockdep_recursion_finish();
|
||||||
raw_local_irq_restore(flags);
|
raw_local_irq_restore(flags);
|
||||||
|
@ -5245,6 +5247,8 @@ void lock_acquired(struct lockdep_map *lock, unsigned long ip)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
trace_lock_contended(lock, ip);
|
||||||
|
|
||||||
if (unlikely(!lock_stat || !debug_locks))
|
if (unlikely(!lock_stat || !debug_locks))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user