1/*- 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * The Mach Operating System project at Carnegie-Mellon University. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 4. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * from: @(#)vm_kern.c 8.3 (Berkeley) 1/12/94 33 * 34 * 35 * Copyright (c) 1987, 1990 Carnegie-Mellon University. 36 * All rights reserved. 37 * 38 * Authors: Avadis Tevanian, Jr., Michael Wayne Young 39 * 40 * Permission to use, copy, modify and distribute this software and 41 * its documentation is hereby granted, provided that both the copyright 42 * notice and this permission notice appear in all copies of the 43 * software, derivative works or modified versions, and any portions 44 * thereof, and that both notices appear in supporting documentation. 45 * 46 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 47 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 48 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 49 * 50 * Carnegie Mellon requests users of this software to return to 51 * 52 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 53 * School of Computer Science 54 * Carnegie Mellon University 55 * Pittsburgh PA 15213-3890 56 * 57 * any improvements or extensions that they make and grant Carnegie the 58 * rights to redistribute these changes. 59 */ 60 61/* 62 * Kernel memory management. 63 */ 64 65#include <sys/cdefs.h>
| 1/*- 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * The Mach Operating System project at Carnegie-Mellon University. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 4. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * from: @(#)vm_kern.c 8.3 (Berkeley) 1/12/94 33 * 34 * 35 * Copyright (c) 1987, 1990 Carnegie-Mellon University. 36 * All rights reserved. 37 * 38 * Authors: Avadis Tevanian, Jr., Michael Wayne Young 39 * 40 * Permission to use, copy, modify and distribute this software and 41 * its documentation is hereby granted, provided that both the copyright 42 * notice and this permission notice appear in all copies of the 43 * software, derivative works or modified versions, and any portions 44 * thereof, and that both notices appear in supporting documentation. 45 * 46 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 47 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 48 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 49 * 50 * Carnegie Mellon requests users of this software to return to 51 * 52 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 53 * School of Computer Science 54 * Carnegie Mellon University 55 * Pittsburgh PA 15213-3890 56 * 57 * any improvements or extensions that they make and grant Carnegie the 58 * rights to redistribute these changes. 59 */ 60 61/* 62 * Kernel memory management. 63 */ 64 65#include <sys/cdefs.h>
|
66__FBSDID("$FreeBSD: head/sys/vm/vm_kern.c 226843 2011-10-27 16:39:17Z alc $");
| 66__FBSDID("$FreeBSD: head/sys/vm/vm_kern.c 230623 2012-01-27 20:18:31Z kmacy $");
|
67 68#include <sys/param.h> 69#include <sys/systm.h> 70#include <sys/kernel.h> /* for ticks and hz */ 71#include <sys/eventhandler.h> 72#include <sys/lock.h> 73#include <sys/mutex.h> 74#include <sys/proc.h> 75#include <sys/malloc.h> 76#include <sys/sysctl.h> 77 78#include <vm/vm.h> 79#include <vm/vm_param.h> 80#include <vm/pmap.h> 81#include <vm/vm_map.h> 82#include <vm/vm_object.h> 83#include <vm/vm_page.h> 84#include <vm/vm_pageout.h> 85#include <vm/vm_extern.h> 86#include <vm/uma.h> 87 88vm_map_t kernel_map=0; 89vm_map_t kmem_map=0; 90vm_map_t exec_map=0; 91vm_map_t pipe_map; 92vm_map_t buffer_map=0; 93 94const void *zero_region; 95CTASSERT((ZERO_REGION_SIZE & PAGE_MASK) == 0); 96 97/* 98 * kmem_alloc_nofault: 99 * 100 * Allocate a virtual address range with no underlying object and 101 * no initial mapping to physical memory. Any mapping from this 102 * range to physical memory must be explicitly created prior to 103 * its use, typically with pmap_qenter(). Any attempt to create 104 * a mapping on demand through vm_fault() will result in a panic. 105 */ 106vm_offset_t 107kmem_alloc_nofault(map, size) 108 vm_map_t map; 109 vm_size_t size; 110{ 111 vm_offset_t addr; 112 int result; 113 114 size = round_page(size); 115 addr = vm_map_min(map); 116 result = vm_map_find(map, NULL, 0, &addr, size, VMFS_ANY_SPACE, 117 VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); 118 if (result != KERN_SUCCESS) { 119 return (0); 120 } 121 return (addr); 122} 123 124/* 125 * kmem_alloc_nofault_space: 126 * 127 * Allocate a virtual address range with no underlying object and 128 * no initial mapping to physical memory within the specified 129 * address space. Any mapping from this range to physical memory 130 * must be explicitly created prior to its use, typically with 131 * pmap_qenter(). Any attempt to create a mapping on demand 132 * through vm_fault() will result in a panic. 133 */ 134vm_offset_t 135kmem_alloc_nofault_space(map, size, find_space) 136 vm_map_t map; 137 vm_size_t size; 138 int find_space; 139{ 140 vm_offset_t addr; 141 int result; 142 143 size = round_page(size); 144 addr = vm_map_min(map); 145 result = vm_map_find(map, NULL, 0, &addr, size, find_space, 146 VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); 147 if (result != KERN_SUCCESS) { 148 return (0); 149 } 150 return (addr); 151} 152 153/* 154 * Allocate wired-down memory in the kernel's address map 155 * or a submap. 156 */ 157vm_offset_t 158kmem_alloc(map, size) 159 vm_map_t map; 160 vm_size_t size; 161{ 162 vm_offset_t addr; 163 vm_offset_t offset; 164 vm_offset_t i; 165 166 size = round_page(size); 167 168 /* 169 * Use the kernel object for wired-down kernel pages. Assume that no 170 * region of the kernel object is referenced more than once. 171 */ 172 173 /* 174 * Locate sufficient space in the map. This will give us the final 175 * virtual address for the new memory, and thus will tell us the 176 * offset within the kernel map. 177 */ 178 vm_map_lock(map); 179 if (vm_map_findspace(map, vm_map_min(map), size, &addr)) { 180 vm_map_unlock(map); 181 return (0); 182 } 183 offset = addr - VM_MIN_KERNEL_ADDRESS; 184 vm_object_reference(kernel_object); 185 vm_map_insert(map, kernel_object, offset, addr, addr + size, 186 VM_PROT_ALL, VM_PROT_ALL, 0); 187 vm_map_unlock(map); 188 189 /* 190 * Guarantee that there are pages already in this object before 191 * calling vm_map_wire. This is to prevent the following 192 * scenario: 193 * 194 * 1) Threads have swapped out, so that there is a pager for the 195 * kernel_object. 2) The kmsg zone is empty, and so we are 196 * kmem_allocing a new page for it. 3) vm_map_wire calls vm_fault; 197 * there is no page, but there is a pager, so we call 198 * pager_data_request. But the kmsg zone is empty, so we must 199 * kmem_alloc. 4) goto 1 5) Even if the kmsg zone is not empty: when 200 * we get the data back from the pager, it will be (very stale) 201 * non-zero data. kmem_alloc is defined to return zero-filled memory. 202 * 203 * We're intentionally not activating the pages we allocate to prevent a 204 * race with page-out. vm_map_wire will wire the pages. 205 */ 206 VM_OBJECT_LOCK(kernel_object); 207 for (i = 0; i < size; i += PAGE_SIZE) { 208 vm_page_t mem; 209 210 mem = vm_page_grab(kernel_object, OFF_TO_IDX(offset + i), 211 VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_RETRY); 212 mem->valid = VM_PAGE_BITS_ALL; 213 KASSERT((mem->oflags & VPO_UNMANAGED) != 0, 214 ("kmem_alloc: page %p is managed", mem)); 215 } 216 VM_OBJECT_UNLOCK(kernel_object); 217 218 /* 219 * And finally, mark the data as non-pageable. 220 */ 221 (void) vm_map_wire(map, addr, addr + size, 222 VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES); 223 224 return (addr); 225} 226 227/* 228 * kmem_free: 229 * 230 * Release a region of kernel virtual memory allocated 231 * with kmem_alloc, and return the physical pages 232 * associated with that region. 233 * 234 * This routine may not block on kernel maps. 235 */ 236void 237kmem_free(map, addr, size) 238 vm_map_t map; 239 vm_offset_t addr; 240 vm_size_t size; 241{ 242 243 (void) vm_map_remove(map, trunc_page(addr), round_page(addr + size)); 244} 245 246/* 247 * kmem_suballoc: 248 * 249 * Allocates a map to manage a subrange 250 * of the kernel virtual address space. 251 * 252 * Arguments are as follows: 253 * 254 * parent Map to take range from 255 * min, max Returned endpoints of map 256 * size Size of range to find 257 * superpage_align Request that min is superpage aligned 258 */ 259vm_map_t 260kmem_suballoc(vm_map_t parent, vm_offset_t *min, vm_offset_t *max, 261 vm_size_t size, boolean_t superpage_align) 262{ 263 int ret; 264 vm_map_t result; 265 266 size = round_page(size); 267 268 *min = vm_map_min(parent); 269 ret = vm_map_find(parent, NULL, 0, min, size, superpage_align ? 270 VMFS_ALIGNED_SPACE : VMFS_ANY_SPACE, VM_PROT_ALL, VM_PROT_ALL, 271 MAP_ACC_NO_CHARGE); 272 if (ret != KERN_SUCCESS) 273 panic("kmem_suballoc: bad status return of %d", ret); 274 *max = *min + size; 275 result = vm_map_create(vm_map_pmap(parent), *min, *max); 276 if (result == NULL) 277 panic("kmem_suballoc: cannot create submap"); 278 if (vm_map_submap(parent, *min, *max, result) != KERN_SUCCESS) 279 panic("kmem_suballoc: unable to change range to submap"); 280 return (result); 281} 282 283/* 284 * kmem_malloc: 285 * 286 * Allocate wired-down memory in the kernel's address map for the higher 287 * level kernel memory allocator (kern/kern_malloc.c). We cannot use 288 * kmem_alloc() because we may need to allocate memory at interrupt 289 * level where we cannot block (canwait == FALSE). 290 * 291 * This routine has its own private kernel submap (kmem_map) and object 292 * (kmem_object). This, combined with the fact that only malloc uses 293 * this routine, ensures that we will never block in map or object waits. 294 * 295 * We don't worry about expanding the map (adding entries) since entries 296 * for wired maps are statically allocated. 297 * 298 * `map' is ONLY allowed to be kmem_map or one of the mbuf submaps to 299 * which we never free. 300 */ 301vm_offset_t 302kmem_malloc(map, size, flags) 303 vm_map_t map; 304 vm_size_t size; 305 int flags; 306{ 307 vm_offset_t addr; 308 int i, rv; 309 310 size = round_page(size); 311 addr = vm_map_min(map); 312 313 /* 314 * Locate sufficient space in the map. This will give us the final 315 * virtual address for the new memory, and thus will tell us the 316 * offset within the kernel map. 317 */ 318 vm_map_lock(map); 319 if (vm_map_findspace(map, vm_map_min(map), size, &addr)) { 320 vm_map_unlock(map); 321 if ((flags & M_NOWAIT) == 0) { 322 for (i = 0; i < 8; i++) { 323 EVENTHANDLER_INVOKE(vm_lowmem, 0); 324 uma_reclaim(); 325 vm_map_lock(map); 326 if (vm_map_findspace(map, vm_map_min(map), 327 size, &addr) == 0) { 328 break; 329 } 330 vm_map_unlock(map); 331 tsleep(&i, 0, "nokva", (hz / 4) * (i + 1)); 332 } 333 if (i == 8) { 334 panic("kmem_malloc(%ld): kmem_map too small: %ld total allocated", 335 (long)size, (long)map->size); 336 } 337 } else { 338 return (0); 339 } 340 } 341 342 rv = kmem_back(map, addr, size, flags); 343 vm_map_unlock(map); 344 return (rv == KERN_SUCCESS ? addr : 0); 345} 346 347/* 348 * kmem_back: 349 * 350 * Allocate physical pages for the specified virtual address range. 351 */ 352int 353kmem_back(vm_map_t map, vm_offset_t addr, vm_size_t size, int flags) 354{ 355 vm_offset_t offset, i; 356 vm_map_entry_t entry; 357 vm_page_t m; 358 int pflags; 359 boolean_t found; 360 361 KASSERT(vm_map_locked(map), ("kmem_back: map %p is not locked", map)); 362 offset = addr - VM_MIN_KERNEL_ADDRESS; 363 vm_object_reference(kmem_object); 364 vm_map_insert(map, kmem_object, offset, addr, addr + size, 365 VM_PROT_ALL, VM_PROT_ALL, 0); 366 367 /* 368 * Assert: vm_map_insert() will never be able to extend the 369 * previous entry so vm_map_lookup_entry() will find a new 370 * entry exactly corresponding to this address range and it 371 * will have wired_count == 0. 372 */ 373 found = vm_map_lookup_entry(map, addr, &entry); 374 KASSERT(found && entry->start == addr && entry->end == addr + size && 375 entry->wired_count == 0 && (entry->eflags & MAP_ENTRY_IN_TRANSITION) 376 == 0, ("kmem_back: entry not found or misaligned")); 377 378 if ((flags & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT) 379 pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; 380 else 381 pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; 382 383 if (flags & M_ZERO) 384 pflags |= VM_ALLOC_ZERO;
| 67 68#include <sys/param.h> 69#include <sys/systm.h> 70#include <sys/kernel.h> /* for ticks and hz */ 71#include <sys/eventhandler.h> 72#include <sys/lock.h> 73#include <sys/mutex.h> 74#include <sys/proc.h> 75#include <sys/malloc.h> 76#include <sys/sysctl.h> 77 78#include <vm/vm.h> 79#include <vm/vm_param.h> 80#include <vm/pmap.h> 81#include <vm/vm_map.h> 82#include <vm/vm_object.h> 83#include <vm/vm_page.h> 84#include <vm/vm_pageout.h> 85#include <vm/vm_extern.h> 86#include <vm/uma.h> 87 88vm_map_t kernel_map=0; 89vm_map_t kmem_map=0; 90vm_map_t exec_map=0; 91vm_map_t pipe_map; 92vm_map_t buffer_map=0; 93 94const void *zero_region; 95CTASSERT((ZERO_REGION_SIZE & PAGE_MASK) == 0); 96 97/* 98 * kmem_alloc_nofault: 99 * 100 * Allocate a virtual address range with no underlying object and 101 * no initial mapping to physical memory. Any mapping from this 102 * range to physical memory must be explicitly created prior to 103 * its use, typically with pmap_qenter(). Any attempt to create 104 * a mapping on demand through vm_fault() will result in a panic. 105 */ 106vm_offset_t 107kmem_alloc_nofault(map, size) 108 vm_map_t map; 109 vm_size_t size; 110{ 111 vm_offset_t addr; 112 int result; 113 114 size = round_page(size); 115 addr = vm_map_min(map); 116 result = vm_map_find(map, NULL, 0, &addr, size, VMFS_ANY_SPACE, 117 VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); 118 if (result != KERN_SUCCESS) { 119 return (0); 120 } 121 return (addr); 122} 123 124/* 125 * kmem_alloc_nofault_space: 126 * 127 * Allocate a virtual address range with no underlying object and 128 * no initial mapping to physical memory within the specified 129 * address space. Any mapping from this range to physical memory 130 * must be explicitly created prior to its use, typically with 131 * pmap_qenter(). Any attempt to create a mapping on demand 132 * through vm_fault() will result in a panic. 133 */ 134vm_offset_t 135kmem_alloc_nofault_space(map, size, find_space) 136 vm_map_t map; 137 vm_size_t size; 138 int find_space; 139{ 140 vm_offset_t addr; 141 int result; 142 143 size = round_page(size); 144 addr = vm_map_min(map); 145 result = vm_map_find(map, NULL, 0, &addr, size, find_space, 146 VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); 147 if (result != KERN_SUCCESS) { 148 return (0); 149 } 150 return (addr); 151} 152 153/* 154 * Allocate wired-down memory in the kernel's address map 155 * or a submap. 156 */ 157vm_offset_t 158kmem_alloc(map, size) 159 vm_map_t map; 160 vm_size_t size; 161{ 162 vm_offset_t addr; 163 vm_offset_t offset; 164 vm_offset_t i; 165 166 size = round_page(size); 167 168 /* 169 * Use the kernel object for wired-down kernel pages. Assume that no 170 * region of the kernel object is referenced more than once. 171 */ 172 173 /* 174 * Locate sufficient space in the map. This will give us the final 175 * virtual address for the new memory, and thus will tell us the 176 * offset within the kernel map. 177 */ 178 vm_map_lock(map); 179 if (vm_map_findspace(map, vm_map_min(map), size, &addr)) { 180 vm_map_unlock(map); 181 return (0); 182 } 183 offset = addr - VM_MIN_KERNEL_ADDRESS; 184 vm_object_reference(kernel_object); 185 vm_map_insert(map, kernel_object, offset, addr, addr + size, 186 VM_PROT_ALL, VM_PROT_ALL, 0); 187 vm_map_unlock(map); 188 189 /* 190 * Guarantee that there are pages already in this object before 191 * calling vm_map_wire. This is to prevent the following 192 * scenario: 193 * 194 * 1) Threads have swapped out, so that there is a pager for the 195 * kernel_object. 2) The kmsg zone is empty, and so we are 196 * kmem_allocing a new page for it. 3) vm_map_wire calls vm_fault; 197 * there is no page, but there is a pager, so we call 198 * pager_data_request. But the kmsg zone is empty, so we must 199 * kmem_alloc. 4) goto 1 5) Even if the kmsg zone is not empty: when 200 * we get the data back from the pager, it will be (very stale) 201 * non-zero data. kmem_alloc is defined to return zero-filled memory. 202 * 203 * We're intentionally not activating the pages we allocate to prevent a 204 * race with page-out. vm_map_wire will wire the pages. 205 */ 206 VM_OBJECT_LOCK(kernel_object); 207 for (i = 0; i < size; i += PAGE_SIZE) { 208 vm_page_t mem; 209 210 mem = vm_page_grab(kernel_object, OFF_TO_IDX(offset + i), 211 VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_RETRY); 212 mem->valid = VM_PAGE_BITS_ALL; 213 KASSERT((mem->oflags & VPO_UNMANAGED) != 0, 214 ("kmem_alloc: page %p is managed", mem)); 215 } 216 VM_OBJECT_UNLOCK(kernel_object); 217 218 /* 219 * And finally, mark the data as non-pageable. 220 */ 221 (void) vm_map_wire(map, addr, addr + size, 222 VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES); 223 224 return (addr); 225} 226 227/* 228 * kmem_free: 229 * 230 * Release a region of kernel virtual memory allocated 231 * with kmem_alloc, and return the physical pages 232 * associated with that region. 233 * 234 * This routine may not block on kernel maps. 235 */ 236void 237kmem_free(map, addr, size) 238 vm_map_t map; 239 vm_offset_t addr; 240 vm_size_t size; 241{ 242 243 (void) vm_map_remove(map, trunc_page(addr), round_page(addr + size)); 244} 245 246/* 247 * kmem_suballoc: 248 * 249 * Allocates a map to manage a subrange 250 * of the kernel virtual address space. 251 * 252 * Arguments are as follows: 253 * 254 * parent Map to take range from 255 * min, max Returned endpoints of map 256 * size Size of range to find 257 * superpage_align Request that min is superpage aligned 258 */ 259vm_map_t 260kmem_suballoc(vm_map_t parent, vm_offset_t *min, vm_offset_t *max, 261 vm_size_t size, boolean_t superpage_align) 262{ 263 int ret; 264 vm_map_t result; 265 266 size = round_page(size); 267 268 *min = vm_map_min(parent); 269 ret = vm_map_find(parent, NULL, 0, min, size, superpage_align ? 270 VMFS_ALIGNED_SPACE : VMFS_ANY_SPACE, VM_PROT_ALL, VM_PROT_ALL, 271 MAP_ACC_NO_CHARGE); 272 if (ret != KERN_SUCCESS) 273 panic("kmem_suballoc: bad status return of %d", ret); 274 *max = *min + size; 275 result = vm_map_create(vm_map_pmap(parent), *min, *max); 276 if (result == NULL) 277 panic("kmem_suballoc: cannot create submap"); 278 if (vm_map_submap(parent, *min, *max, result) != KERN_SUCCESS) 279 panic("kmem_suballoc: unable to change range to submap"); 280 return (result); 281} 282 283/* 284 * kmem_malloc: 285 * 286 * Allocate wired-down memory in the kernel's address map for the higher 287 * level kernel memory allocator (kern/kern_malloc.c). We cannot use 288 * kmem_alloc() because we may need to allocate memory at interrupt 289 * level where we cannot block (canwait == FALSE). 290 * 291 * This routine has its own private kernel submap (kmem_map) and object 292 * (kmem_object). This, combined with the fact that only malloc uses 293 * this routine, ensures that we will never block in map or object waits. 294 * 295 * We don't worry about expanding the map (adding entries) since entries 296 * for wired maps are statically allocated. 297 * 298 * `map' is ONLY allowed to be kmem_map or one of the mbuf submaps to 299 * which we never free. 300 */ 301vm_offset_t 302kmem_malloc(map, size, flags) 303 vm_map_t map; 304 vm_size_t size; 305 int flags; 306{ 307 vm_offset_t addr; 308 int i, rv; 309 310 size = round_page(size); 311 addr = vm_map_min(map); 312 313 /* 314 * Locate sufficient space in the map. This will give us the final 315 * virtual address for the new memory, and thus will tell us the 316 * offset within the kernel map. 317 */ 318 vm_map_lock(map); 319 if (vm_map_findspace(map, vm_map_min(map), size, &addr)) { 320 vm_map_unlock(map); 321 if ((flags & M_NOWAIT) == 0) { 322 for (i = 0; i < 8; i++) { 323 EVENTHANDLER_INVOKE(vm_lowmem, 0); 324 uma_reclaim(); 325 vm_map_lock(map); 326 if (vm_map_findspace(map, vm_map_min(map), 327 size, &addr) == 0) { 328 break; 329 } 330 vm_map_unlock(map); 331 tsleep(&i, 0, "nokva", (hz / 4) * (i + 1)); 332 } 333 if (i == 8) { 334 panic("kmem_malloc(%ld): kmem_map too small: %ld total allocated", 335 (long)size, (long)map->size); 336 } 337 } else { 338 return (0); 339 } 340 } 341 342 rv = kmem_back(map, addr, size, flags); 343 vm_map_unlock(map); 344 return (rv == KERN_SUCCESS ? addr : 0); 345} 346 347/* 348 * kmem_back: 349 * 350 * Allocate physical pages for the specified virtual address range. 351 */ 352int 353kmem_back(vm_map_t map, vm_offset_t addr, vm_size_t size, int flags) 354{ 355 vm_offset_t offset, i; 356 vm_map_entry_t entry; 357 vm_page_t m; 358 int pflags; 359 boolean_t found; 360 361 KASSERT(vm_map_locked(map), ("kmem_back: map %p is not locked", map)); 362 offset = addr - VM_MIN_KERNEL_ADDRESS; 363 vm_object_reference(kmem_object); 364 vm_map_insert(map, kmem_object, offset, addr, addr + size, 365 VM_PROT_ALL, VM_PROT_ALL, 0); 366 367 /* 368 * Assert: vm_map_insert() will never be able to extend the 369 * previous entry so vm_map_lookup_entry() will find a new 370 * entry exactly corresponding to this address range and it 371 * will have wired_count == 0. 372 */ 373 found = vm_map_lookup_entry(map, addr, &entry); 374 KASSERT(found && entry->start == addr && entry->end == addr + size && 375 entry->wired_count == 0 && (entry->eflags & MAP_ENTRY_IN_TRANSITION) 376 == 0, ("kmem_back: entry not found or misaligned")); 377 378 if ((flags & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT) 379 pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; 380 else 381 pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; 382 383 if (flags & M_ZERO) 384 pflags |= VM_ALLOC_ZERO;
|
| 385 if (flags & M_NODUMP) 386 pflags |= VM_ALLOC_NODUMP;
|
385 386 VM_OBJECT_LOCK(kmem_object); 387 for (i = 0; i < size; i += PAGE_SIZE) { 388retry: 389 m = vm_page_alloc(kmem_object, OFF_TO_IDX(offset + i), pflags); 390 391 /* 392 * Ran out of space, free everything up and return. Don't need 393 * to lock page queues here as we know that the pages we got 394 * aren't on any queues. 395 */ 396 if (m == NULL) { 397 if ((flags & M_NOWAIT) == 0) { 398 VM_OBJECT_UNLOCK(kmem_object); 399 entry->eflags |= MAP_ENTRY_IN_TRANSITION; 400 vm_map_unlock(map); 401 VM_WAIT; 402 vm_map_lock(map); 403 KASSERT( 404(entry->eflags & (MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_NEEDS_WAKEUP)) == 405 MAP_ENTRY_IN_TRANSITION, 406 ("kmem_back: volatile entry")); 407 entry->eflags &= ~MAP_ENTRY_IN_TRANSITION; 408 VM_OBJECT_LOCK(kmem_object); 409 goto retry; 410 } 411 /* 412 * Free the pages before removing the map entry. 413 * They are already marked busy. Calling 414 * vm_map_delete before the pages has been freed or 415 * unbusied will cause a deadlock. 416 */ 417 while (i != 0) { 418 i -= PAGE_SIZE; 419 m = vm_page_lookup(kmem_object, 420 OFF_TO_IDX(offset + i)); 421 vm_page_unwire(m, 0); 422 vm_page_free(m); 423 } 424 VM_OBJECT_UNLOCK(kmem_object); 425 vm_map_delete(map, addr, addr + size); 426 return (KERN_NO_SPACE); 427 } 428 if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) 429 pmap_zero_page(m); 430 m->valid = VM_PAGE_BITS_ALL; 431 KASSERT((m->oflags & VPO_UNMANAGED) != 0, 432 ("kmem_malloc: page %p is managed", m)); 433 } 434 VM_OBJECT_UNLOCK(kmem_object); 435 436 /* 437 * Mark map entry as non-pageable. Repeat the assert. 438 */ 439 KASSERT(entry->start == addr && entry->end == addr + size && 440 entry->wired_count == 0, 441 ("kmem_back: entry not found or misaligned after allocation")); 442 entry->wired_count = 1; 443 444 /* 445 * At this point, the kmem_object must be unlocked because 446 * vm_map_simplify_entry() calls vm_object_deallocate(), which 447 * locks the kmem_object. 448 */ 449 vm_map_simplify_entry(map, entry); 450 451 /* 452 * Loop thru pages, entering them in the pmap. 453 */ 454 VM_OBJECT_LOCK(kmem_object); 455 for (i = 0; i < size; i += PAGE_SIZE) { 456 m = vm_page_lookup(kmem_object, OFF_TO_IDX(offset + i)); 457 /* 458 * Because this is kernel_pmap, this call will not block. 459 */ 460 pmap_enter(kernel_pmap, addr + i, VM_PROT_ALL, m, VM_PROT_ALL, 461 TRUE); 462 vm_page_wakeup(m); 463 } 464 VM_OBJECT_UNLOCK(kmem_object); 465 466 return (KERN_SUCCESS); 467} 468 469/* 470 * kmem_alloc_wait: 471 * 472 * Allocates pageable memory from a sub-map of the kernel. If the submap 473 * has no room, the caller sleeps waiting for more memory in the submap. 474 * 475 * This routine may block. 476 */ 477vm_offset_t 478kmem_alloc_wait(map, size) 479 vm_map_t map; 480 vm_size_t size; 481{ 482 vm_offset_t addr; 483 484 size = round_page(size); 485 if (!swap_reserve(size)) 486 return (0); 487 488 for (;;) { 489 /* 490 * To make this work for more than one map, use the map's lock 491 * to lock out sleepers/wakers. 492 */ 493 vm_map_lock(map); 494 if (vm_map_findspace(map, vm_map_min(map), size, &addr) == 0) 495 break; 496 /* no space now; see if we can ever get space */ 497 if (vm_map_max(map) - vm_map_min(map) < size) { 498 vm_map_unlock(map); 499 swap_release(size); 500 return (0); 501 } 502 map->needs_wakeup = TRUE; 503 vm_map_unlock_and_wait(map, 0); 504 } 505 vm_map_insert(map, NULL, 0, addr, addr + size, VM_PROT_ALL, 506 VM_PROT_ALL, MAP_ACC_CHARGED); 507 vm_map_unlock(map); 508 return (addr); 509} 510 511/* 512 * kmem_free_wakeup: 513 * 514 * Returns memory to a submap of the kernel, and wakes up any processes 515 * waiting for memory in that map. 516 */ 517void 518kmem_free_wakeup(map, addr, size) 519 vm_map_t map; 520 vm_offset_t addr; 521 vm_size_t size; 522{ 523 524 vm_map_lock(map); 525 (void) vm_map_delete(map, trunc_page(addr), round_page(addr + size)); 526 if (map->needs_wakeup) { 527 map->needs_wakeup = FALSE; 528 vm_map_wakeup(map); 529 } 530 vm_map_unlock(map); 531} 532 533static void 534kmem_init_zero_region(void) 535{ 536 vm_offset_t addr, i; 537 vm_page_t m; 538 int error; 539 540 /* 541 * Map a single physical page of zeros to a larger virtual range. 542 * This requires less looping in places that want large amounts of 543 * zeros, while not using much more physical resources. 544 */ 545 addr = kmem_alloc_nofault(kernel_map, ZERO_REGION_SIZE); 546 m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | 547 VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO); 548 if ((m->flags & PG_ZERO) == 0) 549 pmap_zero_page(m); 550 for (i = 0; i < ZERO_REGION_SIZE; i += PAGE_SIZE) 551 pmap_qenter(addr + i, &m, 1); 552 error = vm_map_protect(kernel_map, addr, addr + ZERO_REGION_SIZE, 553 VM_PROT_READ, TRUE); 554 KASSERT(error == 0, ("error=%d", error)); 555 556 zero_region = (const void *)addr; 557} 558 559/* 560 * kmem_init: 561 * 562 * Create the kernel map; insert a mapping covering kernel text, 563 * data, bss, and all space allocated thus far (`boostrap' data). The 564 * new map will thus map the range between VM_MIN_KERNEL_ADDRESS and 565 * `start' as allocated, and the range between `start' and `end' as free. 566 */ 567void 568kmem_init(start, end) 569 vm_offset_t start, end; 570{ 571 vm_map_t m; 572 573 m = vm_map_create(kernel_pmap, VM_MIN_KERNEL_ADDRESS, end); 574 m->system_map = 1; 575 vm_map_lock(m); 576 /* N.B.: cannot use kgdb to debug, starting with this assignment ... */ 577 kernel_map = m; 578 (void) vm_map_insert(m, NULL, (vm_ooffset_t) 0, 579#ifdef __amd64__ 580 KERNBASE, 581#else 582 VM_MIN_KERNEL_ADDRESS, 583#endif 584 start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); 585 /* ... and ending with the completion of the above `insert' */ 586 vm_map_unlock(m); 587 588 kmem_init_zero_region(); 589} 590 591#ifdef DIAGNOSTIC 592/* 593 * Allow userspace to directly trigger the VM drain routine for testing 594 * purposes. 595 */ 596static int 597debug_vm_lowmem(SYSCTL_HANDLER_ARGS) 598{ 599 int error, i; 600 601 i = 0; 602 error = sysctl_handle_int(oidp, &i, 0, req); 603 if (error) 604 return (error); 605 if (i) 606 EVENTHANDLER_INVOKE(vm_lowmem, 0); 607 return (0); 608} 609 610SYSCTL_PROC(_debug, OID_AUTO, vm_lowmem, CTLTYPE_INT | CTLFLAG_RW, 0, 0, 611 debug_vm_lowmem, "I", "set to trigger vm_lowmem event"); 612#endif
| 387 388 VM_OBJECT_LOCK(kmem_object); 389 for (i = 0; i < size; i += PAGE_SIZE) { 390retry: 391 m = vm_page_alloc(kmem_object, OFF_TO_IDX(offset + i), pflags); 392 393 /* 394 * Ran out of space, free everything up and return. Don't need 395 * to lock page queues here as we know that the pages we got 396 * aren't on any queues. 397 */ 398 if (m == NULL) { 399 if ((flags & M_NOWAIT) == 0) { 400 VM_OBJECT_UNLOCK(kmem_object); 401 entry->eflags |= MAP_ENTRY_IN_TRANSITION; 402 vm_map_unlock(map); 403 VM_WAIT; 404 vm_map_lock(map); 405 KASSERT( 406(entry->eflags & (MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_NEEDS_WAKEUP)) == 407 MAP_ENTRY_IN_TRANSITION, 408 ("kmem_back: volatile entry")); 409 entry->eflags &= ~MAP_ENTRY_IN_TRANSITION; 410 VM_OBJECT_LOCK(kmem_object); 411 goto retry; 412 } 413 /* 414 * Free the pages before removing the map entry. 415 * They are already marked busy. Calling 416 * vm_map_delete before the pages has been freed or 417 * unbusied will cause a deadlock. 418 */ 419 while (i != 0) { 420 i -= PAGE_SIZE; 421 m = vm_page_lookup(kmem_object, 422 OFF_TO_IDX(offset + i)); 423 vm_page_unwire(m, 0); 424 vm_page_free(m); 425 } 426 VM_OBJECT_UNLOCK(kmem_object); 427 vm_map_delete(map, addr, addr + size); 428 return (KERN_NO_SPACE); 429 } 430 if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) 431 pmap_zero_page(m); 432 m->valid = VM_PAGE_BITS_ALL; 433 KASSERT((m->oflags & VPO_UNMANAGED) != 0, 434 ("kmem_malloc: page %p is managed", m)); 435 } 436 VM_OBJECT_UNLOCK(kmem_object); 437 438 /* 439 * Mark map entry as non-pageable. Repeat the assert. 440 */ 441 KASSERT(entry->start == addr && entry->end == addr + size && 442 entry->wired_count == 0, 443 ("kmem_back: entry not found or misaligned after allocation")); 444 entry->wired_count = 1; 445 446 /* 447 * At this point, the kmem_object must be unlocked because 448 * vm_map_simplify_entry() calls vm_object_deallocate(), which 449 * locks the kmem_object. 450 */ 451 vm_map_simplify_entry(map, entry); 452 453 /* 454 * Loop thru pages, entering them in the pmap. 455 */ 456 VM_OBJECT_LOCK(kmem_object); 457 for (i = 0; i < size; i += PAGE_SIZE) { 458 m = vm_page_lookup(kmem_object, OFF_TO_IDX(offset + i)); 459 /* 460 * Because this is kernel_pmap, this call will not block. 461 */ 462 pmap_enter(kernel_pmap, addr + i, VM_PROT_ALL, m, VM_PROT_ALL, 463 TRUE); 464 vm_page_wakeup(m); 465 } 466 VM_OBJECT_UNLOCK(kmem_object); 467 468 return (KERN_SUCCESS); 469} 470 471/* 472 * kmem_alloc_wait: 473 * 474 * Allocates pageable memory from a sub-map of the kernel. If the submap 475 * has no room, the caller sleeps waiting for more memory in the submap. 476 * 477 * This routine may block. 478 */ 479vm_offset_t 480kmem_alloc_wait(map, size) 481 vm_map_t map; 482 vm_size_t size; 483{ 484 vm_offset_t addr; 485 486 size = round_page(size); 487 if (!swap_reserve(size)) 488 return (0); 489 490 for (;;) { 491 /* 492 * To make this work for more than one map, use the map's lock 493 * to lock out sleepers/wakers. 494 */ 495 vm_map_lock(map); 496 if (vm_map_findspace(map, vm_map_min(map), size, &addr) == 0) 497 break; 498 /* no space now; see if we can ever get space */ 499 if (vm_map_max(map) - vm_map_min(map) < size) { 500 vm_map_unlock(map); 501 swap_release(size); 502 return (0); 503 } 504 map->needs_wakeup = TRUE; 505 vm_map_unlock_and_wait(map, 0); 506 } 507 vm_map_insert(map, NULL, 0, addr, addr + size, VM_PROT_ALL, 508 VM_PROT_ALL, MAP_ACC_CHARGED); 509 vm_map_unlock(map); 510 return (addr); 511} 512 513/* 514 * kmem_free_wakeup: 515 * 516 * Returns memory to a submap of the kernel, and wakes up any processes 517 * waiting for memory in that map. 518 */ 519void 520kmem_free_wakeup(map, addr, size) 521 vm_map_t map; 522 vm_offset_t addr; 523 vm_size_t size; 524{ 525 526 vm_map_lock(map); 527 (void) vm_map_delete(map, trunc_page(addr), round_page(addr + size)); 528 if (map->needs_wakeup) { 529 map->needs_wakeup = FALSE; 530 vm_map_wakeup(map); 531 } 532 vm_map_unlock(map); 533} 534 535static void 536kmem_init_zero_region(void) 537{ 538 vm_offset_t addr, i; 539 vm_page_t m; 540 int error; 541 542 /* 543 * Map a single physical page of zeros to a larger virtual range. 544 * This requires less looping in places that want large amounts of 545 * zeros, while not using much more physical resources. 546 */ 547 addr = kmem_alloc_nofault(kernel_map, ZERO_REGION_SIZE); 548 m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | 549 VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO); 550 if ((m->flags & PG_ZERO) == 0) 551 pmap_zero_page(m); 552 for (i = 0; i < ZERO_REGION_SIZE; i += PAGE_SIZE) 553 pmap_qenter(addr + i, &m, 1); 554 error = vm_map_protect(kernel_map, addr, addr + ZERO_REGION_SIZE, 555 VM_PROT_READ, TRUE); 556 KASSERT(error == 0, ("error=%d", error)); 557 558 zero_region = (const void *)addr; 559} 560 561/* 562 * kmem_init: 563 * 564 * Create the kernel map; insert a mapping covering kernel text, 565 * data, bss, and all space allocated thus far (`boostrap' data). The 566 * new map will thus map the range between VM_MIN_KERNEL_ADDRESS and 567 * `start' as allocated, and the range between `start' and `end' as free. 568 */ 569void 570kmem_init(start, end) 571 vm_offset_t start, end; 572{ 573 vm_map_t m; 574 575 m = vm_map_create(kernel_pmap, VM_MIN_KERNEL_ADDRESS, end); 576 m->system_map = 1; 577 vm_map_lock(m); 578 /* N.B.: cannot use kgdb to debug, starting with this assignment ... */ 579 kernel_map = m; 580 (void) vm_map_insert(m, NULL, (vm_ooffset_t) 0, 581#ifdef __amd64__ 582 KERNBASE, 583#else 584 VM_MIN_KERNEL_ADDRESS, 585#endif 586 start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); 587 /* ... and ending with the completion of the above `insert' */ 588 vm_map_unlock(m); 589 590 kmem_init_zero_region(); 591} 592 593#ifdef DIAGNOSTIC 594/* 595 * Allow userspace to directly trigger the VM drain routine for testing 596 * purposes. 597 */ 598static int 599debug_vm_lowmem(SYSCTL_HANDLER_ARGS) 600{ 601 int error, i; 602 603 i = 0; 604 error = sysctl_handle_int(oidp, &i, 0, req); 605 if (error) 606 return (error); 607 if (i) 608 EVENTHANDLER_INVOKE(vm_lowmem, 0); 609 return (0); 610} 611 612SYSCTL_PROC(_debug, OID_AUTO, vm_lowmem, CTLTYPE_INT | CTLFLAG_RW, 0, 0, 613 debug_vm_lowmem, "I", "set to trigger vm_lowmem event"); 614#endif
|