No empty .Rs/.Re
[netbsd-mini2440.git] / share / man / man9 / kmem.9
blob2d74fe5183553a939552262d8ac2d2659f082e23
1 .\"     $NetBSD: kmem.9,v 1.2 2009/08/03 20:10:16 rmind Exp $
2 .\"
3 .\" Copyright (c)2006 YAMAMOTO Takashi,
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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 .\" SUCH DAMAGE.
26 .\"
27 .\" ------------------------------------------------------------
28 .Dd August 3, 2009
29 .Dt KMEM 9
30 .Os
31 .\" ------------------------------------------------------------
32 .Sh NAME
33 .Nm kmem
34 .Nd kernel wired memory allocator
35 .\" ------------------------------------------------------------
36 .Sh SYNOPSIS
37 .In sys/kmem.h
38 .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
39 .Ft void *
40 .Fn kmem_alloc \
41 "size_t size" "km_flag_t kmflags"
42 .Ft void *
43 .Fn kmem_zalloc \
44 "size_t size" "km_flag_t kmflags"
45 .Ft void
46 .Fn kmem_free \
47 "void *p" "size_t size"
48 .\" ------------------------------------------------------------
49 .Pp
50 .Cd "options DEBUG"
51 .Sh DESCRIPTION
52 .Fn kmem_alloc
53 allocates kernel wired memory.
54 It takes the following arguments.
55 .Bl -tag -width kmflags
56 .It Fa size
57 Specify the size of allocation in bytes.
58 .It Fa kmflags
59 Either of the following:
60 .Bl -tag -width KM_NOSLEEP
61 .It KM_SLEEP
62 If the allocation cannot be satisfied immediately, sleep until enough
63 memory is available.
64 .It KM_NOSLEEP
65 Don't sleep.
66 Immediately return
67 .Dv NULL
68 if there is not enough memory available.
69 It should only be used when failure to allocate will not have harmful,
70 user-visible effects.
71 .Pp
72 .Bf -symbolic
73 Use of
74 .Dv KM_NOSLEEP
75 is strongly discouraged as it can create transient, hard to debug failures
76 that occur when the system is under memory pressure.
77 .Ef
78 .Pp
79 In situations where it is not possible to sleep, for example because locks
80 are held by the caller, the code path should be restructured to allow the
81 allocation to be made in another place.
82 .El
83 .El
84 .Pp
85 The contents of allocated memory are uninitialized.
86 .Pp
87 Unlike Solaris, kmem_alloc(0, flags) is illegal.
88 .Pp
89 .\" ------------------------------------------------------------
90 .Fn kmem_zalloc
91 is the equivalent of
92 .Fn kmem_alloc ,
93 except that it initializes the memory to zero.
94 .Pp
95 .\" ------------------------------------------------------------
96 .Fn kmem_free
97 frees kernel wired memory allocated by
98 .Fn kmem_alloc
100 .Fn kmem_zalloc
101 so that it can be used for other purposes.
102 It takes the following arguments.
103 .Bl -tag -width kmflags
104 .It Fa p
105 The pointer to the memory being freed.
106 It must be the one returned by
107 .Fn kmem_alloc
109 .Fn kmem_zalloc .
110 .It Fa size
111 The size of the memory being freed, in bytes.
112 It must be the same as the
113 .Fa size
114 argument used for
115 .Fn kmem_alloc
117 .Fn kmem_zalloc
118 when the memory was allocated.
121 Freeing
122 .Dv NULL
123 is illegal.
124 .\" ------------------------------------------------------------
125 .Sh NOTES
126 Making
127 .Dv KM_SLEEP
128 allocations while holding mutexes or reader/writer locks is discouraged, as the
129 caller can sleep for an unbounded amount of time in order to satisfy the
130 allocation.
131 This can in turn block other threads that wish to acquire locks held by the
132 caller.
134 For some locks this is permissible or even unavoidable.
135 For others, particularly locks that may be taken from soft interrupt context,
136 it is a serious problem.
137 As a general rule it is better not to allow this type of situation to develop.
138 One way to circumvent the problem is to make allocations speculative and part
139 of a retryable sequence.
140 For example:
141 .Bd -literal
142   retry:
143         /* speculative unlocked check */
144         if (need to allocate) {
145                 new_item = kmem_alloc(sizeof(*new_item), KM_SLEEP);
146         } else {
147                 new_item = NULL;
148         }
149         mutex_enter(lock);
150         /* check while holding lock for true status */
151         if (need to allocate) {
152                 if (new_item == NULL) {
153                         mutex_exit(lock);
154                         goto retry;
155                 }
156                 consume(new_item);
157                 new_item = NULL;
158         }
159         mutex_exit(lock);
160         if (new_item != NULL) {
161                 /* did not use it after all */
162                 kmem_free(new_item, sizeof(*new_item));
163         }
165 .\" ------------------------------------------------------------
166 .Sh OPTIONS
167 Kernels compiled with the
168 .Dv DEBUG
169 option perform CPU intensive sanity checks on kmem operations,
170 and include the
171 .Dv kmguard
172 facility which can be enabled at runtime.
174 .Dv kmguard
175 adds additional, very high overhead runtime verification to kmem operations.
176 To enable it, boot the system with the
177 .Fl d
178 option, which causes the debugger to be entered early during the kernel
179 boot process.
180 Issue commands such as the following:
181 .Bd -literal
182 db\*[Gt] w kmem_guard_depth 0t30000
183 db\*[Gt] c
186 This instructs
187 .Dv kmguard
188 to queue up to 60000 (30000*2) pages of unmapped KVA to catch
189 use-after-free type errors.
190 When
191 .Fn kmem_free
192 is called, memory backing a freed item is unmapped and the kernel VA
193 space pushed onto a FIFO.
194 The VA space will not be reused until another 30k items have been freed.
195 Until reused the kernel will catch invalid accesses and panic with a page fault.
196 Limitations:
197 .Bl -bullet
199 It has a severe impact on performance.
201 It is best used on a 64-bit machine with lots of RAM.
203 Allocations larger than PAGE_SIZE bypass the
204 .Dv kmguard
205 facility.
208 kmguard tries to catch the following types of bugs:
209 .Bl -bullet
211 Overflow at time of occurrence, by means of a guard page.
213 Underflow at
214 .Fn kmem_free ,
215 by using a canary value.
217 Invalid pointer or size passed, at
218 .Fn kmem_free .
220 .Sh RETURN VALUES
221 On success,
222 .Fn kmem_alloc
224 .Fn kmem_zalloc
225 return a pointer to allocated memory.
226 Otherwise,
227 .Dv NULL
228 is returned.
229 .\" ------------------------------------------------------------
230 .Sh CODE REFERENCES
231 This section describes places within the
233 source tree where actual code implementing the
235 subsystem
236 can be found.
237 All pathnames are relative to
238 .Pa /usr/src .
242 subsystem is implemented within the file
243 .Pa sys/kern/subr_kmem.c .
244 .\" ------------------------------------------------------------
245 .Sh SEE ALSO
246 .Xr intro 9 ,
247 .Xr memoryallocators 9 ,
248 .Xr pool_cache 9
249 .\" ------------------------------------------------------------
250 .Sh CAVEATS
251 .Fn kmem_alloc
252 cannot be used from interrupt context, from a soft interrupt, or from
253 a callout.
255 .Xr pool_cache 9
256 in these situations.
257 .\" ------------------------------------------------------------
258 .Sh SECURITY CONSIDERATION
259 As the memory allocated by
260 .Fn kmem_alloc
261 is uninitialized, it can contain security-sensitive data left by its
262 previous user.
263 It is the caller's responsibility not to expose it to the world.