Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/uma_core.c
Show First 20 Lines • Show All 1,973 Lines • ▼ Show 20 Lines | pcpu_page_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *pflag, | ||||
vm_page_t p, p_next; | vm_page_t p, p_next; | ||||
#ifdef NUMA | #ifdef NUMA | ||||
struct pcpu *pc; | struct pcpu *pc; | ||||
#endif | #endif | ||||
MPASS(bytes == (mp_maxid + 1) * PAGE_SIZE); | MPASS(bytes == (mp_maxid + 1) * PAGE_SIZE); | ||||
TAILQ_INIT(&alloctail); | TAILQ_INIT(&alloctail); | ||||
flags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ | | flags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED | malloc2vm_flags(wait); | ||||
malloc2vm_flags(wait); | |||||
*pflag = UMA_SLAB_KERNEL; | *pflag = UMA_SLAB_KERNEL; | ||||
for (cpu = 0; cpu <= mp_maxid; cpu++) { | for (cpu = 0; cpu <= mp_maxid; cpu++) { | ||||
if (CPU_ABSENT(cpu)) { | if (CPU_ABSENT(cpu)) { | ||||
p = vm_page_alloc(NULL, 0, flags); | p = vm_page_alloc_noobj(flags); | ||||
} else { | } else { | ||||
#ifndef NUMA | #ifndef NUMA | ||||
p = vm_page_alloc(NULL, 0, flags); | p = vm_page_alloc_noobj(flags); | ||||
#else | #else | ||||
pc = pcpu_find(cpu); | pc = pcpu_find(cpu); | ||||
if (__predict_false(VM_DOMAIN_EMPTY(pc->pc_domain))) | if (__predict_false(VM_DOMAIN_EMPTY(pc->pc_domain))) | ||||
p = NULL; | p = NULL; | ||||
else | else | ||||
p = vm_page_alloc_domain(NULL, 0, | p = vm_page_alloc_noobj_domain(pc->pc_domain, | ||||
pc->pc_domain, flags); | flags); | ||||
if (__predict_false(p == NULL)) | if (__predict_false(p == NULL)) | ||||
p = vm_page_alloc(NULL, 0, flags); | p = vm_page_alloc_noobj(flags); | ||||
#endif | #endif | ||||
} | } | ||||
if (__predict_false(p == NULL)) | if (__predict_false(p == NULL)) | ||||
goto fail; | goto fail; | ||||
TAILQ_INSERT_TAIL(&alloctail, p, listq); | TAILQ_INSERT_TAIL(&alloctail, p, listq); | ||||
} | } | ||||
if ((addr = kva_alloc(bytes)) == 0) | if ((addr = kva_alloc(bytes)) == 0) | ||||
goto fail; | goto fail; | ||||
Show All 26 Lines | |||||
noobj_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *flags, | noobj_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *flags, | ||||
int wait) | int wait) | ||||
{ | { | ||||
TAILQ_HEAD(, vm_page) alloctail; | TAILQ_HEAD(, vm_page) alloctail; | ||||
u_long npages; | u_long npages; | ||||
vm_offset_t retkva, zkva; | vm_offset_t retkva, zkva; | ||||
vm_page_t p, p_next; | vm_page_t p, p_next; | ||||
uma_keg_t keg; | uma_keg_t keg; | ||||
int req; | |||||
TAILQ_INIT(&alloctail); | TAILQ_INIT(&alloctail); | ||||
keg = zone->uz_keg; | keg = zone->uz_keg; | ||||
req = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; | |||||
if ((wait & M_WAITOK) != 0) | |||||
req |= VM_ALLOC_WAITOK; | |||||
npages = howmany(bytes, PAGE_SIZE); | npages = howmany(bytes, PAGE_SIZE); | ||||
while (npages > 0) { | while (npages > 0) { | ||||
p = vm_page_alloc_domain(NULL, 0, domain, VM_ALLOC_INTERRUPT | | p = vm_page_alloc_noobj_domain(domain, req); | ||||
VM_ALLOC_WIRED | VM_ALLOC_NOOBJ | | |||||
((wait & M_WAITOK) != 0 ? VM_ALLOC_WAITOK : | |||||
VM_ALLOC_NOWAIT)); | |||||
if (p != NULL) { | if (p != NULL) { | ||||
/* | /* | ||||
* Since the page does not belong to an object, its | * Since the page does not belong to an object, its | ||||
* listq is unused. | * listq is unused. | ||||
*/ | */ | ||||
TAILQ_INSERT_TAIL(&alloctail, p, listq); | TAILQ_INSERT_TAIL(&alloctail, p, listq); | ||||
npages--; | npages--; | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 3,800 Lines • Show Last 20 Lines |