Changeset View
Changeset View
Standalone View
Standalone View
user/alc/PQ_LAUNDRY/sys/vm/vm_kern.c
Show First 20 Lines • Show All 175 Lines • ▼ Show 20 Lines | kmem_alloc_attr(vmem_t *vmem, vm_size_t size, int flags, vm_paddr_t low, | ||||
for (i = 0; i < size; i += PAGE_SIZE) { | for (i = 0; i < size; i += PAGE_SIZE) { | ||||
tries = 0; | tries = 0; | ||||
retry: | retry: | ||||
m = vm_page_alloc_contig(object, OFF_TO_IDX(offset + i), | m = vm_page_alloc_contig(object, OFF_TO_IDX(offset + i), | ||||
pflags, 1, low, high, PAGE_SIZE, 0, memattr); | pflags, 1, low, high, PAGE_SIZE, 0, 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, 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; | ||||
} | } | ||||
kmem_unback(object, addr, i); | kmem_unback(object, addr, i); | ||||
vmem_free(vmem, addr, size); | vmem_free(vmem, addr, size); | ||||
return (0); | return (0); | ||||
} | } | ||||
Show All 19 Lines | |||||
kmem_alloc_contig(struct vmem *vmem, vm_size_t size, int flags, vm_paddr_t low, | kmem_alloc_contig(struct vmem *vmem, vm_size_t size, int flags, vm_paddr_t low, | ||||
vm_paddr_t high, u_long alignment, vm_paddr_t boundary, | vm_paddr_t high, u_long alignment, vm_paddr_t boundary, | ||||
vm_memattr_t memattr) | vm_memattr_t memattr) | ||||
{ | { | ||||
vm_object_t object = vmem == kmem_arena ? kmem_object : kernel_object; | vm_object_t object = vmem == kmem_arena ? kmem_object : kernel_object; | ||||
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); | ||||
if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr)) | if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr)) | ||||
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; | ||||
} | } | ||||
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) | ||||
pmap_zero_page(m); | pmap_zero_page(m); | ||||
m->valid = VM_PAGE_BITS_ALL; | m->valid = VM_PAGE_BITS_ALL; | ||||
pmap_enter(kernel_pmap, tmp, m, VM_PROT_ALL, | pmap_enter(kernel_pmap, tmp, m, VM_PROT_ALL, | ||||
VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | ||||
tmp += PAGE_SIZE; | tmp += PAGE_SIZE; | ||||
▲ Show 20 Lines • Show All 301 Lines • Show Last 20 Lines |