Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_page.c
Show First 20 Lines • Show All 1,806 Lines • ▼ Show 20 Lines | vm_page_alloc_domain_after(vm_object_t object, vm_pindex_t pindex, int domain, | ||||
KASSERT(object == NULL || (req & VM_ALLOC_WAITOK) == 0, | KASSERT(object == NULL || (req & VM_ALLOC_WAITOK) == 0, | ||||
("Can't sleep and retry object insertion.")); | ("Can't sleep and retry object insertion.")); | ||||
KASSERT(mpred == NULL || mpred->pindex < pindex, | KASSERT(mpred == NULL || mpred->pindex < pindex, | ||||
("mpred %p doesn't precede pindex 0x%jx", mpred, | ("mpred %p doesn't precede pindex 0x%jx", mpred, | ||||
(uintmax_t)pindex)); | (uintmax_t)pindex)); | ||||
if (object != NULL) | if (object != NULL) | ||||
VM_OBJECT_ASSERT_WLOCKED(object); | VM_OBJECT_ASSERT_WLOCKED(object); | ||||
again: | flags = 0; | ||||
m = NULL; | m = NULL; | ||||
again: | |||||
#if VM_NRESERVLEVEL > 0 | #if VM_NRESERVLEVEL > 0 | ||||
/* | /* | ||||
* Can we allocate the page from a reservation? | * Can we allocate the page from a reservation? | ||||
*/ | */ | ||||
if (vm_object_reserv(object) && | if (vm_object_reserv(object) && | ||||
(m = vm_reserv_alloc_page(object, pindex, domain, req, mpred)) != | (m = vm_reserv_alloc_page(object, pindex, domain, req, mpred)) != | ||||
NULL) { | NULL) { | ||||
domain = vm_phys_domain(m); | domain = vm_phys_domain(m); | ||||
vmd = VM_DOMAIN(domain); | vmd = VM_DOMAIN(domain); | ||||
goto found; | goto found; | ||||
} | } | ||||
#endif | #endif | ||||
vmd = VM_DOMAIN(domain); | vmd = VM_DOMAIN(domain); | ||||
if (object != NULL && vmd->vmd_pgcache != NULL) { | if (object != NULL && vmd->vmd_pgcache != NULL) { | ||||
m = uma_zalloc(vmd->vmd_pgcache, M_NOWAIT); | m = uma_zalloc(vmd->vmd_pgcache, M_NOWAIT); | ||||
if (m != NULL) | if (m != NULL) { | ||||
flags |= PG_PCPU_CACHE; | |||||
goto found; | goto found; | ||||
} | } | ||||
} | |||||
if (vm_domain_allocate(vmd, req, 1)) { | if (vm_domain_allocate(vmd, req, 1)) { | ||||
/* | /* | ||||
* If not, allocate it from the free page queues. | * If not, allocate it from the free page queues. | ||||
*/ | */ | ||||
vm_domain_free_lock(vmd); | vm_domain_free_lock(vmd); | ||||
m = vm_phys_alloc_pages(domain, object != NULL ? | m = vm_phys_alloc_pages(domain, object != NULL ? | ||||
VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRECT, 0); | VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRECT, 0); | ||||
vm_domain_free_unlock(vmd); | vm_domain_free_unlock(vmd); | ||||
Show All 10 Lines | if (m == NULL) { | ||||
* Not allocatable, give up. | * Not allocatable, give up. | ||||
*/ | */ | ||||
if (vm_domain_alloc_fail(vmd, object, req)) | if (vm_domain_alloc_fail(vmd, object, req)) | ||||
goto again; | goto again; | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
/* | /* | ||||
* At this point we had better have found a good page. | * At this point we had better have found a good page. | ||||
*/ | */ | ||||
KASSERT(m != NULL, ("missing page")); | |||||
found: | found: | ||||
vm_page_dequeue(m); | vm_page_dequeue(m); | ||||
vm_page_alloc_check(m); | vm_page_alloc_check(m); | ||||
/* | /* | ||||
* Initialize the page. Only the PG_ZERO flag is inherited. | * Initialize the page. Only the PG_ZERO flag is inherited. | ||||
*/ | */ | ||||
flags = 0; | |||||
if ((req & VM_ALLOC_ZERO) != 0) | if ((req & VM_ALLOC_ZERO) != 0) | ||||
flags = PG_ZERO; | flags |= (m->flags & PG_ZERO); | ||||
flags &= m->flags; | |||||
if ((req & VM_ALLOC_NODUMP) != 0) | if ((req & VM_ALLOC_NODUMP) != 0) | ||||
flags |= PG_NODUMP; | flags |= PG_NODUMP; | ||||
m->flags = flags; | m->flags = flags; | ||||
m->aflags = 0; | m->aflags = 0; | ||||
m->oflags = object == NULL || (object->flags & OBJ_UNMANAGED) != 0 ? | m->oflags = object == NULL || (object->flags & OBJ_UNMANAGED) != 0 ? | ||||
VPO_UNMANAGED : 0; | VPO_UNMANAGED : 0; | ||||
m->busy_lock = VPB_UNBUSIED; | m->busy_lock = VPB_UNBUSIED; | ||||
if ((req & (VM_ALLOC_NOBUSY | VM_ALLOC_NOOBJ | VM_ALLOC_SBUSY)) == 0) | if ((req & (VM_ALLOC_NOBUSY | VM_ALLOC_NOOBJ | VM_ALLOC_SBUSY)) == 0) | ||||
▲ Show 20 Lines • Show All 129 Lines • ▼ Show 20 Lines | if (object != NULL) { | ||||
KASSERT(mpred == NULL || mpred->pindex != pindex, | KASSERT(mpred == NULL || mpred->pindex != pindex, | ||||
("vm_page_alloc_contig: pindex already allocated")); | ("vm_page_alloc_contig: pindex already allocated")); | ||||
} | } | ||||
/* | /* | ||||
* Can we allocate the pages without the number of free pages falling | * Can we allocate the pages without the number of free pages falling | ||||
* below the lower bound for the allocation class? | * below the lower bound for the allocation class? | ||||
*/ | */ | ||||
m_ret = NULL; | |||||
again: | again: | ||||
#if VM_NRESERVLEVEL > 0 | #if VM_NRESERVLEVEL > 0 | ||||
/* | /* | ||||
* Can we allocate the pages from a reservation? | * Can we allocate the pages from a reservation? | ||||
*/ | */ | ||||
if (vm_object_reserv(object) && | if (vm_object_reserv(object) && | ||||
(m_ret = vm_reserv_alloc_contig(object, pindex, domain, req, | (m_ret = vm_reserv_alloc_contig(object, pindex, domain, req, | ||||
mpred, npages, low, high, alignment, boundary)) != NULL) { | mpred, npages, low, high, alignment, boundary)) != NULL) { | ||||
domain = vm_phys_domain(m_ret); | domain = vm_phys_domain(m_ret); | ||||
vmd = VM_DOMAIN(domain); | vmd = VM_DOMAIN(domain); | ||||
goto found; | goto found; | ||||
} | } | ||||
#endif | #endif | ||||
m_ret = NULL; | |||||
vmd = VM_DOMAIN(domain); | vmd = VM_DOMAIN(domain); | ||||
if (vm_domain_allocate(vmd, req, npages)) { | if (vm_domain_allocate(vmd, req, npages)) { | ||||
/* | /* | ||||
* allocate them from the free page queues. | * allocate them from the free page queues. | ||||
*/ | */ | ||||
vm_domain_free_lock(vmd); | vm_domain_free_lock(vmd); | ||||
m_ret = vm_phys_alloc_contig(domain, npages, low, high, | m_ret = vm_phys_alloc_contig(domain, npages, low, high, | ||||
alignment, boundary); | alignment, boundary); | ||||
▲ Show 20 Lines • Show All 1,458 Lines • ▼ Show 20 Lines | |||||
vm_page_free_toq(vm_page_t m) | vm_page_free_toq(vm_page_t m) | ||||
{ | { | ||||
struct vm_domain *vmd; | struct vm_domain *vmd; | ||||
if (!vm_page_free_prep(m)) | if (!vm_page_free_prep(m)) | ||||
return; | return; | ||||
vmd = vm_pagequeue_domain(m); | vmd = vm_pagequeue_domain(m); | ||||
if (m->pool == VM_FREEPOOL_DEFAULT && vmd->vmd_pgcache != NULL) { | if ((m->flags & PG_PCPU_CACHE) != 0 && vmd->vmd_pgcache != NULL) { | ||||
uma_zfree(vmd->vmd_pgcache, m); | uma_zfree(vmd->vmd_pgcache, m); | ||||
return; | return; | ||||
} | } | ||||
vm_domain_free_lock(vmd); | vm_domain_free_lock(vmd); | ||||
vm_phys_free_pages(m, 0); | vm_phys_free_pages(m, 0); | ||||
vm_domain_free_unlock(vmd); | vm_domain_free_unlock(vmd); | ||||
vm_domain_freecnt_inc(vmd, 1); | vm_domain_freecnt_inc(vmd, 1); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,014 Lines • Show Last 20 Lines |