xref: /f-stack/freebsd/sys/lockstat.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 2008-2009 Stacey Son <[email protected]>
5a9643ea8Slogwang  *
6a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
7a9643ea8Slogwang  * modification, are permitted provided that the following conditions
8a9643ea8Slogwang  * are met:
9a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
10a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
11a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
12a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
13a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
14a9643ea8Slogwang  *
15a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25a9643ea8Slogwang  * SUCH DAMAGE.
26a9643ea8Slogwang  *
27a9643ea8Slogwang  * $FreeBSD$
28a9643ea8Slogwang  */
29a9643ea8Slogwang 
30a9643ea8Slogwang /*
31a9643ea8Slogwang  * DTrace lockstat provider definitions
32a9643ea8Slogwang  */
33a9643ea8Slogwang 
34a9643ea8Slogwang #ifndef _SYS_LOCKSTAT_H
35a9643ea8Slogwang #define	_SYS_LOCKSTAT_H
36a9643ea8Slogwang 
37a9643ea8Slogwang #ifdef _KERNEL
38a9643ea8Slogwang 
39a9643ea8Slogwang #include <sys/param.h>
40a9643ea8Slogwang #include <sys/queue.h>
41a9643ea8Slogwang #include <sys/sdt.h>
42a9643ea8Slogwang 
43a9643ea8Slogwang SDT_PROVIDER_DECLARE(lockstat);
44a9643ea8Slogwang 
45a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , adaptive__acquire);
46a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , adaptive__release);
47a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , adaptive__spin);
48a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , adaptive__block);
49a9643ea8Slogwang 
50a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , spin__acquire);
51a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , spin__release);
52a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , spin__spin);
53a9643ea8Slogwang 
54a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , rw__acquire);
55a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , rw__release);
56a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , rw__block);
57a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , rw__spin);
58a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , rw__upgrade);
59a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , rw__downgrade);
60a9643ea8Slogwang 
61a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , sx__acquire);
62a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , sx__release);
63a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , sx__block);
64a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , sx__spin);
65a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , sx__upgrade);
66a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , sx__downgrade);
67a9643ea8Slogwang 
68*22ce4affSfengbojiang SDT_PROBE_DECLARE(lockstat, , , lockmgr__acquire);
69*22ce4affSfengbojiang SDT_PROBE_DECLARE(lockstat, , , lockmgr__release);
70*22ce4affSfengbojiang SDT_PROBE_DECLARE(lockstat, , , lockmgr__disown);
71*22ce4affSfengbojiang SDT_PROBE_DECLARE(lockstat, , , lockmgr__block);
72*22ce4affSfengbojiang SDT_PROBE_DECLARE(lockstat, , , lockmgr__upgrade);
73*22ce4affSfengbojiang SDT_PROBE_DECLARE(lockstat, , , lockmgr__downgrade);
74*22ce4affSfengbojiang 
75a9643ea8Slogwang SDT_PROBE_DECLARE(lockstat, , , thread__spin);
76a9643ea8Slogwang 
77a9643ea8Slogwang #define	LOCKSTAT_WRITER		0
78a9643ea8Slogwang #define	LOCKSTAT_READER		1
79a9643ea8Slogwang 
80*22ce4affSfengbojiang extern volatile bool lockstat_enabled;
81a9643ea8Slogwang 
82a9643ea8Slogwang #ifdef KDTRACE_HOOKS
83a9643ea8Slogwang 
84a9643ea8Slogwang #define	LOCKSTAT_RECORD0(probe, lp)					\
85a9643ea8Slogwang 	SDT_PROBE1(lockstat, , , probe, lp)
86a9643ea8Slogwang 
87a9643ea8Slogwang #define	LOCKSTAT_RECORD1(probe, lp, arg1)				\
88a9643ea8Slogwang 	SDT_PROBE2(lockstat, , , probe, lp, arg1)
89a9643ea8Slogwang 
90a9643ea8Slogwang #define	LOCKSTAT_RECORD2(probe, lp, arg1, arg2)				\
91a9643ea8Slogwang 	SDT_PROBE3(lockstat, , , probe, lp, arg1, arg2)
92a9643ea8Slogwang 
93a9643ea8Slogwang #define	LOCKSTAT_RECORD3(probe, lp, arg1, arg2, arg3)			\
94a9643ea8Slogwang 	SDT_PROBE4(lockstat, , , probe, lp, arg1, arg2, arg3)
95a9643ea8Slogwang 
96a9643ea8Slogwang #define	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, arg3, arg4)		\
97a9643ea8Slogwang 	SDT_PROBE5(lockstat, , , probe, lp, arg1, arg2, arg3, arg4)
98a9643ea8Slogwang 
99a9643ea8Slogwang #define	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(probe, lp, c, wt, f, l) do { \
100a9643ea8Slogwang 	lock_profile_obtain_lock_success(&(lp)->lock_object, c, wt, f, l); \
101a9643ea8Slogwang 	LOCKSTAT_RECORD0(probe, lp);					\
102a9643ea8Slogwang } while (0)
103a9643ea8Slogwang 
104a9643ea8Slogwang #define	LOCKSTAT_PROFILE_OBTAIN_RWLOCK_SUCCESS(probe, lp, c, wt, f, l, a) do { \
105a9643ea8Slogwang 	lock_profile_obtain_lock_success(&(lp)->lock_object, c, wt, f, l); \
106a9643ea8Slogwang 	LOCKSTAT_RECORD1(probe, lp, a);					\
107a9643ea8Slogwang } while (0)
108a9643ea8Slogwang 
109a9643ea8Slogwang #define	LOCKSTAT_PROFILE_RELEASE_LOCK(probe, lp) do {			\
110a9643ea8Slogwang 	lock_profile_release_lock(&(lp)->lock_object);			\
111a9643ea8Slogwang 	LOCKSTAT_RECORD0(probe, lp);					\
112a9643ea8Slogwang } while (0)
113a9643ea8Slogwang 
114a9643ea8Slogwang #define	LOCKSTAT_PROFILE_RELEASE_RWLOCK(probe, lp, a) do {		\
115a9643ea8Slogwang 	lock_profile_release_lock(&(lp)->lock_object);			\
116a9643ea8Slogwang 	LOCKSTAT_RECORD1(probe, lp, a);					\
117a9643ea8Slogwang } while (0)
118a9643ea8Slogwang 
119*22ce4affSfengbojiang #define	LOCKSTAT_PROFILE_ENABLED(probe)		__predict_false(lockstat_enabled)
120*22ce4affSfengbojiang 
121a9643ea8Slogwang struct lock_object;
122a9643ea8Slogwang uint64_t lockstat_nsecs(struct lock_object *);
123a9643ea8Slogwang 
124a9643ea8Slogwang #else /* !KDTRACE_HOOKS */
125a9643ea8Slogwang 
126a9643ea8Slogwang #define	LOCKSTAT_RECORD0(probe, lp)
127a9643ea8Slogwang #define	LOCKSTAT_RECORD1(probe, lp, arg1)
128a9643ea8Slogwang #define	LOCKSTAT_RECORD2(probe, lp, arg1, arg2)
129a9643ea8Slogwang #define	LOCKSTAT_RECORD3(probe, lp, arg1, arg2, arg3)
130a9643ea8Slogwang #define	LOCKSTAT_RECORD4(probe, lp, arg1, arg2, arg3, arg4)
131a9643ea8Slogwang 
132a9643ea8Slogwang #define	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(probe, lp, c, wt, f, l)	\
133a9643ea8Slogwang 	lock_profile_obtain_lock_success(&(lp)->lock_object, c, wt, f, l)
134a9643ea8Slogwang 
135a9643ea8Slogwang #define	LOCKSTAT_PROFILE_OBTAIN_RWLOCK_SUCCESS(probe, lp, c, wt, f, l, a) \
136a9643ea8Slogwang 	LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(probe, lp, c, wt, f, l)
137a9643ea8Slogwang 
138a9643ea8Slogwang #define	LOCKSTAT_PROFILE_RELEASE_LOCK(probe, lp)  			\
139a9643ea8Slogwang 	lock_profile_release_lock(&(lp)->lock_object)
140a9643ea8Slogwang 
141a9643ea8Slogwang #define	LOCKSTAT_PROFILE_RELEASE_RWLOCK(probe, lp, a)  			\
142a9643ea8Slogwang 	LOCKSTAT_PROFILE_RELEASE_LOCK(probe, lp)
143a9643ea8Slogwang 
144*22ce4affSfengbojiang #define	LOCKSTAT_PROFILE_ENABLED(probe)		0
145*22ce4affSfengbojiang 
146a9643ea8Slogwang #endif /* !KDTRACE_HOOKS */
147*22ce4affSfengbojiang 
148a9643ea8Slogwang #endif /* _KERNEL */
149a9643ea8Slogwang #endif /* _SYS_LOCKSTAT_H */
150