]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - share/man/man9/spl.9
This commit was generated by cvs2svn to compensate for changes in r69830,
[FreeBSD/FreeBSD.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 .Fd #include <sys/types.h>
47 .Fd #include <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 .Sy This API is deprecated.
72 .Sy Use mutexes to protect data structures instead.
73 .Sy See
74 .Xr mutex 9
75 .Sy for more information.
76 .Pp
77 The
78 .Fn spl
79 function family sets the interrupt priority
80 .Dq level
81 of the CPU.
82 This prevents interrupt handlers of the blocked priority level from
83 being run.  This is used in the
84 .Dq synchronous
85 part of a driver (the part that runs on behalf of the user process) to
86 examine or modify data areas that might be examined or modified by
87 interrupt handlers.
88 .Pp
89 Each driver that uses interrupts is normally assigned to an interrupt
90 priority group by a keyword in its config line.
91 For example:
92 .Bd -literal -offset indent
93 device foo0 at isa? port 0x0815 irq 12 tty
94 .Ed
95 .Pp
96 assigns interrupt 12 to the
97 .Dq tty
98 priority group.  The system automatically arranges for interrupts in
99 the
100 .Em xxx
101 group to be called at a priority >=
102 .Ns spl Ns Em xxx
103 \&().
104 .Pp
105 The function
106 .Fn splx
107 sets the interrupt priority to an absolute value.  The intent is that
108 the value returned by the other functions should be saved in a local
109 variable, and later passed to
110 .Fn splx
111 in order to restore the previous priority.
112 .Pp
113 The function
114 .Fn spl0
115 lowers the priority to a value where all interrupt handlers are
116 unblocked, but ASTs (asynchronous system traps) remain blocked until
117 the system is about to return to user mode.
118 .Pp
119 The traditional assignment of the various device drivers to the
120 interrupt priority groups can be roughly classified as:
121 .Bl -tag -width Fn splnet
122 .It Fn splnet
123 All network interface drivers.
124 .It Fn splbio
125 All
126 .Em buffered IO
127 (i.e., disk and the like) drivers.
128 .It Fn spltty
129 Basically, all non-network communications devices, but effectively
130 used for all drivers that are neither network nor disks.
131 .El
132 .Sh RETURN VALUES
133 All functions except
134 .Fn splx
135 and
136 .Fn spl0
137 return the previous priority value.
138 .Sh EXAMPLES
139 This is a typical example demonstrating the usage:
140 .Bd -literal
141 struct foo_softc {
142         ...
143         int flags;
144 #define FOO_ASLEEP      1
145 #define FOO_READY       2
146
147 } foo_softc[NFOO];
148
149 int
150 foowrite(...)
151 {
152         struct foo_softc *sc;
153         int s, error;
154
155         ...
156         s = spltty();
157         if (!(sc->flags & FOO_READY)) {
158                 /* Not ready, must sleep on resource. */
159                 sc->flags |= FOO_ASLEEP;
160                 error = tsleep(sc, PZERO, "foordy", 0);
161                 sc->flags &= ~FOO_ASLEEP;
162         }
163         sc->flags &= ~FOO_READY;
164         splx(s);
165
166         ...
167 }
168
169 void
170 foointr(...)
171 {
172         struct foo_softc *sc;
173
174         ...
175         sc->flags |= FOO_READY;
176         if (sc->flags & FOO_ASLEEP)
177                 /* Somebody was waiting for us, awake him. */
178                 wakeup(sc);
179         ...
180 }
181
182 .Ed
183 Note that the interrupt handler should
184 .Em never
185 reduce the priority level.  It is automatically called as it had
186 raised the interrupt priority to its own level, i.e. further interrupts
187 of the same group are being blocked.
188 .Sh HISTORY
189 The interrupt priority levels appeared in a very early version of
190 Unix.  They have been traditionally known by number instead of by
191 names, and were inclusive up to higher priority levels (i.e., priority
192 5 has been blocking everything up to level 5).  This is no longer the
193 case in
194 .Fx .
195 The traditional name
196 .Ql level
197 for them is still reflected in the letter
198 .Ql l
199 of the respective functions and variables, although they are not
200 really levels anymore, but rather different (partially inclusive)
201 sets of functions to be blocked during some periods of the life of
202 the system.  The historical number scheme can be considered as a
203 simple linearly ordered set of interrupt priority groups.
204 .Sh AUTHORS
205 This man page was written by
206 .An J\(:org Wunsch .