lockstat.h revision 285759
1218885Sdim/*-
2218885Sdim * Copyright (c) 2008-2009 Stacey Son <sson@FreeBSD.org>
3218885Sdim *
4218885Sdim * Redistribution and use in source and binary forms, with or without
5218885Sdim * modification, are permitted provided that the following conditions
6218885Sdim * are met:
7218885Sdim * 1. Redistributions of source code must retain the above copyright
8218885Sdim *    notice, this list of conditions and the following disclaimer.
9218885Sdim * 2. Redistributions in binary form must reproduce the above copyright
10218885Sdim *    notice, this list of conditions and the following disclaimer in the
11218885Sdim *    documentation and/or other materials provided with the distribution.
12218885Sdim *
13218885Sdim * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14218885Sdim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15235633Sdim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16218885Sdim * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17218885Sdim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18218885Sdim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19218885Sdim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20218885Sdim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21218885Sdim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22218885Sdim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23218885Sdim * SUCH DAMAGE.
24245431Sdim *
25245431Sdim * $FreeBSD: stable/10/sys/sys/lockstat.h 285759 2015-07-21 17:16:37Z markj $
26245431Sdim */
27245431Sdim
28218885Sdim/*
29226890Sdim * DTrace lockstat provider definitions
30218885Sdim *
31218885Sdim */
32245431Sdim
33218885Sdim#ifndef	_SYS_LOCKSTAT_H
34218885Sdim#define	_SYS_LOCKSTAT_H
35218885Sdim
36218885Sdim#ifdef	_KERNEL
37218885Sdim
38218885Sdim/*
39218885Sdim * Spin Locks
40218885Sdim */
41218885Sdim#define	LS_MTX_SPIN_LOCK_ACQUIRE	0
42218885Sdim#define	LS_MTX_SPIN_UNLOCK_RELEASE	1
43218885Sdim#define	LS_MTX_SPIN_LOCK_SPIN		2
44218885Sdim
45226890Sdim/*
46218885Sdim * Adaptive Locks
47218885Sdim */
48218885Sdim#define	LS_MTX_LOCK_ACQUIRE		3
49218885Sdim#define	LS_MTX_UNLOCK_RELEASE		4
50245431Sdim#define	LS_MTX_LOCK_SPIN		5
51218885Sdim#define	LS_MTX_LOCK_BLOCK		6
52218885Sdim#define	LS_MTX_TRYLOCK_ACQUIRE		7
53218885Sdim
54218885Sdim/*
55218885Sdim * Reader/Writer Locks
56218885Sdim */
57218885Sdim#define	LS_RW_RLOCK_ACQUIRE		8
58218885Sdim#define	LS_RW_RUNLOCK_RELEASE		9
59218885Sdim#define	LS_RW_WLOCK_ACQUIRE		10
60226890Sdim#define	LS_RW_WUNLOCK_RELEASE		11
61218885Sdim#define	LS_RW_RLOCK_SPIN		12
62218885Sdim#define	LS_RW_RLOCK_BLOCK		13
63245431Sdim#define	LS_RW_WLOCK_SPIN		14
64218885Sdim#define	LS_RW_WLOCK_BLOCK		15
65218885Sdim#define	LS_RW_TRYUPGRADE_UPGRADE	16
66218885Sdim#define	LS_RW_DOWNGRADE_DOWNGRADE	17
67218885Sdim
68218885Sdim/*
69218885Sdim * Shared/Exclusive Locks
70218885Sdim */
71218885Sdim#define	LS_SX_SLOCK_ACQUIRE		18
72218885Sdim#define	LS_SX_SUNLOCK_RELEASE		19
73226890Sdim#define	LS_SX_XLOCK_ACQUIRE		20
74218885Sdim#define	LS_SX_XUNLOCK_RELEASE		21
75218885Sdim#define	LS_SX_SLOCK_SPIN		22
76245431Sdim#define	LS_SX_SLOCK_BLOCK		23
77218885Sdim#define	LS_SX_XLOCK_SPIN		24
78218885Sdim#define	LS_SX_XLOCK_BLOCK		25
79218885Sdim#define	LS_SX_TRYUPGRADE_UPGRADE	26
80218885Sdim#define	LS_SX_DOWNGRADE_DOWNGRADE	27
81218885Sdim
82218885Sdim/*
83218885Sdim * Thread Locks
84218885Sdim */
85218885Sdim#define	LS_THREAD_LOCK_SPIN		28
86226890Sdim
87218885Sdim/*
88218885Sdim * Lockmanager Locks
89245431Sdim *  According to locking(9) Lockmgr locks are "Largely deprecated"
90218885Sdim *  so no support for these have been added in the lockstat provider.
91218885Sdim */
92218885Sdim
93218885Sdim#define	LS_NPROBES			29
94218885Sdim
95218885Sdim#define	LS_MTX_LOCK			"mtx_lock"
96218885Sdim#define	LS_MTX_UNLOCK			"mtx_unlock"
97218885Sdim#define	LS_MTX_SPIN_LOCK		"mtx_lock_spin"
98218885Sdim#define	LS_MTX_SPIN_UNLOCK		"mtx_unlock_spin"
99218885Sdim#define	LS_MTX_TRYLOCK			"mtx_trylock"
100218885Sdim#define	LS_RW_RLOCK			"rw_rlock"
101218885Sdim#define	LS_RW_WLOCK			"rw_wlock"
102218885Sdim#define	LS_RW_RUNLOCK			"rw_runlock"
103218885Sdim#define	LS_RW_WUNLOCK			"rw_wunlock"
104218885Sdim#define	LS_RW_TRYUPGRADE		"rw_try_upgrade"
105218885Sdim#define	LS_RW_DOWNGRADE			"rw_downgrade"
106218885Sdim#define	LS_SX_SLOCK			"sx_slock"
107218885Sdim#define	LS_SX_XLOCK			"sx_xlock"
108218885Sdim#define	LS_SX_SUNLOCK			"sx_sunlock"
109218885Sdim#define	LS_SX_XUNLOCK			"sx_xunlock"
110218885Sdim#define	LS_SX_TRYUPGRADE		"sx_try_upgrade"
111218885Sdim#define	LS_SX_DOWNGRADE			"sx_downgrade"
112218885Sdim#define	LS_THREAD_LOCK			"thread_lock"
113218885Sdim
114218885Sdim#define	LS_ACQUIRE			"acquire"
115218885Sdim#define	LS_RELEASE			"release"
116218885Sdim#define	LS_SPIN				"spin"
117#define	LS_BLOCK			"block"
118#define	LS_UPGRADE			"upgrade"
119#define	LS_DOWNGRADE			"downgrade"
120
121#define	LS_TYPE_ADAPTIVE		"adaptive"
122#define	LS_TYPE_SPIN			"spin"
123#define	LS_TYPE_THREAD			"thread"
124#define	LS_TYPE_RW			"rw"
125#define	LS_TYPE_SX			"sx"
126
127#define	LSA_ACQUIRE			(LS_TYPE_ADAPTIVE "-" LS_ACQUIRE)
128#define	LSA_RELEASE			(LS_TYPE_ADAPTIVE "-" LS_RELEASE)
129#define	LSA_SPIN			(LS_TYPE_ADAPTIVE "-" LS_SPIN)
130#define	LSA_BLOCK			(LS_TYPE_ADAPTIVE "-" LS_BLOCK)
131#define	LSS_ACQUIRE			(LS_TYPE_SPIN "-" LS_ACQUIRE)
132#define	LSS_RELEASE			(LS_TYPE_SPIN "-" LS_RELEASE)
133#define	LSS_SPIN			(LS_TYPE_SPIN "-" LS_SPIN)
134#define	LSR_ACQUIRE			(LS_TYPE_RW "-" LS_ACQUIRE)
135#define	LSR_RELEASE			(LS_TYPE_RW "-" LS_RELEASE)
136#define	LSR_BLOCK			(LS_TYPE_RW "-" LS_BLOCK)
137#define	LSR_SPIN			(LS_TYPE_RW "-" LS_SPIN)
138#define	LSR_UPGRADE			(LS_TYPE_RW "-" LS_UPGRADE)
139#define	LSR_DOWNGRADE			(LS_TYPE_RW "-" LS_DOWNGRADE)
140#define	LSX_ACQUIRE			(LS_TYPE_SX "-" LS_ACQUIRE)
141#define	LSX_RELEASE			(LS_TYPE_SX "-" LS_RELEASE)
142#define	LSX_BLOCK			(LS_TYPE_SX "-" LS_BLOCK)
143#define	LSX_SPIN			(LS_TYPE_SX "-" LS_SPIN)
144#define	LSX_UPGRADE			(LS_TYPE_SX "-" LS_UPGRADE)
145#define	LSX_DOWNGRADE			(LS_TYPE_SX "-" LS_DOWNGRADE)
146#define	LST_SPIN			(LS_TYPE_THREAD "-" LS_SPIN)
147
148/*
149 * The following must match the type definition of dtrace_probe.  It is
150 * defined this way to avoid having to rely on CDDL code.
151 */
152struct lock_object;
153extern uint32_t lockstat_probemap[LS_NPROBES];
154typedef void (*lockstat_probe_func_t)(uint32_t, uintptr_t arg0, uintptr_t arg1,
155    uintptr_t arg2, uintptr_t arg3, uintptr_t arg4);
156extern lockstat_probe_func_t lockstat_probe_func;
157extern uint64_t lockstat_nsecs(struct lock_object *);
158extern int lockstat_enabled;
159
160#ifdef	KDTRACE_HOOKS
161/*
162 * Macros to record lockstat probes.
163 */
164#define	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, arg3, arg4)  do {	\
165	uint32_t id;							\
166									\
167	if ((id = lockstat_probemap[(probe)])) 				\
168	    (*lockstat_probe_func)(id, (uintptr_t)(lp), (arg1),	(arg2),	\
169		(arg3), (arg4));					\
170} while (0)
171
172#define	LOCKSTAT_RECORD(probe, lp, arg1) \
173	LOCKSTAT_RECORD4(probe, lp, arg1, 0, 0, 0)
174
175#define	LOCKSTAT_RECORD0(probe, lp)     \
176	LOCKSTAT_RECORD4(probe, lp, 0, 0, 0, 0)
177
178#define	LOCKSTAT_RECORD1(probe, lp, arg1) \
179	LOCKSTAT_RECORD4(probe, lp, arg1, 0, 0, 0)
180
181#define	LOCKSTAT_RECORD2(probe, lp, arg1, arg2) \
182	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, 0, 0)
183
184#define	LOCKSTAT_RECORD3(probe, lp, arg1, arg2, arg3) \
185	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, arg3, 0)
186
187#define	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(probe, lp, c, wt, f, l)  do {   \
188	uint32_t id;							     \
189									     \
190    	lock_profile_obtain_lock_success(&(lp)->lock_object, c, wt, f, l);   \
191	if ((id = lockstat_probemap[(probe)])) 			     	     \
192		(*lockstat_probe_func)(id, (uintptr_t)(lp), 0, 0, 0, 0);     \
193} while (0)
194
195#define	LOCKSTAT_PROFILE_RELEASE_LOCK(probe, lp)  do {			     \
196	uint32_t id;							     \
197									     \
198	lock_profile_release_lock(&(lp)->lock_object);			     \
199	if ((id = lockstat_probemap[(probe)])) 			     	     \
200		(*lockstat_probe_func)(id, (uintptr_t)(lp), 0, 0, 0, 0);     \
201} while (0)
202
203#define	LOCKSTAT_WRITER		0
204#define	LOCKSTAT_READER		1
205
206#else	/* !KDTRACE_HOOKS */
207
208#define	LOCKSTAT_RECORD(probe, lp, arg1)
209#define	LOCKSTAT_RECORD0(probe, lp)
210#define	LOCKSTAT_RECORD1(probe, lp, arg1)
211#define	LOCKSTAT_RECORD2(probe, lp, arg1, arg2)
212#define	LOCKSTAT_RECORD3(probe, lp, arg1, arg2, arg3)
213#define	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, arg3, arg4)
214
215#define	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(probe, lp, c, wt, f, l)	\
216	lock_profile_obtain_lock_success(&(lp)->lock_object, c, wt, f, l)
217
218#define	LOCKSTAT_PROFILE_RELEASE_LOCK(probe, lp)  			\
219	lock_profile_release_lock(&(lp)->lock_object)
220
221#endif	/* !KDTRACE_HOOKS */
222
223#endif	/* _KERNEL */
224
225#endif	/* _SYS_LOCKSTAT_H */
226