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.\" 32*872e08f8SSascha Wildner.\" $DragonFly: src/share/man/man9/serializer.9,v 1.5 2008/05/15 09:21:40 swildner Exp $ 3304262d71SSascha Wildner.\" 34*872e08f8SSascha Wildner.Dd May 15, 2008 3504262d71SSascha Wildner.Os 3604262d71SSascha Wildner.Dt SERIALIZER 9 3704262d71SSascha Wildner.Sh NAME 3804262d71SSascha Wildner.Nm lwkt_serialize_init , 3904262d71SSascha Wildner.Nm lwkt_serialize_enter , 40a3df9cc3SSascha Wildner.Nm lwkt_serialize_adaptive_enter , 4104262d71SSascha Wildner.Nm lwkt_serialize_try , 4204262d71SSascha Wildner.Nm lwkt_serialize_exit , 4304262d71SSascha Wildner.Nm lwkt_serialize_handler_enable , 4404262d71SSascha Wildner.Nm lwkt_serialize_handler_disable , 4504262d71SSascha Wildner.Nm lwkt_serialize_handler_call , 4604262d71SSascha Wildner.Nm lwkt_serialize_handler_try , 47*872e08f8SSascha Wildner.Nm IS_SERIALIZED 4804262d71SSascha Wildner.Nm ASSERT_SERIALIZED 49*872e08f8SSascha Wildner.Nm ASSERT_NOT_SERIALIZED 5004262d71SSascha Wildner.Nd generic low level serializer 5104262d71SSascha Wildner.Sh SYNOPSIS 5204262d71SSascha Wildner.In sys/serialize.h 5304262d71SSascha Wildner.Ft void 5404262d71SSascha Wildner.Fn lwkt_serialize_init "lwkt_serialize_t s" 5504262d71SSascha Wildner.Ft void 5604262d71SSascha Wildner.Fn lwkt_serialize_enter "lwkt_serialize_t s" 57a3df9cc3SSascha Wildner.Ft void 58a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter "lwkt_serialize_t s" 5904262d71SSascha Wildner.Ft int 6004262d71SSascha Wildner.Fn lwkt_serialize_try "lwkt_serialize_t s" 6104262d71SSascha Wildner.Ft void 6204262d71SSascha Wildner.Fn lwkt_serialize_exit "lwkt_serialize_t s" 6304262d71SSascha Wildner.Ft void 6404262d71SSascha Wildner.Fn lwkt_serialize_handler_enable "lwkt_serialize_t s" 6504262d71SSascha Wildner.Ft void 6604262d71SSascha Wildner.Fn lwkt_serialize_handler_disable "lwkt_serialize_t s" 6704262d71SSascha Wildner.Ft void 6804262d71SSascha Wildner.Fo lwkt_serialize_handler_call 6904262d71SSascha Wildner.Fa "lwkt_serialize_t s" 7004262d71SSascha Wildner.Fa "void (*func)(void *, void *)" 7104262d71SSascha Wildner.Fa "void *arg" 7204262d71SSascha Wildner.Fa "void *frame" 7304262d71SSascha Wildner.Fc 7404262d71SSascha Wildner.Ft int 7504262d71SSascha Wildner.Fo lwkt_serialize_handler_try 7604262d71SSascha Wildner.Fa "lwkt_serialize_t s" 7704262d71SSascha Wildner.Fa "void (*func)(void *, void *)" 7804262d71SSascha Wildner.Fa "void *arg" 7904262d71SSascha Wildner.Fa "void *frame" 8004262d71SSascha Wildner.Fc 81*872e08f8SSascha Wildner.Fn IS_SERIALIZED "s" 8204262d71SSascha Wildner.Fn ASSERT_SERIALIZED "s" 83*872e08f8SSascha Wildner.Fn ASSERT_NOT_SERIALIZED "s" 8404262d71SSascha Wildner.Sh DESCRIPTION 8504262d71SSascha WildnerThe 8604262d71SSascha Wildner.Nm serializer 8704262d71SSascha WildnerAPI provides a fast locked-bus-cycle-based serialization facility 8804262d71SSascha Wildnerthat will serialize across blocking conditions. 8904262d71SSascha WildnerIt is very similar to a lock but much faster for the common case. 9004262d71SSascha Wildner.Pp 9104262d71SSascha WildnerThis API was initially designed to be a replacement for SPL calls, but 9204262d71SSascha Wildnermay be used whenever a low level exclusive lock (serialization) and/or 9304262d71SSascha Wildnerinterrupt/device interaction is required. 9404262d71SSascha WildnerUnlike tokens this serialization is not safe from deadlocks nor is it 9504262d71SSascha Wildnerrecursive, and care must be taken when using it. 9604262d71SSascha WildnerNote that 9704262d71SSascha Wildner.Xr tsleep 9 9804262d71SSascha Wildnerwill not release a serializer that is being held. 9904262d71SSascha Wildner.Pp 10004262d71SSascha WildnerThere are two primary facilities \(em the serializer facility itself and 10104262d71SSascha Wildneran integrated non-stackable interrupt handler disablement facility 10204262d71SSascha Wildnerused by drivers. 10304262d71SSascha Wildner.Pp 10404262d71SSascha Wildner.Fn lwkt_serialize_init , 10504262d71SSascha Wildner.Fn lwkt_serialize_enter 10604262d71SSascha Wildnerand 10704262d71SSascha Wildner.Fn lwkt_serialize_exit 10804262d71SSascha Wildnerrespectively initialize, hold and release the serializer 10904262d71SSascha Wildner.Fa s . 11004262d71SSascha Wildner.Fn lwkt_serialize_try 11104262d71SSascha Wildneris a non-blocking version of 11204262d71SSascha Wildner.Fn lwkt_serialize_enter . 11304262d71SSascha Wildner.Pp 114a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter 115a3df9cc3SSascha Wildneris a special version of 116a3df9cc3SSascha Wildner.Fn lwkt_serialize_enter 117a3df9cc3SSascha Wildnerwhich will try to spin a bit before the current thread is put to sleep 118a3df9cc3SSascha Wildnerif the serializer 119a3df9cc3SSascha Wildner.Fa s 120a3df9cc3SSascha Wildneris contended. 121a3df9cc3SSascha WildnerBy default, 122a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter 123a3df9cc3SSascha Wildnerfavors spinning over sleeping. 124a3df9cc3SSascha WildnerThis behavior can be changed by tuning the 125a3df9cc3SSascha Wildner.Va debug.serialize_bolimit 126a3df9cc3SSascha Wildnerand 127a3df9cc3SSascha Wildner.Va debug.serialize_boround 128a3df9cc3SSascha Wildner.Xr sysctl 8 129a3df9cc3SSascha Wildnervariables. 130a3df9cc3SSascha WildnerNote that 131a3df9cc3SSascha Wildner.Fn lwkt_serialize_adaptive_enter 132a3df9cc3SSascha Wildneris only available in SMP kernels. 133a3df9cc3SSascha Wildner.Pp 13404262d71SSascha Wildner.Fn lwkt_serialize_handler_disable , 13504262d71SSascha Wildner.Fn lwkt_serialize_handler_enable 13604262d71SSascha Wildnerand 13704262d71SSascha Wildner.Fn lwkt_serialize_handler_call 13804262d71SSascha Wildnerrespectively disable, enable and call an interrupt handler 13904262d71SSascha Wildner.Fa func 14004262d71SSascha Wildnerfor the serializer 14104262d71SSascha Wildner.Fa s . 14204262d71SSascha WildnerThe arguments 14304262d71SSascha Wildner.Fa arg 14404262d71SSascha Wildnerand 14504262d71SSascha Wildner.Fa frame 14604262d71SSascha Wildnerwill be passed to the handler. 14704262d71SSascha Wildner.Fn lwkt_serialize_handler_try 14804262d71SSascha Wildneris a non-blocking version of 14904262d71SSascha Wildner.Fn lwkt_serialize_handler_call . 15004262d71SSascha Wildner.Pp 15104262d71SSascha WildnerThe 152*872e08f8SSascha Wildner.Fn IS_SERIALIZED 153*872e08f8SSascha Wildnermacro tests if the serializer 15404262d71SSascha Wildner.Fa s 15504262d71SSascha Wildneris being held. 156*872e08f8SSascha WildnerSimilarly, the 157*872e08f8SSascha Wildner.Fn ASSERT_SERIALIZED 158*872e08f8SSascha Wildnerand 159*872e08f8SSascha Wildner.Fn ASSERT_NOT_SERIALIZED 160*872e08f8SSascha Wildnermacros assert that the serializer 161*872e08f8SSascha Wildner.Fa s 162*872e08f8SSascha Wildneris being held/not held. 16304262d71SSascha Wildner.Sh RETURN VALUES 16404262d71SSascha WildnerThe 16504262d71SSascha Wildner.Fn lwkt_serialize_try 16604262d71SSascha Wildnerand 16704262d71SSascha Wildner.Fn lwkt_serialize_handler_try 16804262d71SSascha Wildnerfunctions return 0 on success and 1 on failure. 16904262d71SSascha Wildner.Sh FILES 17004262d71SSascha Wildner.Pa sys/kern/lwkt_serialize.c 17104262d71SSascha Wildner.Sh SEE ALSO 17204262d71SSascha Wildner.Xr crit_enter 9 , 1737845a2b6SSascha Wildner.Xr serialize_sleep 9 , 17404262d71SSascha Wildner.Xr spinlock 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