Commit 16edd9b5 authored by Namhyung Kim's avatar Namhyung Kim Committed by Peter Zijlstra
Browse files

locking: Add lock contention tracepoints



This adds two new lock contention tracepoints like below:

 * lock:contention_begin
 * lock:contention_end

The lock:contention_begin takes a flags argument to classify locks.  I
found it useful to identify what kind of locks it's tracing like if
it's spinning or sleeping, reader-writer lock, real-time, and per-cpu.

Move tracepoint definitions into mutex.c so that we can use them
without lockdep.

Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: default avatarHyeonggon Yoo <42.hyeyoo@gmail.com>
Link: https://lkml.kernel.org/r/20220322185709.141236-2-namhyung@kernel.org
parent 1ee32619
Loading
Loading
Loading
Loading
+58 −3
Original line number Diff line number Diff line
@@ -5,11 +5,21 @@
#if !defined(_TRACE_LOCK_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_LOCK_H

#include <linux/lockdep.h>
#include <linux/sched.h>
#include <linux/tracepoint.h>

/* flags for lock:contention_begin */
#define LCB_F_SPIN	(1U << 0)
#define LCB_F_READ	(1U << 1)
#define LCB_F_WRITE	(1U << 2)
#define LCB_F_RT	(1U << 3)
#define LCB_F_PERCPU	(1U << 4)


#ifdef CONFIG_LOCKDEP

#include <linux/lockdep.h>

TRACE_EVENT(lock_acquire,

	TP_PROTO(struct lockdep_map *lock, unsigned int subclass,
@@ -78,8 +88,53 @@ DEFINE_EVENT(lock, lock_acquired,
	TP_ARGS(lock, ip)
);

#endif
#endif
#endif /* CONFIG_LOCK_STAT */
#endif /* CONFIG_LOCKDEP */

TRACE_EVENT(contention_begin,

	TP_PROTO(void *lock, unsigned int flags),

	TP_ARGS(lock, flags),

	TP_STRUCT__entry(
		__field(void *, lock_addr)
		__field(unsigned int, flags)
	),

	TP_fast_assign(
		__entry->lock_addr = lock;
		__entry->flags = flags;
	),

	TP_printk("%p (flags=%s)", __entry->lock_addr,
		  __print_flags(__entry->flags, "|",
				{ LCB_F_SPIN,		"SPIN" },
				{ LCB_F_READ,		"READ" },
				{ LCB_F_WRITE,		"WRITE" },
				{ LCB_F_RT,		"RT" },
				{ LCB_F_PERCPU,		"PERCPU" }
			  ))
);

TRACE_EVENT(contention_end,

	TP_PROTO(void *lock, int ret),

	TP_ARGS(lock, ret),

	TP_STRUCT__entry(
		__field(void *, lock_addr)
		__field(int, ret)
	),

	TP_fast_assign(
		__entry->lock_addr = lock;
		__entry->ret = ret;
	),

	TP_printk("%p (ret=%d)", __entry->lock_addr, __entry->ret)
);

#endif /* _TRACE_LOCK_H */

+0 −1
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@

#include "lockdep_internals.h"

#define CREATE_TRACE_POINTS
#include <trace/events/lock.h>

#ifdef CONFIG_PROVE_LOCKING
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@
#include <linux/debug_locks.h>
#include <linux/osq_lock.h>

#define CREATE_TRACE_POINTS
#include <trace/events/lock.h>

#ifndef CONFIG_PREEMPT_RT
#include "mutex.h"