Deleted Added
full compact
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 ---