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