xref: /dflybsd-src/share/man/man9/serializer.9 (revision c04308e8fc22699d31171b18b2d5797ece796c6d)
104262d71SSascha Wildner.\"
204262d71SSascha Wildner.\" Copyright (c) 2007
304262d71SSascha Wildner.\"	The DragonFly Project.  All rights reserved.
404262d71SSascha Wildner.\"
504262d71SSascha Wildner.\" Redistribution and use in source and binary forms, with or without
604262d71SSascha Wildner.\" modification, are permitted provided that the following conditions
704262d71SSascha Wildner.\" are met:
804262d71SSascha Wildner.\"
904262d71SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright
1004262d71SSascha Wildner.\"    notice, this list of conditions and the following disclaimer.
1104262d71SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright
1204262d71SSascha Wildner.\"    notice, this list of conditions and the following disclaimer in
1304262d71SSascha Wildner.\"    the documentation and/or other materials provided with the
1404262d71SSascha Wildner.\"    distribution.
1504262d71SSascha Wildner.\" 3. Neither the name of The DragonFly Project nor the names of its
1604262d71SSascha Wildner.\"    contributors may be used to endorse or promote products derived
1704262d71SSascha Wildner.\"    from this software without specific, prior written permission.
1804262d71SSascha Wildner.\"
1904262d71SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2004262d71SSascha Wildner.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2104262d71SSascha Wildner.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2204262d71SSascha Wildner.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
2304262d71SSascha Wildner.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2404262d71SSascha Wildner.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
2504262d71SSascha Wildner.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2604262d71SSascha Wildner.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2704262d71SSascha Wildner.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2804262d71SSascha Wildner.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2904262d71SSascha Wildner.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3004262d71SSascha Wildner.\" SUCH DAMAGE.
3104262d71SSascha Wildner.\"
32cb5caf9aSSepherosa Ziehau.Dd January 17, 2014
3304262d71SSascha Wildner.Dt SERIALIZER 9
34fb5b3747SSascha Wildner.Os
3504262d71SSascha Wildner.Sh NAME
3604262d71SSascha Wildner.Nm lwkt_serialize_init ,
3704262d71SSascha Wildner.Nm lwkt_serialize_enter ,
38a3df9cc3SSascha Wildner.Nm lwkt_serialize_adaptive_enter ,
3904262d71SSascha Wildner.Nm lwkt_serialize_try ,
4004262d71SSascha Wildner.Nm lwkt_serialize_exit ,
4104262d71SSascha Wildner.Nm lwkt_serialize_handler_enable ,
4204262d71SSascha Wildner.Nm lwkt_serialize_handler_disable ,
4304262d71SSascha Wildner.Nm lwkt_serialize_handler_call ,
4404262d71SSascha Wildner.Nm lwkt_serialize_handler_try ,
45cb5caf9aSSepherosa Ziehau.Nm LWKT_SERIALIZE_INITIALIZER ,
465700433eSFranco Fichtner.Nm ASSERT_SERIALIZED ,
47872e08f8SSascha Wildner.Nm ASSERT_NOT_SERIALIZED
4804262d71SSascha Wildner.Nd generic low level serializer
4904262d71SSascha Wildner.Sh SYNOPSIS
5004262d71SSascha Wildner.In sys/serialize.h
5104262d71SSascha Wildner.Ft void
5204262d71SSascha Wildner.Fn lwkt_serialize_init "lwkt_serialize_t s"
5304262d71SSascha Wildner.Ft void
5404262d71SSascha Wildner.Fn lwkt_serialize_enter "lwkt_serialize_t s"
55a3df9cc3SSascha Wildner.Ft void
56a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter "lwkt_serialize_t s"
5704262d71SSascha Wildner.Ft int
5804262d71SSascha Wildner.Fn lwkt_serialize_try "lwkt_serialize_t s"
5904262d71SSascha Wildner.Ft void
6004262d71SSascha Wildner.Fn lwkt_serialize_exit "lwkt_serialize_t s"
6104262d71SSascha Wildner.Ft void
6204262d71SSascha Wildner.Fn lwkt_serialize_handler_enable "lwkt_serialize_t s"
6304262d71SSascha Wildner.Ft void
6404262d71SSascha Wildner.Fn lwkt_serialize_handler_disable "lwkt_serialize_t s"
6504262d71SSascha Wildner.Ft void
6604262d71SSascha Wildner.Fo lwkt_serialize_handler_call
6704262d71SSascha Wildner.Fa "lwkt_serialize_t s"
6804262d71SSascha Wildner.Fa "void (*func)(void *, void *)"
6904262d71SSascha Wildner.Fa "void *arg"
7004262d71SSascha Wildner.Fa "void *frame"
7104262d71SSascha Wildner.Fc
7204262d71SSascha Wildner.Ft int
7304262d71SSascha Wildner.Fo lwkt_serialize_handler_try
7404262d71SSascha Wildner.Fa "lwkt_serialize_t s"
7504262d71SSascha Wildner.Fa "void (*func)(void *, void *)"
7604262d71SSascha Wildner.Fa "void *arg"
7704262d71SSascha Wildner.Fa "void *frame"
7804262d71SSascha Wildner.Fc
79cb5caf9aSSepherosa Ziehau.Pp
80cb5caf9aSSepherosa Ziehau.Nm LWKT_SERIALIZE_INITIALIZER ;
8104262d71SSascha Wildner.Fn ASSERT_SERIALIZED "s"
82872e08f8SSascha Wildner.Fn ASSERT_NOT_SERIALIZED "s"
8304262d71SSascha Wildner.Sh DESCRIPTION
8404262d71SSascha WildnerThe
8504262d71SSascha Wildner.Nm serializer
8604262d71SSascha WildnerAPI provides a fast locked-bus-cycle-based serialization facility
8704262d71SSascha Wildnerthat will serialize across blocking conditions.
8804262d71SSascha WildnerIt is very similar to a lock but much faster for the common case.
8904262d71SSascha Wildner.Pp
908351abadSSepherosa ZiehauThis API was initially designed to be a replacement for SPL calls,
918351abadSSepherosa Ziehaubut may be used whenever a low level exclusive lock (serialization)
928351abadSSepherosa Ziehauand/or interrupt/device interaction is required.
938351abadSSepherosa ZiehauIf it is used by interrupt,
948351abadSSepherosa Ziehaucallers should enter critical section to prevent the current thread
958351abadSSepherosa Ziehauholding the serializer being preempted by interrupt thread
968351abadSSepherosa Ziehauwhich may try to hold the same serializer.
978351abadSSepherosa ZiehauUnlike tokens this serialization is not safe from deadlocks
988351abadSSepherosa Ziehaunor is it recursive,
998351abadSSepherosa Ziehauand care must be taken when using it.
10004262d71SSascha WildnerNote that
10104262d71SSascha Wildner.Xr tsleep 9
10204262d71SSascha Wildnerwill not release a serializer that is being held.
10304262d71SSascha Wildner.Pp
10404262d71SSascha WildnerThere are two primary facilities \(em the serializer facility itself and
10504262d71SSascha Wildneran integrated non-stackable interrupt handler disablement facility
10604262d71SSascha Wildnerused by drivers.
10704262d71SSascha Wildner.Pp
10804262d71SSascha Wildner.Fn lwkt_serialize_init ,
10904262d71SSascha Wildner.Fn lwkt_serialize_enter
11004262d71SSascha Wildnerand
11104262d71SSascha Wildner.Fn lwkt_serialize_exit
11204262d71SSascha Wildnerrespectively initialize, hold and release the serializer
11304262d71SSascha Wildner.Fa s .
11404262d71SSascha Wildner.Fn lwkt_serialize_try
11504262d71SSascha Wildneris a non-blocking version of
11604262d71SSascha Wildner.Fn lwkt_serialize_enter .
11704262d71SSascha Wildner.Pp
118a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter
119a3df9cc3SSascha Wildneris a special version of
120a3df9cc3SSascha Wildner.Fn lwkt_serialize_enter
121a3df9cc3SSascha Wildnerwhich will try to spin a bit before the current thread is put to sleep
122a3df9cc3SSascha Wildnerif the serializer
123a3df9cc3SSascha Wildner.Fa s
124a3df9cc3SSascha Wildneris contended.
125a3df9cc3SSascha WildnerBy default,
126a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter
127a3df9cc3SSascha Wildnerfavors spinning over sleeping.
128a3df9cc3SSascha Wildner.Pp
12904262d71SSascha Wildner.Fn lwkt_serialize_handler_disable ,
13004262d71SSascha Wildner.Fn lwkt_serialize_handler_enable
13104262d71SSascha Wildnerand
13204262d71SSascha Wildner.Fn lwkt_serialize_handler_call
13304262d71SSascha Wildnerrespectively disable, enable and call an interrupt handler
13404262d71SSascha Wildner.Fa func
13504262d71SSascha Wildnerfor the serializer
13604262d71SSascha Wildner.Fa s .
13704262d71SSascha WildnerThe arguments
13804262d71SSascha Wildner.Fa arg
13904262d71SSascha Wildnerand
14004262d71SSascha Wildner.Fa frame
14104262d71SSascha Wildnerwill be passed to the handler.
14204262d71SSascha Wildner.Fn lwkt_serialize_handler_try
14304262d71SSascha Wildneris a non-blocking version of
14404262d71SSascha Wildner.Fn lwkt_serialize_handler_call .
14504262d71SSascha Wildner.Pp
146cb5caf9aSSepherosa ZiehauThe macro
147cb5caf9aSSepherosa Ziehau.Nm LWKT_SERIALIZE_INITIALIZER
148cb5caf9aSSepherosa Ziehauevaluates to an initializer for the serializer.
149cb5caf9aSSepherosa Ziehau.Pp
15004262d71SSascha WildnerThe
151872e08f8SSascha Wildner.Fn ASSERT_SERIALIZED
152872e08f8SSascha Wildnerand
153872e08f8SSascha Wildner.Fn ASSERT_NOT_SERIALIZED
154872e08f8SSascha Wildnermacros assert that the serializer
155872e08f8SSascha Wildner.Fa s
156872e08f8SSascha Wildneris being held/not held.
15704262d71SSascha Wildner.Sh RETURN VALUES
15804262d71SSascha WildnerThe
15904262d71SSascha Wildner.Fn lwkt_serialize_handler_try
1608351abadSSepherosa Ziehaufunction return 0 on success and 1 on failure.
1618351abadSSepherosa ZiehauThe
1628351abadSSepherosa Ziehau.Fn lwkt_serialize_try
1638351abadSSepherosa Ziehaufunction return 1 on success and 0 on failure.
16404262d71SSascha Wildner.Sh FILES
165deff95cbSSascha WildnerThe serializer itself is implemented in
166deff95cbSSascha Wildner.Pa /sys/kern/lwkt_serialize.c .
167deff95cbSSascha WildnerThe header file
168deff95cbSSascha Wildner.Pa /sys/sys/serialize.h
169deff95cbSSascha Wildnerdescribes the public interface and the structure of a serializer.
17004262d71SSascha Wildner.Sh SEE ALSO
17104262d71SSascha Wildner.Xr crit_enter 9 ,
172*c04308e8SMarkus Pfeiffer.Xr locking 9 ,
173146c9aa0SSascha Wildner.Xr spinlock 9 ,
174146c9aa0SSascha Wildner.Xr zsleep 9
17504262d71SSascha Wildner.Sh HISTORY
17604262d71SSascha WildnerThe
17704262d71SSascha Wildner.Nm serializer
17804262d71SSascha WildnerAPI first appeared in
17904262d71SSascha Wildner.Dx 1.3 .
18004262d71SSascha Wildner.Sh AUTHORS
18104262d71SSascha Wildner.An -nosplit
18204262d71SSascha WildnerThe
18304262d71SSascha Wildner.Nm serializer
18404262d71SSascha WildnerAPI was written by
18504262d71SSascha Wildner.An Matt Dillon .
18604262d71SSascha WildnerThis manual page was written by
18704262d71SSascha Wildner.An Hasso Tepper .
188