1c7046f76SMartin Matuska /*
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3c7046f76SMartin Matuska  *
4c7046f76SMartin Matuska  * Copyright (c) 2022 Rob Wing
5c7046f76SMartin Matuska  *
6c7046f76SMartin Matuska  * Redistribution and use in source and binary forms, with or without
7c7046f76SMartin Matuska  * modification, are permitted provided that the following conditions
8c7046f76SMartin Matuska  * are met:
9c7046f76SMartin Matuska  * 1. Redistributions of source code must retain the above copyright
10c7046f76SMartin Matuska  *    notice, this list of conditions and the following disclaimer.
11c7046f76SMartin Matuska  * 2. Redistributions in binary form must reproduce the above copyright
12c7046f76SMartin Matuska  *    notice, this list of conditions and the following disclaimer in the
13c7046f76SMartin Matuska  *    documentation and/or other materials provided with the distribution.
14c7046f76SMartin Matuska  *
15c7046f76SMartin Matuska  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16c7046f76SMartin Matuska  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17c7046f76SMartin Matuska  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18c7046f76SMartin Matuska  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19c7046f76SMartin Matuska  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20c7046f76SMartin Matuska  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21c7046f76SMartin Matuska  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22c7046f76SMartin Matuska  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23c7046f76SMartin Matuska  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24c7046f76SMartin Matuska  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25c7046f76SMartin Matuska  * SUCH DAMAGE.
26c7046f76SMartin Matuska  */
27c7046f76SMartin Matuska 
28c7046f76SMartin Matuska #include <sys/param.h>
29c7046f76SMartin Matuska #include <sys/lock.h>
30c7046f76SMartin Matuska #include <sys/sx.h>
31c7046f76SMartin Matuska #include <sys/event.h>
32c7046f76SMartin Matuska 
33c7046f76SMartin Matuska #include <sys/freebsd_event.h>
34c7046f76SMartin Matuska 
35c7046f76SMartin Matuska static void
knlist_sx_xlock(void * arg)36c7046f76SMartin Matuska knlist_sx_xlock(void *arg)
37c7046f76SMartin Matuska {
38c7046f76SMartin Matuska 
39c7046f76SMartin Matuska 	sx_xlock((struct sx *)arg);
40c7046f76SMartin Matuska }
41c7046f76SMartin Matuska 
42c7046f76SMartin Matuska static void
knlist_sx_xunlock(void * arg)43c7046f76SMartin Matuska knlist_sx_xunlock(void *arg)
44c7046f76SMartin Matuska {
45c7046f76SMartin Matuska 
46c7046f76SMartin Matuska 	sx_xunlock((struct sx *)arg);
47c7046f76SMartin Matuska }
48c7046f76SMartin Matuska 
49*2276e539SMartin Matuska #if __FreeBSD_version >= 1300128
50c7046f76SMartin Matuska static void
knlist_sx_assert_lock(void * arg,int what)51c7046f76SMartin Matuska knlist_sx_assert_lock(void *arg, int what)
52c7046f76SMartin Matuska {
53c7046f76SMartin Matuska 
54c7046f76SMartin Matuska 	if (what == LA_LOCKED)
55c7046f76SMartin Matuska 		sx_assert((struct sx *)arg, SX_LOCKED);
56c7046f76SMartin Matuska 	else
57c7046f76SMartin Matuska 		sx_assert((struct sx *)arg, SX_UNLOCKED);
58c7046f76SMartin Matuska }
59*2276e539SMartin Matuska #else
60*2276e539SMartin Matuska static void
knlist_sx_assert_locked(void * arg)61*2276e539SMartin Matuska knlist_sx_assert_locked(void *arg)
62*2276e539SMartin Matuska {
63*2276e539SMartin Matuska 	sx_assert((struct sx *)arg, SX_LOCKED);
64*2276e539SMartin Matuska }
65*2276e539SMartin Matuska static void
knlist_sx_assert_unlocked(void * arg)66*2276e539SMartin Matuska knlist_sx_assert_unlocked(void *arg)
67*2276e539SMartin Matuska {
68*2276e539SMartin Matuska 	sx_assert((struct sx *)arg, SX_UNLOCKED);
69*2276e539SMartin Matuska }
70*2276e539SMartin Matuska #endif
71c7046f76SMartin Matuska 
72c7046f76SMartin Matuska void
knlist_init_sx(struct knlist * knl,struct sx * lock)73c7046f76SMartin Matuska knlist_init_sx(struct knlist *knl, struct sx *lock)
74c7046f76SMartin Matuska {
75c7046f76SMartin Matuska 
76*2276e539SMartin Matuska #if __FreeBSD_version >= 1300128
77c7046f76SMartin Matuska 	knlist_init(knl, lock, knlist_sx_xlock, knlist_sx_xunlock,
78c7046f76SMartin Matuska 	    knlist_sx_assert_lock);
79*2276e539SMartin Matuska #else
80*2276e539SMartin Matuska 	knlist_init(knl, lock, knlist_sx_xlock, knlist_sx_xunlock,
81*2276e539SMartin Matuska 	    knlist_sx_assert_locked, knlist_sx_assert_unlocked);
82*2276e539SMartin Matuska #endif
83c7046f76SMartin Matuska }
84