1164159Skmacy/*- 2164159Skmacy * Copyright (c) 2006 Kip Macy kmacy@FreeBSD.org 3164270Skmacy * Copyright (c) 2006 Kris Kennaway kris@FreeBSD.org 4164159Skmacy * Copyright (c) 2006 Dag-Erling Smorgrav des@des.no 5164159Skmacy * 6164159Skmacy * Redistribution and use in source and binary forms, with or without 7164159Skmacy * modification, are permitted provided that the following conditions 8164159Skmacy * are met: 9164159Skmacy * 1. Redistributions of source code must retain the above copyright 10164159Skmacy * notice, this list of conditions and the following disclaimer. 11164159Skmacy * 2. Redistributions in binary form must reproduce the above copyright 12164159Skmacy * notice, this list of conditions and the following disclaimer in the 13164159Skmacy * documentation and/or other materials provided with the distribution. 14164159Skmacy * 15164159Skmacy * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 16164159Skmacy * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17164159Skmacy * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18164159Skmacy * ARE DISCLAIMED. IN NO EVENT SHAL THE AUTHORS BE LIABLE FOR ANY 19164159Skmacy * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20164159Skmacy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21164159Skmacy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22164159Skmacy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23164159Skmacy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24164159Skmacy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25164159Skmacy * SUCH DAMAGE. 26164159Skmacy * 27164159Skmacy * $FreeBSD$ 28164159Skmacy */ 29164159Skmacy 30164159Skmacy 31164159Skmacy#ifndef _SYS_LOCK_PROFILE_H_ 32164159Skmacy#define _SYS_LOCK_PROFILE_H_ 33164159Skmacy 34174629Sjeffstruct lock_profile_object; 35174629SjeffLIST_HEAD(lpohead, lock_profile_object); 36174629Sjeff 37174633Sjeff#ifdef _KERNEL 38164159Skmacy#ifdef LOCK_PROFILING 39174645Skmacy#include <machine/cpufunc.h> 40174629Sjeff#include <sys/lock.h> 41164159Skmacy 42164165Skmacy#ifndef USE_CPU_NANOSECONDS 43164165Skmacyu_int64_t nanoseconds(void); 44164159Skmacy#endif 45164165Skmacy 46189845Sjeffextern volatile int lock_prof_enable; 47164159Skmacy 48174629Sjeffvoid lock_profile_obtain_lock_success(struct lock_object *lo, int contested, 49174629Sjeff uint64_t waittime, const char *file, int line); 50174629Sjeffvoid lock_profile_release_lock(struct lock_object *lo); 51189845Sjeffvoid lock_profile_thread_exit(struct thread *td); 52164159Skmacy 53189845Sjeff 54174629Sjeffstatic inline void 55174629Sjefflock_profile_obtain_lock_failed(struct lock_object *lo, int *contested, 56174629Sjeff uint64_t *waittime) 57174629Sjeff{ 58174629Sjeff if (!lock_prof_enable || (lo->lo_flags & LO_NOPROFILE) || *contested) 59174629Sjeff return; 60174629Sjeff *waittime = nanoseconds(); 61174629Sjeff *contested = 1; 62164159Skmacy} 63164159Skmacy 64174629Sjeff#else /* !LOCK_PROFILING */ 65164159Skmacy 66194578Srdivacky#define lock_profile_release_lock(lo) (void)0 67194578Srdivacky#define lock_profile_obtain_lock_failed(lo, contested, waittime) (void)0 68194578Srdivacky#define lock_profile_obtain_lock_success(lo, contested, waittime, file, line) (void)0 69194578Srdivacky#define lock_profile_thread_exit(td) (void)0 70164159Skmacy 71174629Sjeff#endif /* !LOCK_PROFILING */ 72164159Skmacy 73171372Sattilio#endif /* _KERNEL */ 74171372Sattilio 75164159Skmacy#endif /* _SYS_LOCK_PROFILE_H_ */ 76