xref: /f-stack/lib/ff_lock.c (revision 2317ada5)
1a9643ea8Slogwang /*
2a9643ea8Slogwang  * Copyright (c) 2010 Kip Macy. All rights reserved.
3*2317ada5Sfengbojiang  * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
4a9643ea8Slogwang  * All rights reserved.
5a9643ea8Slogwang  *
6a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
7a9643ea8Slogwang  * modification, are permitted provided that the following conditions are met:
8a9643ea8Slogwang  *
9a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright notice, this
10a9643ea8Slogwang  *   list of conditions and the following disclaimer.
11a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright notice,
12a9643ea8Slogwang  *   this list of conditions and the following disclaimer in the documentation
13a9643ea8Slogwang  *   and/or other materials provided with the distribution.
14a9643ea8Slogwang  *
15a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17a9643ea8Slogwang  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18a9643ea8Slogwang  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19a9643ea8Slogwang  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20a9643ea8Slogwang  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21a9643ea8Slogwang  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22a9643ea8Slogwang  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23a9643ea8Slogwang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24a9643ea8Slogwang  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25a9643ea8Slogwang  *
26a9643ea8Slogwang  * Derived in part from libplebnet's pn_lock.c.
27a9643ea8Slogwang  */
28a9643ea8Slogwang 
29a9643ea8Slogwang #include <sys/param.h>
30a9643ea8Slogwang #include <sys/systm.h>
31a9643ea8Slogwang #include <sys/bus.h>
32a9643ea8Slogwang #include <sys/conf.h>
33a9643ea8Slogwang #include <sys/kdb.h>
34a9643ea8Slogwang #include <sys/kernel.h>
35a9643ea8Slogwang #include <sys/ktr.h>
36a9643ea8Slogwang #include <sys/lock.h>
37a9643ea8Slogwang #include <sys/malloc.h>
38a9643ea8Slogwang #include <sys/mutex.h>
39a9643ea8Slogwang #include <sys/rmlock.h>
40a9643ea8Slogwang #include <sys/rwlock.h>
41a9643ea8Slogwang #include <sys/sx.h>
42a9643ea8Slogwang #include <sys/proc.h>
43a9643ea8Slogwang #include <sys/resourcevar.h>
44a9643ea8Slogwang #include <sys/sched.h>
45a9643ea8Slogwang #include <sys/sbuf.h>
46a9643ea8Slogwang #include <sys/sysctl.h>
47a9643ea8Slogwang #include <sys/turnstile.h>
48a9643ea8Slogwang #include <sys/vmmeter.h>
49a9643ea8Slogwang #include <sys/lock_profile.h>
50a9643ea8Slogwang 
51a9643ea8Slogwang #include "ff_host_interface.h"
52a9643ea8Slogwang 
53a9643ea8Slogwang struct mtx Giant;
54a9643ea8Slogwang 
55a9643ea8Slogwang static void
assert_mtx(const struct lock_object * lock,int what)56a9643ea8Slogwang assert_mtx(const struct lock_object *lock, int what)
57a9643ea8Slogwang {
58a9643ea8Slogwang 
59a9643ea8Slogwang }
60a9643ea8Slogwang 
61a9643ea8Slogwang static void
lock_mtx(struct lock_object * lock,uintptr_t how)62a9643ea8Slogwang lock_mtx(struct lock_object *lock, uintptr_t how)
63a9643ea8Slogwang {
64a9643ea8Slogwang 
65a9643ea8Slogwang }
66a9643ea8Slogwang 
67a9643ea8Slogwang static uintptr_t
unlock_mtx(struct lock_object * lock)68a9643ea8Slogwang unlock_mtx(struct lock_object *lock)
69a9643ea8Slogwang {
70a9643ea8Slogwang     return (0);
71a9643ea8Slogwang }
72a9643ea8Slogwang 
73a9643ea8Slogwang /*
74a9643ea8Slogwang  * Lock classes for sleep and spin mutexes.
75a9643ea8Slogwang  */
76a9643ea8Slogwang struct lock_class lock_class_mtx_sleep = {
77a9643ea8Slogwang     .lc_name = "sleep mutex",
78a9643ea8Slogwang     .lc_flags = LC_SLEEPLOCK | LC_RECURSABLE,
79a9643ea8Slogwang     .lc_assert = assert_mtx,
80a9643ea8Slogwang     .lc_lock = lock_mtx,
81a9643ea8Slogwang     .lc_unlock = unlock_mtx,
82a9643ea8Slogwang #ifdef DDB
83a9643ea8Slogwang     .lc_ddb_show = db_show_mtx,
84a9643ea8Slogwang #endif
85a9643ea8Slogwang #ifdef KDTRACE_HOOKS
86a9643ea8Slogwang     .lc_owner = owner_mtx,
87a9643ea8Slogwang #endif
88a9643ea8Slogwang };
89a9643ea8Slogwang 
90a9643ea8Slogwang void
ff_mtx_init(struct lock_object * lo,const char * name,const char * type,int opts)91a9643ea8Slogwang ff_mtx_init(struct lock_object *lo, const char *name, const char *type, int opts)
92a9643ea8Slogwang {
93a9643ea8Slogwang     lock_init(lo, &lock_class_mtx_sleep, name, type, opts);
94a9643ea8Slogwang }
95a9643ea8Slogwang 
96a9643ea8Slogwang void
mtx_sysinit(void * arg)97a9643ea8Slogwang mtx_sysinit(void *arg)
98a9643ea8Slogwang {
99a9643ea8Slogwang     struct mtx_args *margs = arg;
100a9643ea8Slogwang     mtx_init((struct mtx *)margs->ma_mtx, margs->ma_desc, NULL, margs->ma_opts);
101a9643ea8Slogwang }
102a9643ea8Slogwang 
_mtx_destroy(volatile uintptr_t * c)103a9643ea8Slogwang void _mtx_destroy(volatile uintptr_t *c)
104a9643ea8Slogwang {
105a9643ea8Slogwang 
106a9643ea8Slogwang }
107a9643ea8Slogwang 
108a9643ea8Slogwang static void
lock_rw(struct lock_object * lock,uintptr_t how)109a9643ea8Slogwang lock_rw(struct lock_object *lock, uintptr_t how)
110a9643ea8Slogwang {
111a9643ea8Slogwang 
112a9643ea8Slogwang }
113a9643ea8Slogwang 
114a9643ea8Slogwang static uintptr_t
unlock_rw(struct lock_object * lock)115a9643ea8Slogwang unlock_rw(struct lock_object *lock)
116a9643ea8Slogwang {
117a9643ea8Slogwang     return (0);
118a9643ea8Slogwang }
119a9643ea8Slogwang 
120a9643ea8Slogwang #ifdef KDTRACE_HOOKS
121a9643ea8Slogwang static int
owner_rw(struct lock_object * lock,struct thread ** owner)122a9643ea8Slogwang owner_rw(struct lock_object *lock, struct thread **owner)
123a9643ea8Slogwang {
124a9643ea8Slogwang     return 1;//??
125a9643ea8Slogwang }
126a9643ea8Slogwang #endif
127a9643ea8Slogwang 
128a9643ea8Slogwang 
129a9643ea8Slogwang static void
assert_rw(const struct lock_object * lock,int what)130a9643ea8Slogwang assert_rw(const struct lock_object *lock, int what)
131a9643ea8Slogwang {
132a9643ea8Slogwang 
133a9643ea8Slogwang }
134a9643ea8Slogwang 
135a9643ea8Slogwang struct lock_class lock_class_rw = {
136a9643ea8Slogwang     .lc_name = "rw",
137a9643ea8Slogwang     .lc_flags = LC_SLEEPLOCK | LC_RECURSABLE | LC_UPGRADABLE,
138a9643ea8Slogwang     .lc_assert = assert_rw,
139a9643ea8Slogwang #ifdef DDB
140a9643ea8Slogwang     .lc_ddb_show = db_show_rwlock,
141a9643ea8Slogwang #endif
142a9643ea8Slogwang     .lc_lock = lock_rw,
143a9643ea8Slogwang     .lc_unlock = unlock_rw,
144a9643ea8Slogwang #ifdef KDTRACE_HOOKS
145a9643ea8Slogwang     .lc_owner = owner_rw,
146a9643ea8Slogwang #endif
147a9643ea8Slogwang };
148a9643ea8Slogwang 
149a9643ea8Slogwang void
rw_sysinit(void * arg)150a9643ea8Slogwang rw_sysinit(void *arg)
151a9643ea8Slogwang {
152a9643ea8Slogwang     struct rw_args *args = arg;
153a9643ea8Slogwang     rw_init((struct rwlock *)args->ra_rw, args->ra_desc);
154a9643ea8Slogwang }
155a9643ea8Slogwang 
15622ce4affSfengbojiang #if 0
157a9643ea8Slogwang void
158a9643ea8Slogwang rw_sysinit_flags(void *arg)
159a9643ea8Slogwang {
160a9643ea8Slogwang     rw_sysinit(arg);
161a9643ea8Slogwang }
16222ce4affSfengbojiang #endif
163a9643ea8Slogwang 
164a9643ea8Slogwang void
ff_rw_init_flags(struct lock_object * lo,const char * name,int opts)165a9643ea8Slogwang ff_rw_init_flags(struct lock_object *lo, const char *name, int opts)
166a9643ea8Slogwang {
167a9643ea8Slogwang     int flags;
168a9643ea8Slogwang 
169a9643ea8Slogwang     MPASS((opts & ~(RW_DUPOK | RW_NOPROFILE | RW_NOWITNESS | RW_QUIET |
170a9643ea8Slogwang         RW_RECURSE)) == 0);
171a9643ea8Slogwang 
172a9643ea8Slogwang     flags = LO_UPGRADABLE;
173a9643ea8Slogwang     if (opts & RW_DUPOK)
174a9643ea8Slogwang         flags |= LO_DUPOK;
175a9643ea8Slogwang     if (opts & RW_NOPROFILE)
176a9643ea8Slogwang         flags |= LO_NOPROFILE;
177a9643ea8Slogwang     if (!(opts & RW_NOWITNESS))
178a9643ea8Slogwang         flags |= LO_WITNESS;
179a9643ea8Slogwang     if (opts & RW_RECURSE)
180a9643ea8Slogwang         flags |= LO_RECURSABLE;
181a9643ea8Slogwang     if (opts & RW_QUIET)
182a9643ea8Slogwang         flags |= LO_QUIET;
183a9643ea8Slogwang 
184a9643ea8Slogwang     lock_init(lo, &lock_class_rw, name, NULL, flags);
185a9643ea8Slogwang }
186a9643ea8Slogwang 
_rw_destroy(volatile uintptr_t * c)187a9643ea8Slogwang void _rw_destroy(volatile uintptr_t *c)
188a9643ea8Slogwang {
189a9643ea8Slogwang 
190a9643ea8Slogwang }
191a9643ea8Slogwang 
192a9643ea8Slogwang static void
assert_rm(const struct lock_object * lock,int what)193a9643ea8Slogwang assert_rm(const struct lock_object *lock, int what)
194a9643ea8Slogwang {
195a9643ea8Slogwang 
196a9643ea8Slogwang }
197a9643ea8Slogwang 
198a9643ea8Slogwang struct lock_class lock_class_rm = {
199a9643ea8Slogwang     .lc_name = "rm",
200a9643ea8Slogwang     .lc_flags = LC_SLEEPLOCK | LC_RECURSABLE,
201a9643ea8Slogwang     .lc_assert = assert_rm,
202a9643ea8Slogwang #if 0
203a9643ea8Slogwang #ifdef DDB
204a9643ea8Slogwang     .lc_ddb_show = db_show_rwlock,
205a9643ea8Slogwang #endif
206a9643ea8Slogwang #endif
207a9643ea8Slogwang #ifdef KDTRACE_HOOKS
208a9643ea8Slogwang     .lc_owner = owner_rm,
209a9643ea8Slogwang #endif
210a9643ea8Slogwang };
211a9643ea8Slogwang 
212a9643ea8Slogwang void
rm_init(struct rmlock * rm,const char * name)213a9643ea8Slogwang rm_init(struct rmlock *rm, const char *name)
214a9643ea8Slogwang {
215a9643ea8Slogwang     rm_init_flags(rm, name, 0);
216a9643ea8Slogwang }
217a9643ea8Slogwang 
218a9643ea8Slogwang void
rm_init_flags(struct rmlock * rm,const char * name,int opts)219a9643ea8Slogwang rm_init_flags(struct rmlock *rm, const char *name, int opts)
220a9643ea8Slogwang {
221a9643ea8Slogwang     int liflags = 0;
222a9643ea8Slogwang     if (!(opts & RM_NOWITNESS))
223a9643ea8Slogwang         liflags |= LO_WITNESS;
224a9643ea8Slogwang     if (opts & RM_RECURSE)
225a9643ea8Slogwang         liflags |= LO_RECURSABLE;
226a9643ea8Slogwang 
227a9643ea8Slogwang     lock_init(&rm->lock_object, &lock_class_rm, name, NULL, liflags);
228a9643ea8Slogwang }
229a9643ea8Slogwang 
230a9643ea8Slogwang void
rm_sysinit(void * arg)231a9643ea8Slogwang rm_sysinit(void *arg)
232a9643ea8Slogwang {
233a9643ea8Slogwang     struct rm_args *args = arg;
234a9643ea8Slogwang     rm_init((struct rmlock *)args->ra_rm, args->ra_desc);
235a9643ea8Slogwang }
236a9643ea8Slogwang 
23722ce4affSfengbojiang #if 0
238a9643ea8Slogwang void
239a9643ea8Slogwang rm_sysinit_flags(void *arg)
240a9643ea8Slogwang {
241a9643ea8Slogwang     rm_sysinit(arg);
242a9643ea8Slogwang }
24322ce4affSfengbojiang #endif
244a9643ea8Slogwang 
245a9643ea8Slogwang void
rm_destroy(struct rmlock * rm)246a9643ea8Slogwang rm_destroy(struct rmlock *rm)
247a9643ea8Slogwang {
248a9643ea8Slogwang 
249a9643ea8Slogwang }
250a9643ea8Slogwang 
251a9643ea8Slogwang void
_rm_wlock(struct rmlock * rm)252a9643ea8Slogwang _rm_wlock(struct rmlock *rm)
253a9643ea8Slogwang {
254a9643ea8Slogwang 
255a9643ea8Slogwang }
256a9643ea8Slogwang 
257a9643ea8Slogwang void
_rm_wunlock(struct rmlock * rm)258a9643ea8Slogwang _rm_wunlock(struct rmlock *rm)
259a9643ea8Slogwang {
260a9643ea8Slogwang 
261a9643ea8Slogwang }
262a9643ea8Slogwang 
263a9643ea8Slogwang int
_rm_rlock(struct rmlock * rm,struct rm_priotracker * tracker,int trylock)264a9643ea8Slogwang _rm_rlock(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
265a9643ea8Slogwang {
266a9643ea8Slogwang     return (1);
267a9643ea8Slogwang }
268a9643ea8Slogwang 
269a9643ea8Slogwang void
_rm_runlock(struct rmlock * rm,struct rm_priotracker * tracker)270a9643ea8Slogwang _rm_runlock(struct rmlock *rm,  struct rm_priotracker *tracker)
271a9643ea8Slogwang {
272a9643ea8Slogwang 
273a9643ea8Slogwang }
274a9643ea8Slogwang 
275a9643ea8Slogwang int
rm_wowned(const struct rmlock * rm)276a9643ea8Slogwang rm_wowned(const struct rmlock *rm)
277a9643ea8Slogwang {
278a9643ea8Slogwang     return (1);
279a9643ea8Slogwang }
280a9643ea8Slogwang 
281a9643ea8Slogwang struct lock_class lock_class_sx = {
282a9643ea8Slogwang     .lc_name = "sx",
283a9643ea8Slogwang     .lc_flags = LC_SLEEPLOCK | LC_SLEEPABLE | LC_RECURSABLE | LC_UPGRADABLE,
284a9643ea8Slogwang #ifdef DDB
285a9643ea8Slogwang     .lc_ddb_show = db_show_sx,
286a9643ea8Slogwang #endif
287a9643ea8Slogwang #ifdef KDTRACE_HOOKS
288a9643ea8Slogwang     .lc_owner = owner_sx,
289a9643ea8Slogwang #endif
290a9643ea8Slogwang };
291a9643ea8Slogwang 
292a9643ea8Slogwang void
sx_init_flags(struct sx * sx,const char * description,int opts)293a9643ea8Slogwang sx_init_flags(struct sx *sx, const char *description, int opts)
294a9643ea8Slogwang {
295a9643ea8Slogwang     int flags;
296a9643ea8Slogwang 
297a9643ea8Slogwang     MPASS((opts & ~(SX_QUIET | SX_RECURSE | SX_NOWITNESS | SX_DUPOK |
29822ce4affSfengbojiang         SX_NOPROFILE | SX_NEW)) == 0);
299a9643ea8Slogwang 
300a9643ea8Slogwang     flags = LO_SLEEPABLE | LO_UPGRADABLE;
301a9643ea8Slogwang     if (opts & SX_DUPOK)
302a9643ea8Slogwang         flags |= LO_DUPOK;
303a9643ea8Slogwang     if (opts & SX_NOPROFILE)
304a9643ea8Slogwang         flags |= LO_NOPROFILE;
305a9643ea8Slogwang     if (!(opts & SX_NOWITNESS))
306a9643ea8Slogwang         flags |= LO_WITNESS;
307a9643ea8Slogwang     if (opts & SX_RECURSE)
308a9643ea8Slogwang         flags |= LO_RECURSABLE;
309a9643ea8Slogwang     if (opts & SX_QUIET)
310a9643ea8Slogwang         flags |= LO_QUIET;
31122ce4affSfengbojiang     if (opts & SX_NEW)
31222ce4affSfengbojiang         flags |= LO_NEW;
313a9643ea8Slogwang 
314a9643ea8Slogwang     lock_init(&sx->lock_object, &lock_class_sx, description, NULL, flags);
31522ce4affSfengbojiang     //sx->sx_lock = SX_LOCK_UNLOCKED;
31622ce4affSfengbojiang     //sx->sx_recurse = 0;
317a9643ea8Slogwang }
318a9643ea8Slogwang 
319a9643ea8Slogwang void
sx_destroy(struct sx * sx)320a9643ea8Slogwang sx_destroy(struct sx *sx)
321a9643ea8Slogwang {
322a9643ea8Slogwang 
323a9643ea8Slogwang }
324a9643ea8Slogwang 
325a9643ea8Slogwang int
_sx_xlock(struct sx * sx,int opts,const char * file,int line)326a9643ea8Slogwang _sx_xlock(struct sx *sx, int opts,
327a9643ea8Slogwang     const char *file, int line)
328a9643ea8Slogwang {
329a9643ea8Slogwang     return (0);
330a9643ea8Slogwang }
331a9643ea8Slogwang 
332a9643ea8Slogwang int
_sx_slock(struct sx * sx,int opts,const char * file,int line)333a9643ea8Slogwang _sx_slock(struct sx *sx, int opts, const char *file, int line)
334a9643ea8Slogwang {
335a9643ea8Slogwang     return (0);
336a9643ea8Slogwang }
337a9643ea8Slogwang 
338a9643ea8Slogwang void
_sx_xunlock(struct sx * sx,const char * file,int line)339a9643ea8Slogwang _sx_xunlock(struct sx *sx, const char *file, int line)
340a9643ea8Slogwang {
341a9643ea8Slogwang 
342a9643ea8Slogwang }
343a9643ea8Slogwang 
344a9643ea8Slogwang void
_sx_sunlock(struct sx * sx,const char * file,int line)345a9643ea8Slogwang _sx_sunlock(struct sx *sx, const char *file, int line)
346a9643ea8Slogwang {
347a9643ea8Slogwang 
348a9643ea8Slogwang }
349a9643ea8Slogwang 
350a9643ea8Slogwang int
sx_try_slock_(struct sx * sx,const char * file,int line)351a9643ea8Slogwang sx_try_slock_(struct sx *sx, const char *file, int line)
352a9643ea8Slogwang {
353a9643ea8Slogwang     return 1;
354a9643ea8Slogwang }
355a9643ea8Slogwang 
356a9643ea8Slogwang int
sx_try_xlock_(struct sx * sx,const char * file,int line)357a9643ea8Slogwang sx_try_xlock_(struct sx *sx, const char *file, int line)
358a9643ea8Slogwang {
359a9643ea8Slogwang     return 1;
360a9643ea8Slogwang }
361a9643ea8Slogwang 
362a9643ea8Slogwang int
sx_try_upgrade_(struct sx * sx,const char * file,int line)363a9643ea8Slogwang sx_try_upgrade_(struct sx *sx, const char *file, int line)
364a9643ea8Slogwang {
365a9643ea8Slogwang     return 1;
366a9643ea8Slogwang }
367a9643ea8Slogwang 
368a9643ea8Slogwang void
sx_downgrade_(struct sx * sx,const char * file,int line)369a9643ea8Slogwang sx_downgrade_(struct sx *sx, const char *file, int line)
370a9643ea8Slogwang {
371a9643ea8Slogwang 
372a9643ea8Slogwang }
373a9643ea8Slogwang 
374a9643ea8Slogwang void
sx_sysinit(void * arg)375a9643ea8Slogwang sx_sysinit(void *arg)
376a9643ea8Slogwang {
377a9643ea8Slogwang     struct sx_args *args = arg;
378a9643ea8Slogwang     sx_init(args->sa_sx, args->sa_desc);
379a9643ea8Slogwang }
380a9643ea8Slogwang 
381a9643ea8Slogwang /*
382a9643ea8Slogwang  * XXX should never be used;
383a9643ea8Slogwang  */
384a9643ea8Slogwang struct lock_class lock_class_lockmgr;
385a9643ea8Slogwang 
386a9643ea8Slogwang static void
lock_spin(struct lock_object * lock,uintptr_t how)387a9643ea8Slogwang lock_spin(struct lock_object *lock, uintptr_t how)
388a9643ea8Slogwang {
389a9643ea8Slogwang     printf("%s: called!\n", __func__);
390a9643ea8Slogwang }
391a9643ea8Slogwang 
392a9643ea8Slogwang static uintptr_t
unlock_spin(struct lock_object * lock)393a9643ea8Slogwang unlock_spin(struct lock_object *lock)
394a9643ea8Slogwang {
395a9643ea8Slogwang     printf("%s: called!\n", __func__);
396a9643ea8Slogwang     return (0);
397a9643ea8Slogwang }
398a9643ea8Slogwang 
399a9643ea8Slogwang /*
400a9643ea8Slogwang  * XXX should never be used;
401a9643ea8Slogwang  */
402a9643ea8Slogwang struct lock_class lock_class_mtx_spin = {
403a9643ea8Slogwang     .lc_name = "spin mutex",
404a9643ea8Slogwang     .lc_flags = LC_SPINLOCK | LC_RECURSABLE,
405a9643ea8Slogwang     .lc_assert = assert_mtx,
406a9643ea8Slogwang     .lc_lock = lock_spin,
407a9643ea8Slogwang     .lc_unlock = unlock_spin,
408a9643ea8Slogwang };
409a9643ea8Slogwang 
410a9643ea8Slogwang /*
411a9643ea8Slogwang  * These do not support read locks because it would be hard to make
412a9643ea8Slogwang  * the tracker work correctly with the current lock_class API as you
413a9643ea8Slogwang  * would need to have the tracker pointer available when calling
414a9643ea8Slogwang  * rm_rlock() in lock_rm().
415a9643ea8Slogwang  */
416a9643ea8Slogwang static void
lock_rm(struct lock_object * lock,uintptr_t how)417a9643ea8Slogwang lock_rm(struct lock_object *lock, uintptr_t how)
418a9643ea8Slogwang {
419a9643ea8Slogwang 
420a9643ea8Slogwang }
421a9643ea8Slogwang 
422a9643ea8Slogwang static uintptr_t
unlock_rm(struct lock_object * lock)423a9643ea8Slogwang unlock_rm(struct lock_object *lock)
424a9643ea8Slogwang {
425a9643ea8Slogwang     return (1);
426a9643ea8Slogwang }
427a9643ea8Slogwang 
428a9643ea8Slogwang struct lock_class lock_class_rm_sleepable = {
429a9643ea8Slogwang     .lc_name = "sleepable rm",
430a9643ea8Slogwang     .lc_flags = LC_SLEEPLOCK | LC_SLEEPABLE | LC_RECURSABLE,
431a9643ea8Slogwang     .lc_assert = assert_rm,
432a9643ea8Slogwang #ifdef DDB
433a9643ea8Slogwang     .lc_ddb_show = db_show_rm,
434a9643ea8Slogwang #endif
435a9643ea8Slogwang     .lc_lock = lock_rm,
436a9643ea8Slogwang     .lc_unlock = unlock_rm,
437a9643ea8Slogwang #ifdef KDTRACE_HOOKS
438a9643ea8Slogwang     .lc_owner = owner_rm,
439a9643ea8Slogwang #endif
440a9643ea8Slogwang };
441a9643ea8Slogwang 
442a9643ea8Slogwang void
mutex_init(void)443a9643ea8Slogwang mutex_init(void)
444a9643ea8Slogwang {
445a9643ea8Slogwang     mtx_init(&Giant, "Giant", NULL, MTX_DEF | MTX_RECURSE);
446a9643ea8Slogwang     mtx_init(&proc0.p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
447a9643ea8Slogwang }
448a9643ea8Slogwang 
449