1 /* $NetBSD: lockdep.h,v 1.9 2021/12/19 11:49:12 riastradh Exp $ */ 2 3 /*- 4 * Copyright (c) 2018 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Taylor R. Campbell. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _LINUX_LOCKDEP_H_ 33 #define _LINUX_LOCKDEP_H_ 34 35 #include <sys/cdefs.h> 36 #include <sys/types.h> 37 38 #include <lib/libkern/libkern.h> 39 40 struct lock_class_key; 41 struct mutex; 42 struct spinlock; 43 44 #define __acquires(lock) /* XXX lockdep annotation */ 45 #define __releases(lock) /* XXX lockdep annotation */ 46 47 #define mutex_acquire(m, x, y, ip) __nothing 48 #define mutex_release(m, ip) __nothing 49 50 #define __lockdep_used __unused 51 #define lockdep_init_map(a,b,c,d) __nothing 52 #define lock_acquire_shared_recursive(l, s, t, n, i) __nothing 53 #define lock_release(l, n) __nothing 54 #ifdef notyet 55 #define lockdep_assert_held(m) KDASSERT(lockdep_is_held(m)) 56 #define lockdep_assert_held_once(m) KDASSERT(lockdep_is_held(m)) 57 #define lockdep_is_held(m) mutex_owned(__lockdep_kmutex(m)) 58 #define might_lock(m) \ 59 KDASSERT(mutex_ownable(__lockdep_kmutex(m))) 60 #else 61 #define lockdep_assert_held(m) do {} while (0) 62 #define lockdep_assert_held_once(m) do {} while (0) 63 #define lockdep_is_held(m) 1 64 #define might_lock(m) do {} while (0) 65 #define might_lock_nested(m,n) do {} while (0) 66 #endif 67 68 #define __lockdep_kmutex(m) \ 69 (__builtin_types_compatible_p(typeof(*(m)), struct mutex) ? \ 70 &((const struct mutex *)(m))->mtx_lock \ 71 : __builtin_types_compatible_p(typeof(*(m)), struct spinlock) ? \ 72 &((const struct spinlock *)(m))->sl_lock \ 73 : NULL) 74 75 #define SINGLE_DEPTH_NESTING 0 76 77 struct pin_cookie { 78 int dummy; 79 }; 80 81 static inline struct pin_cookie 82 lockdep_pin_lock(struct mutex *m) 83 { 84 return (struct pin_cookie) { (int)(intptr_t)m }; 85 } 86 87 static inline void 88 lockdep_unpin_lock(struct mutex *m, struct pin_cookie cookie) 89 { 90 KASSERT(cookie.dummy == (int)(intptr_t)m); 91 } 92 93 static inline void 94 lockdep_set_class(void *m, struct lock_class_key *ck) 95 { 96 } 97 98 static inline void 99 lockdep_set_subclass(void *m, unsigned subclass) 100 { 101 } 102 103 #endif /* _LINUX_LOCKDEP_H_ */ 104