vm_kern.c (314663) | vm_kern.c (316073) |
---|---|
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 --- 49 unchanged lines hidden (view full) --- 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 --- 49 unchanged lines hidden (view full) --- 58 * rights to redistribute these changes. 59 */ 60 61/* 62 * Kernel memory management. 63 */ 64 65#include <sys/cdefs.h> |
66__FBSDID("$FreeBSD: stable/11/sys/vm/vm_kern.c 314663 2017-03-04 12:05:46Z avg $"); | 66__FBSDID("$FreeBSD: stable/11/sys/vm/vm_kern.c 316073 2017-03-28 06:07:59Z kib $"); |
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/proc.h> 74#include <sys/malloc.h> --- 82 unchanged lines hidden (view full) --- 157 * necessarily physically contiguous. If M_ZERO is specified through the 158 * given flags, then the pages are zeroed before they are mapped. 159 */ 160vm_offset_t 161kmem_alloc_attr(vmem_t *vmem, vm_size_t size, int flags, vm_paddr_t low, 162 vm_paddr_t high, vm_memattr_t memattr) 163{ 164 vm_object_t object = vmem == kmem_arena ? kmem_object : kernel_object; | 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/proc.h> 74#include <sys/malloc.h> --- 82 unchanged lines hidden (view full) --- 157 * necessarily physically contiguous. If M_ZERO is specified through the 158 * given flags, then the pages are zeroed before they are mapped. 159 */ 160vm_offset_t 161kmem_alloc_attr(vmem_t *vmem, vm_size_t size, int flags, vm_paddr_t low, 162 vm_paddr_t high, vm_memattr_t memattr) 163{ 164 vm_object_t object = vmem == kmem_arena ? kmem_object : kernel_object; |
165 vm_offset_t addr, i; 166 vm_ooffset_t offset; | 165 vm_offset_t addr, i, offset; |
167 vm_page_t m; 168 int pflags, tries; 169 170 size = round_page(size); 171 if (vmem_alloc(vmem, size, M_BESTFIT | flags, &addr)) 172 return (0); 173 offset = addr - VM_MIN_KERNEL_ADDRESS; 174 pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; 175 VM_OBJECT_WLOCK(object); 176 for (i = 0; i < size; i += PAGE_SIZE) { 177 tries = 0; 178retry: | 166 vm_page_t m; 167 int pflags, tries; 168 169 size = round_page(size); 170 if (vmem_alloc(vmem, size, M_BESTFIT | flags, &addr)) 171 return (0); 172 offset = addr - VM_MIN_KERNEL_ADDRESS; 173 pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; 174 VM_OBJECT_WLOCK(object); 175 for (i = 0; i < size; i += PAGE_SIZE) { 176 tries = 0; 177retry: |
179 m = vm_page_alloc_contig(object, OFF_TO_IDX(offset + i), | 178 m = vm_page_alloc_contig(object, atop(offset + i), |
180 pflags, 1, low, high, PAGE_SIZE, 0, memattr); 181 if (m == NULL) { 182 VM_OBJECT_WUNLOCK(object); 183 if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { 184 if (!vm_page_reclaim_contig(pflags, 1, 185 low, high, PAGE_SIZE, 0) && 186 (flags & M_WAITOK) != 0) 187 VM_WAIT; --- 24 unchanged lines hidden (view full) --- 212 * mapped. 213 */ 214vm_offset_t 215kmem_alloc_contig(struct vmem *vmem, vm_size_t size, int flags, vm_paddr_t low, 216 vm_paddr_t high, u_long alignment, vm_paddr_t boundary, 217 vm_memattr_t memattr) 218{ 219 vm_object_t object = vmem == kmem_arena ? kmem_object : kernel_object; | 179 pflags, 1, low, high, PAGE_SIZE, 0, memattr); 180 if (m == NULL) { 181 VM_OBJECT_WUNLOCK(object); 182 if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { 183 if (!vm_page_reclaim_contig(pflags, 1, 184 low, high, PAGE_SIZE, 0) && 185 (flags & M_WAITOK) != 0) 186 VM_WAIT; --- 24 unchanged lines hidden (view full) --- 211 * mapped. 212 */ 213vm_offset_t 214kmem_alloc_contig(struct vmem *vmem, vm_size_t size, int flags, vm_paddr_t low, 215 vm_paddr_t high, u_long alignment, vm_paddr_t boundary, 216 vm_memattr_t memattr) 217{ 218 vm_object_t object = vmem == kmem_arena ? kmem_object : kernel_object; |
220 vm_offset_t addr, tmp; 221 vm_ooffset_t offset; | 219 vm_offset_t addr, offset, tmp; |
222 vm_page_t end_m, m; 223 u_long npages; 224 int pflags, tries; 225 226 size = round_page(size); 227 if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr)) 228 return (0); 229 offset = addr - VM_MIN_KERNEL_ADDRESS; 230 pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; 231 npages = atop(size); 232 VM_OBJECT_WLOCK(object); 233 tries = 0; 234retry: | 220 vm_page_t end_m, m; 221 u_long npages; 222 int pflags, tries; 223 224 size = round_page(size); 225 if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr)) 226 return (0); 227 offset = addr - VM_MIN_KERNEL_ADDRESS; 228 pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; 229 npages = atop(size); 230 VM_OBJECT_WLOCK(object); 231 tries = 0; 232retry: |
235 m = vm_page_alloc_contig(object, OFF_TO_IDX(offset), pflags, | 233 m = vm_page_alloc_contig(object, atop(offset), pflags, |
236 npages, low, high, alignment, boundary, memattr); 237 if (m == NULL) { 238 VM_OBJECT_WUNLOCK(object); 239 if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { 240 if (!vm_page_reclaim_contig(pflags, npages, low, high, 241 alignment, boundary) && (flags & M_WAITOK) != 0) 242 VM_WAIT; 243 VM_OBJECT_WLOCK(object); --- 94 unchanged lines hidden (view full) --- 338 ("kmem_back: only supports kernel objects.")); 339 340 offset = addr - VM_MIN_KERNEL_ADDRESS; 341 pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; 342 343 VM_OBJECT_WLOCK(object); 344 for (i = 0; i < size; i += PAGE_SIZE) { 345retry: | 234 npages, low, high, alignment, boundary, memattr); 235 if (m == NULL) { 236 VM_OBJECT_WUNLOCK(object); 237 if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { 238 if (!vm_page_reclaim_contig(pflags, npages, low, high, 239 alignment, boundary) && (flags & M_WAITOK) != 0) 240 VM_WAIT; 241 VM_OBJECT_WLOCK(object); --- 94 unchanged lines hidden (view full) --- 336 ("kmem_back: only supports kernel objects.")); 337 338 offset = addr - VM_MIN_KERNEL_ADDRESS; 339 pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; 340 341 VM_OBJECT_WLOCK(object); 342 for (i = 0; i < size; i += PAGE_SIZE) { 343retry: |
346 m = vm_page_alloc(object, OFF_TO_IDX(offset + i), pflags); | 344 m = vm_page_alloc(object, atop(offset + i), pflags); |
347 348 /* 349 * Ran out of space, free everything up and return. Don't need 350 * to lock page queues here as we know that the pages we got 351 * aren't on any queues. 352 */ 353 if (m == NULL) { 354 VM_OBJECT_WUNLOCK(object); --- 35 unchanged lines hidden (view full) --- 390 391 KASSERT(object == kmem_object || object == kernel_object, 392 ("kmem_unback: only supports kernel objects.")); 393 394 pmap_remove(kernel_pmap, addr, addr + size); 395 offset = addr - VM_MIN_KERNEL_ADDRESS; 396 VM_OBJECT_WLOCK(object); 397 for (i = 0; i < size; i += PAGE_SIZE) { | 345 346 /* 347 * Ran out of space, free everything up and return. Don't need 348 * to lock page queues here as we know that the pages we got 349 * aren't on any queues. 350 */ 351 if (m == NULL) { 352 VM_OBJECT_WUNLOCK(object); --- 35 unchanged lines hidden (view full) --- 388 389 KASSERT(object == kmem_object || object == kernel_object, 390 ("kmem_unback: only supports kernel objects.")); 391 392 pmap_remove(kernel_pmap, addr, addr + size); 393 offset = addr - VM_MIN_KERNEL_ADDRESS; 394 VM_OBJECT_WLOCK(object); 395 for (i = 0; i < size; i += PAGE_SIZE) { |
398 m = vm_page_lookup(object, OFF_TO_IDX(offset + i)); | 396 m = vm_page_lookup(object, atop(offset + i)); |
399 vm_page_unwire(m, PQ_NONE); 400 vm_page_free(m); 401 } 402 VM_OBJECT_WUNLOCK(object); 403} 404 405/* 406 * kmem_free: --- 155 unchanged lines hidden --- | 397 vm_page_unwire(m, PQ_NONE); 398 vm_page_free(m); 399 } 400 VM_OBJECT_WUNLOCK(object); 401} 402 403/* 404 * kmem_free: --- 155 unchanged lines hidden --- |