Changeset View
Changeset View
Standalone View
Standalone View
vm/vm_kern.c
Context not available. | |||||
if (m == NULL) { | if (m == NULL) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | ||||
vm_pageout_grow_cache(tries, low, high); | if (!vm_page_reclaim_contig(pflags, 1, | ||||
low, high, PAGE_SIZE, 0) && | |||||
(flags & M_WAITOK) != 0) | |||||
VM_WAIT; | |||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
tries++; | tries++; | ||||
goto retry; | goto retry; | ||||
Context not available. | |||||
vm_offset_t addr, tmp; | vm_offset_t addr, tmp; | ||||
vm_ooffset_t offset; | vm_ooffset_t offset; | ||||
vm_page_t end_m, m; | vm_page_t end_m, m; | ||||
u_long npages; | |||||
int pflags, tries; | int pflags, tries; | ||||
size = round_page(size); | size = round_page(size); | ||||
Context not available. | |||||
return (0); | return (0); | ||||
offset = addr - VM_MIN_KERNEL_ADDRESS; | offset = addr - VM_MIN_KERNEL_ADDRESS; | ||||
pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; | pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; | ||||
npages = atop(size); | |||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
tries = 0; | tries = 0; | ||||
retry: | retry: | ||||
m = vm_page_alloc_contig(object, OFF_TO_IDX(offset), pflags, | m = vm_page_alloc_contig(object, OFF_TO_IDX(offset), pflags, | ||||
atop(size), low, high, alignment, boundary, memattr); | npages, low, high, alignment, boundary, memattr); | ||||
if (m == NULL) { | if (m == NULL) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | ||||
vm_pageout_grow_cache(tries, low, high); | if (!vm_page_reclaim_contig(pflags, npages, low, high, | ||||
alignment, boundary) && (flags & M_WAITOK) != 0) | |||||
VM_WAIT; | |||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
tries++; | tries++; | ||||
goto retry; | goto retry; | ||||
Context not available. | |||||
vmem_free(vmem, addr, size); | vmem_free(vmem, addr, size); | ||||
return (0); | return (0); | ||||
} | } | ||||
end_m = m + atop(size); | end_m = m + npages; | ||||
tmp = addr; | tmp = addr; | ||||
for (; m < end_m; m++) { | for (; m < end_m; m++) { | ||||
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | ||||
Context not available. | |||||
vm_map_unlock(m); | vm_map_unlock(m); | ||||
} | } | ||||
/* | |||||
* XXX | |||||
*/ | |||||
static int | |||||
debug_vm_compact(SYSCTL_HANDLER_ARGS) | |||||
{ | |||||
vm_offset_t va; | |||||
vm_paddr_t pa; | |||||
int error, i; | |||||
i = 0; | |||||
error = sysctl_handle_int(oidp, &i, 0, req); | |||||
if (error != 0) | |||||
return (error); | |||||
if (i != 0) { | |||||
pa = 0; | |||||
va = kmem_alloc_contig(kernel_arena, 1024 * PAGE_SIZE, M_WAITOK, | |||||
0, 0xffffffff, 1024 * PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); | |||||
if (va != 0) { | |||||
pa = pmap_kextract(va); | |||||
kmem_free(kernel_arena, va, 1024 * PAGE_SIZE); | |||||
} | |||||
printf("va: %#jx -> pa: %#jx\n", (uintmax_t)va, (uintmax_t)pa); | |||||
} | |||||
return (0); | |||||
} | |||||
SYSCTL_PROC(_debug, OID_AUTO, vm_compact, CTLTYPE_INT | CTLFLAG_RW, 0, 0, | |||||
debug_vm_compact, "I", "set to trigger vm_compact event"); | |||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
/* | /* | ||||
* Allow userspace to directly trigger the VM drain routine for testing | * Allow userspace to directly trigger the VM drain routine for testing | ||||
Context not available. |