]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - share/man/man9/spl.9
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / share / man / man9 / spl.9
1 .\"
2 .\" Copyright (c) 1996 Joerg Wunsch
3 .\"
4 .\" All rights reserved.
5 .\"
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\"    notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice, this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\"
15 .\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
16 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 .\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
19 .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 .\"
26 .\" $FreeBSD$
27 .\"
28 .Dd July 21, 1996
29 .Os
30 .Dt SPL 9
31 .Sh NAME
32 .Nm splbio ,
33 .Nm splclock ,
34 .Nm splhigh ,
35 .Nm splimp ,
36 .Nm splnet ,
37 .Nm splsoftclock ,
38 .Nm splsofttty ,
39 .Nm splstatclock ,
40 .Nm spltty ,
41 .Nm splvm ,
42 .Nm spl0 ,
43 .Nm splx
44 .Nd manipulate interrupt priorities
45 .Sh SYNOPSIS
46 .In sys/types.h
47 .In sys/systm.h
48 .Ft intrmask_t
49 .Fn splbio "void"
50 .Ft intrmask_t
51 .Fn splclock "void"
52 .Ft intrmask_t
53 .Fn splhigh "void"
54 .Ft intrmask_t
55 .Fn splimp "void"
56 .Ft intrmask_t
57 .Fn splnet "void"
58 .Ft intrmask_t
59 .Fn splsoftclock "void"
60 .Ft intrmask_t
61 .Fn splsofttty "void"
62 .Ft intrmask_t
63 .Fn splstatclock "void"
64 .Ft intrmask_t
65 .Fn spltty "void"
66 .Ft void
67 .Fn spl0 "void"
68 .Ft void
69 .Fn splx "intrmask_t ipl"
70 .Sh DESCRIPTION
71 .Bf -symbolic
72 This API is deprecated.
73 Use mutexes to protect data structures instead.
74 See
75 .Xr mutex 9
76 for more information.
77 The API is now a complete NOP.
78 This man page documents historical behavior so you can understand the
79 code locking that the spl did when converting code from versions of the
80 kernel prior to
81 .Fx 5.0 .
82 The examples in this man page are also obsolete and should not be viewed
83 as documenting 
84 .Fx 5.0 
85 and newer.
86 .Ef
87 .Pp
88 The
89 .Fn spl
90 function family sets the interrupt priority
91 .Dq level
92 of the CPU.
93 This prevents interrupt handlers of the blocked priority level from
94 being run.
95 This is used in the
96 .Dq synchronous
97 part of a driver (the part that runs on behalf of the user process) to
98 examine or modify data areas that might be examined or modified by
99 interrupt handlers.
100 .Pp
101 Each driver that uses interrupts is normally assigned to an interrupt
102 priority group by a keyword in its config line.
103 For example:
104 .Bd -literal -offset indent
105 device foo0 at isa? port 0x0815 irq 12 tty
106 .Ed
107 .Pp
108 assigns interrupt 12 to the
109 .Dq tty
110 priority group.
111 The system automatically arranges for interrupts in
112 the
113 .Em xxx
114 group to be called at a priority >=
115 .Ns spl Ns Em xxx
116 \&().
117 .Pp
118 The function
119 .Fn splx
120 sets the interrupt priority to an absolute value.
121 The intent is that
122 the value returned by the other functions should be saved in a local
123 variable, and later passed to
124 .Fn splx
125 in order to restore the previous priority.
126 .Pp
127 The function
128 .Fn spl0
129 lowers the priority to a value where all interrupt handlers are
130 unblocked, but ASTs (asynchronous system traps) remain blocked until
131 the system is about to return to user mode.
132 .Pp
133 The traditional assignment of the various device drivers to the
134 interrupt priority groups can be roughly classified as:
135 .Bl -tag -width Fn
136 .It Fn splnet
137 Software part of the network interface drivers.
138 .It Fn splimp
139 All network interface drivers.
140 .It Fn splbio
141 All
142 .Em buffered IO
143 (i.e., disk and the like) drivers.
144 .It Fn spltty
145 Basically, all non-network communications devices, but effectively
146 used for all drivers that are neither network nor disks.
147 .El
148 .Sh RETURN VALUES
149 All functions except
150 .Fn splx
151 and
152 .Fn spl0
153 return the previous priority value.
154 .Sh EXAMPLES
155 This is a typical example demonstrating the usage:
156 .Bd -literal
157 struct foo_softc {
158         ...
159         int flags;
160 #define FOO_ASLEEP      1
161 #define FOO_READY       2
162
163 } foo_softc[NFOO];
164
165 int
166 foowrite(...)
167 {
168         struct foo_softc *sc;
169         int s, error;
170
171         ...
172         s = spltty();
173         if (!(sc->flags & FOO_READY)) {
174                 /* Not ready, must sleep on resource. */
175                 sc->flags |= FOO_ASLEEP;
176                 error = tsleep(sc, PZERO, "foordy", 0);
177                 sc->flags &= ~FOO_ASLEEP;
178         }
179         sc->flags &= ~FOO_READY;
180         splx(s);
181
182         ...
183 }
184
185 void
186 foointr(...)
187 {
188         struct foo_softc *sc;
189
190         ...
191         sc->flags |= FOO_READY;
192         if (sc->flags & FOO_ASLEEP)
193                 /* Somebody was waiting for us, awake him. */
194                 wakeup(sc);
195         ...
196 }
197
198 .Ed
199 Note that the interrupt handler should
200 .Em never
201 reduce the priority level.
202 It is automatically called as it had
203 raised the interrupt priority to its own level, i.e., further interrupts
204 of the same group are being blocked.
205 .Sh HISTORY
206 The interrupt priority levels appeared in a very early version of
207 .Ux .
208 They have been traditionally known by number instead of by
209 names, and were inclusive up to higher priority levels (i.e., priority
210 5 has been blocking everything up to level 5).
211 This is no longer the case in
212 .Fx .
213 The traditional name
214 .Ql level
215 for them is still reflected in the letter
216 .Ql l
217 of the respective functions and variables, although they are not
218 really levels anymore, but rather different (partially inclusive)
219 sets of functions to be blocked during some periods of the life of
220 the system.
221 The historical number scheme can be considered as a
222 simple linearly ordered set of interrupt priority groups.
223 .Pp
224 .Fx 5.0 eliminated spl entirely in favor of locking primitives which scale
225 to more than one processor.
226 .Sh AUTHORS
227 This manual page was written by
228 .An J\(:org Wunsch .