1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 1997-2003 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _SYS_LOCKSTAT_H
28#define	_SYS_LOCKSTAT_H
29#endif
30
31/* #pragma ident	"@(#)lockstat.h	1.6	05/06/08 SMI" */
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37/*
38 * Spin locks - we have less variants
39 */
40#define	LS_LCK_SPIN_LOCK_ACQUIRE	0
41#define	LS_LCK_SPIN_LOCK_SPIN		1
42#define	LS_LCK_SPIN_UNLOCK_RELEASE	2
43/*
44 * Mutexes can also have interlock-spin events, which are
45 * unique to our lock implementation.
46 */
47#define	LS_LCK_MTX_LOCK_ACQUIRE			3
48#define	LS_LCK_MTX_LOCK_BLOCK			5
49#define	LS_LCK_MTX_LOCK_SPIN			6
50#define	LS_LCK_MTX_LOCK_ILK_SPIN		7
51#define	LS_LCK_MTX_TRY_LOCK_ACQUIRE		8
52#define	LS_LCK_MTX_TRY_SPIN_LOCK_ACQUIRE	9
53#define	LS_LCK_MTX_UNLOCK_RELEASE		10
54
55#define LS_LCK_MTX_LOCK_SPIN_ACQUIRE		39
56/*
57 * Provide a parallel set for indirect mutexes
58 */
59#define	LS_LCK_MTX_EXT_LOCK_ACQUIRE			17
60#define	LS_LCK_MTX_EXT_LOCK_BLOCK			18
61#define	LS_LCK_MTX_EXT_LOCK_SPIN			19
62#define	LS_LCK_MTX_EXT_LOCK_ILK_SPIN		20
63#define	LS_LCK_MTX_TRY_EXT_LOCK_ACQUIRE		21
64#define	LS_LCK_MTX_EXT_UNLOCK_RELEASE		22
65/*
66 * Our reader-writer locks support a blocking upgrade primitive, as
67 * well as the possibility of spinning on the interlock.
68 */
69#define	LS_LCK_RW_LOCK_SHARED_ACQUIRE		23
70#define	LS_LCK_RW_LOCK_SHARED_BLOCK		24
71#define	LS_LCK_RW_LOCK_SHARED_SPIN		25
72
73#define	LS_LCK_RW_LOCK_EXCL_ACQUIRE		26
74#define	LS_LCK_RW_LOCK_EXCL_BLOCK		27
75#define	LS_LCK_RW_LOCK_EXCL_SPIN		28
76
77#define	LS_LCK_RW_DONE_RELEASE			29
78
79#define	LS_LCK_RW_TRY_LOCK_SHARED_ACQUIRE	30
80#define	LS_LCK_RW_TRY_LOCK_SHARED_SPIN		31
81
82#define	LS_LCK_RW_TRY_LOCK_EXCL_ACQUIRE		32
83#define	LS_LCK_RW_TRY_LOCK_EXCL_ILK_SPIN	33
84
85#define	LS_LCK_RW_LOCK_SHARED_TO_EXCL_UPGRADE	34
86#define	LS_LCK_RW_LOCK_SHARED_TO_EXCL_SPIN	35
87#define	LS_LCK_RW_LOCK_SHARED_TO_EXCL_BLOCK	36
88
89#define	LS_LCK_RW_LOCK_EXCL_TO_SHARED_DOWNGRADE	37
90#define	LS_LCK_RW_LOCK_EXCL_TO_SHARED_ILK_SPIN	38
91
92#define	LS_NPROBES			40
93#define LS_LCK_INVALID			LS_NPROBES
94
95/*
96 * Name the various locking functions...
97 */
98#define	LS_LCK_MTX_LOCK			"lck_mtx_lock"
99#define	LS_LCK_MTX_SPIN_LOCK		"lck_mtx_spin_lock"
100#define	LS_LCK_MTX_UNLOCK		"lck_mtx_unlock"
101#define	LS_LCK_MTX_TRY_LOCK		"lck_mtx_try_lock"
102#define	LS_LCK_MTX_TRY_SPIN_LOCK	"lck_mtx_try_spin_lock"
103#define	LS_LCK_MTX_EXT_LOCK		"lck_mtx_ext_lock"
104#define	LS_LCK_MTX_EXT_UNLOCK		"lck_mtx_ext_unlock"
105#define	LS_LCK_MTX_EXT_TRY_LOCK		"lck_mtx_ext_try_lock"
106#define	LS_LCK_MTX_LOCK_SPIN_LOCK	"lck_mtx_lock_spin"
107
108#define	LS_LCK_SPIN_LOCK		"lck_spin_lock"
109#define	LS_LCK_SPIN_TRY_LOCK		"lck_spin_try_lock"
110#define	LS_LCK_SPIN_UNLOCK		"lck_spin_unlock"
111#define	LS_LCK_RW_LOCK_SHARED		"lck_rw_lock_shared"
112#define	LS_LCK_RW_LOCK_EXCL		"lck_rw_lock_exclusive"
113#define	LS_LCK_RW_DONE			"lck_rw_done"
114#define	LS_LCK_RW_TRY_LOCK_EXCL		"lck_rw_try_lock_exclusive"
115#define	LS_LCK_RW_TRY_LOCK_SHARED	"lck_rw_try_lock_shared"
116#define	LS_LCK_RW_LOCK_SHARED_TO_EXCL	"lck_rw_shared_to_exclusive"
117#define	LS_LCK_RW_LOCK_EXCL_TO_SHARED	"lck_rw_exclusive_to_shared"
118
119#define	LS_ACQUIRE			"acquire"
120#define	LS_RELEASE			"release"
121#define	LS_SPIN				"spin"
122#define	LS_BLOCK			"block"
123#define	LS_UPGRADE			"upgrade"
124#define	LS_DOWNGRADE			"downgrade"
125
126#define	LS_TYPE_ADAPTIVE		"adaptive"
127#define	LS_TYPE_SPIN			"spin"
128#define	LS_TYPE_ILK			"interlock"	/* OS X only */
129#define	LS_TYPE_THREAD			"thread"	/* Solaris only */
130#define	LS_TYPE_RW			"rw"
131#define	LS_TYPE_RWUPGRADE		"rwupgrade"	/* OS X only */
132
133#define	LSA_ACQUIRE			(LS_TYPE_ADAPTIVE "-" LS_ACQUIRE)
134#define	LSA_RELEASE			(LS_TYPE_ADAPTIVE "-" LS_RELEASE)
135#define	LSA_SPIN			(LS_TYPE_ADAPTIVE "-" LS_SPIN)
136#define	LSA_BLOCK			(LS_TYPE_ADAPTIVE "-" LS_BLOCK)
137#define	LSA_ILK_SPIN			(LS_TYPE_ILK "-" LS_SPIN)
138#define	LSS_ACQUIRE			(LS_TYPE_SPIN "-" LS_ACQUIRE)
139#define	LSS_RELEASE			(LS_TYPE_SPIN "-" LS_RELEASE)
140#define	LSS_SPIN			(LS_TYPE_SPIN "-" LS_SPIN)
141#define	LSR_ACQUIRE			(LS_TYPE_RW "-" LS_ACQUIRE)
142#define	LSR_RELEASE			(LS_TYPE_RW "-" LS_RELEASE)
143#define	LSR_BLOCK			(LS_TYPE_RW "-" LS_BLOCK)
144#define	LSR_SPIN			(LS_TYPE_RW "-" LS_SPIN)
145#define	LSR_UPGRADE			(LS_TYPE_RW "-" LS_UPGRADE)
146#define	LSR_UPGRADE_BLOCK		(LS_TYPE_RWUPGRADE "-" LS_BLOCK)
147#define	LSR_DOWNGRADE			(LS_TYPE_RW "-" LS_DOWNGRADE)
148#define	LST_SPIN			(LS_TYPE_THREAD "-" LS_SPIN)
149
150#ifndef _ASM
151
152#include <stdint.h>
153#ifdef KERNEL
154
155#ifndef _KERNEL
156#define _KERNEL /* Solaris vs. Darwin */
157#endif
158
159/*
160 * Platform-independent kernel support for the lockstat driver.
161 */
162#if defined(NEED_DTRACE_DEFS)
163typedef uint32_t dtrace_id_t;		/* probe identifier - also in dtrace.h! */
164typedef uint64_t	u_longlong_t;	/* also in dtrace.h! */
165#endif
166
167extern dtrace_id_t lockstat_probemap[LS_NPROBES];
168extern void (*lockstat_probe)(dtrace_id_t, uint64_t, uint64_t,
169    uint64_t, uint64_t, uint64_t);
170
171
172
173#ifdef _KERNEL
174
175#if	CONFIG_DTRACE
176
177extern void (lockstat_probe_wrapper)(int, uintptr_t, int);
178
179/*
180 * Macros to record lockstat probes.
181 */
182#define	LOCKSTAT_RECORD4(probe, lp, arg0, arg1, arg2, arg3)		\
183	{								\
184		dtrace_id_t id;						\
185		if ((id = lockstat_probemap[(probe)])) {		\
186			(*lockstat_probe)(id, (uintptr_t)(lp), (arg0),	\
187			    (arg1), (arg2), (arg3));			\
188		}							\
189	}
190
191#define	LOCKSTAT_RECORD2(probe, lp, arg1, arg2)	\
192	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, 0, 0)
193
194#define	LOCKSTAT_RECORD(probe, lp, arg)	\
195	LOCKSTAT_RECORD4(probe, lp, arg, 0, 0, 0)
196
197#define	LOCKSTAT_RECORD0(probe, lp)	\
198	LOCKSTAT_RECORD4(probe, lp, 0, 0, 0, 0)
199#else
200	/* No Lockstat provider */
201
202#define LOCKSTAT_RECORD()
203#define	LOCKSTAT_RECORD0()
204#define	LOCKSTAT_RECORD2()
205#define	LOCKSTAT_RECORD4()
206
207#endif /* !CONFIG_DTRACE */
208
209#endif /* _KERNEL */
210
211#endif /* _ASM */
212
213#ifdef	__cplusplus
214}
215#endif
216
217#endif	/* _SYS_LOCKSTAT_H */
218
219