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