1204431Sraj/*- 2204431Sraj * SPDX-License-Identifier: BSD-2-Clause 3204431Sraj * 4204431Sraj * Copyright 2008-2009 Stacey Son <sson@FreeBSD.org> 5204431Sraj * 6204431Sraj * Redistribution and use in source and binary forms, with or without 7204431Sraj * modification, are permitted provided that the following conditions 8204431Sraj * are met: 9204431Sraj * 1. Redistributions of source code must retain the above copyright 10204431Sraj * notice, this list of conditions and the following disclaimer. 11204431Sraj * 2. Redistributions in binary form must reproduce the above copyright 12204431Sraj * notice, this list of conditions and the following disclaimer in the 13204431Sraj * documentation and/or other materials provided with the distribution. 14204431Sraj * 15204431Sraj * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16204431Sraj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17204431Sraj * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18204431Sraj * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 19204431Sraj * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20204433Sraj * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21204433Sraj * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22204433Sraj * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23204433Sraj * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24204431Sraj * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25204431Sraj * SUCH DAMAGE. 26204431Sraj */ 27204433Sraj 28204431Sraj#include <sys/param.h> 29204431Sraj#include <sys/systm.h> 30204431Sraj#include <sys/lock.h> 31204431Sraj#include <sys/lockstat.h> 32204431Sraj#include <sys/sdt.h> 33204433Sraj#include <sys/time.h> 34204433Sraj 35204433SrajSDT_PROVIDER_DEFINE(lockstat); 36204433Sraj 37204433SrajSDT_PROBE_DEFINE1(lockstat, , , adaptive__acquire, "struct mtx *"); 38204433SrajSDT_PROBE_DEFINE1(lockstat, , , adaptive__release, "struct mtx *"); 39204433SrajSDT_PROBE_DEFINE2(lockstat, , , adaptive__spin, "struct mtx *", "uint64_t"); 40204433SrajSDT_PROBE_DEFINE2(lockstat, , , adaptive__block, "struct mtx *", "uint64_t"); 41204433Sraj 42204433SrajSDT_PROBE_DEFINE1(lockstat, , , spin__acquire, "struct mtx *"); 43204433SrajSDT_PROBE_DEFINE1(lockstat, , , spin__release, "struct mtx *"); 44204433SrajSDT_PROBE_DEFINE2(lockstat, , , spin__spin, "struct mtx *", "uint64_t"); 45204433Sraj 46204433SrajSDT_PROBE_DEFINE2(lockstat, , , rw__acquire, "struct rwlock *", "int"); 47204433SrajSDT_PROBE_DEFINE2(lockstat, , , rw__release, "struct rwlock *", "int"); 48204433SrajSDT_PROBE_DEFINE5(lockstat, , , rw__block, "struct rwlock *", "uint64_t", "int", 49204433Sraj "int", "int"); 50204433SrajSDT_PROBE_DEFINE2(lockstat, , , rw__spin, "struct rwlock *", "uint64_t"); 51204433SrajSDT_PROBE_DEFINE1(lockstat, , , rw__upgrade, "struct rwlock *"); 52204433SrajSDT_PROBE_DEFINE1(lockstat, , , rw__downgrade, "struct rwlock *"); 53204433Sraj 54204431SrajSDT_PROBE_DEFINE2(lockstat, , , sx__acquire, "struct sx *", "int"); 55204431SrajSDT_PROBE_DEFINE2(lockstat, , , sx__release, "struct sx *", "int"); 56204431SrajSDT_PROBE_DEFINE5(lockstat, , , sx__block, "struct sx *", "uint64_t", "int", 57204431Sraj "int", "int"); 58204431SrajSDT_PROBE_DEFINE2(lockstat, , , sx__spin, "struct sx *", "uint64_t"); 59204431SrajSDT_PROBE_DEFINE1(lockstat, , , sx__upgrade, "struct sx *"); 60204431SrajSDT_PROBE_DEFINE1(lockstat, , , sx__downgrade, "struct sx *"); 61204431Sraj 62204431SrajSDT_PROBE_DEFINE2(lockstat, , , lockmgr__acquire, "struct lock *", "int"); 63204431SrajSDT_PROBE_DEFINE2(lockstat, , , lockmgr__release, "struct lock *", "int"); 64204433SrajSDT_PROBE_DEFINE2(lockstat, , , lockmgr__disown, "struct lock *", "int"); 65204431SrajSDT_PROBE_DEFINE5(lockstat, , , lockmgr__block, "struct lock *", "uint64_t", 66204431Sraj "int", "int", "int"); 67204431SrajSDT_PROBE_DEFINE1(lockstat, , , lockmgr__upgrade, "struct lock *"); 68204431SrajSDT_PROBE_DEFINE1(lockstat, , , lockmgr__downgrade, "struct lock *"); 69204431Sraj 70204431SrajSDT_PROBE_DEFINE2(lockstat, , , thread__spin, "struct mtx *", "uint64_t"); 71204431Sraj 72204431Srajvolatile bool __read_frequently lockstat_enabled; 73204431Sraj 74204431Srajuint64_t 75204431Srajlockstat_nsecs(struct lock_object *lo) 76204431Sraj{ 77204431Sraj struct bintime bt; 78204433Sraj uint64_t ns; 79204433Sraj 80204431Sraj if (!lockstat_enabled) 81204431Sraj return (0); 82204431Sraj if ((lo->lo_flags & LO_NOPROFILE) != 0) 83204431Sraj return (0); 84204431Sraj 85204431Sraj binuptime(&bt); 86204431Sraj ns = bt.sec * (uint64_t)1000000000; 87204431Sraj ns += ((uint64_t)1000000000 * (uint32_t)(bt.frac >> 32)) >> 32; 88204431Sraj return (ns); 89204431Sraj} 90204431Sraj