Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_kern.c
Show First 20 Lines • Show All 171 Lines • ▼ Show 20 Lines | |||||
static vm_page_t | static vm_page_t | ||||
kmem_alloc_contig_pages(vm_object_t object, vm_pindex_t pindex, int domain, | kmem_alloc_contig_pages(vm_object_t object, vm_pindex_t pindex, int domain, | ||||
int pflags, u_long npages, vm_paddr_t low, vm_paddr_t high, | int pflags, u_long npages, vm_paddr_t low, vm_paddr_t high, | ||||
u_long alignment, vm_paddr_t boundary, vm_memattr_t memattr) | u_long alignment, vm_paddr_t boundary, vm_memattr_t memattr) | ||||
{ | { | ||||
vm_page_t m; | vm_page_t m; | ||||
int tries; | int tries; | ||||
bool wait; | bool wait, reclaim; | ||||
VM_OBJECT_ASSERT_WLOCKED(object); | VM_OBJECT_ASSERT_WLOCKED(object); | ||||
/* Disallow an invalid combination of flags. */ | |||||
MPASS((pflags & (VM_ALLOC_WAITOK | VM_ALLOC_NORECLAIM)) != | |||||
(VM_ALLOC_WAITOK | VM_ALLOC_NORECLAIM)); | |||||
wait = (pflags & VM_ALLOC_WAITOK) != 0; | wait = (pflags & VM_ALLOC_WAITOK) != 0; | ||||
reclaim = (pflags & VM_ALLOC_NORECLAIM) == 0; | |||||
pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | ||||
pflags |= VM_ALLOC_NOWAIT; | pflags |= VM_ALLOC_NOWAIT; | ||||
for (tries = wait ? 3 : 1;; tries--) { | for (tries = wait ? 3 : 1;; tries--) { | ||||
m = vm_page_alloc_contig_domain(object, pindex, domain, pflags, | m = vm_page_alloc_contig_domain(object, pindex, domain, pflags, | ||||
npages, low, high, alignment, boundary, memattr); | npages, low, high, alignment, boundary, memattr); | ||||
if (m != NULL || tries == 0) | if (m != NULL || tries == 0 || !reclaim) | ||||
break; | break; | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
if (!vm_page_reclaim_contig_domain(domain, pflags, npages, | if (!vm_page_reclaim_contig_domain(domain, pflags, npages, | ||||
low, high, alignment, boundary) && wait) | low, high, alignment, boundary) && wait) | ||||
vm_wait_domain(domain); | vm_wait_domain(domain); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 701 Lines • Show Last 20 Lines |