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