Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_page.c
Show First 20 Lines • Show All 1,582 Lines • ▼ Show 20 Lines | |||||
* page index, or NULL if no such page exists. | * page index, or NULL if no such page exists. | ||||
*/ | */ | ||||
vm_page_t | vm_page_t | ||||
vm_page_alloc_after(vm_object_t object, vm_pindex_t pindex, int req, | vm_page_alloc_after(vm_object_t object, vm_pindex_t pindex, int req, | ||||
vm_page_t mpred) | vm_page_t mpred) | ||||
{ | { | ||||
vm_page_t m; | vm_page_t m; | ||||
int flags, req_class; | int flags, req_class; | ||||
u_int free_count; | |||||
KASSERT((object != NULL) == ((req & VM_ALLOC_NOOBJ) == 0) && | KASSERT((object != NULL) == ((req & VM_ALLOC_NOOBJ) == 0) && | ||||
(object != NULL || (req & VM_ALLOC_SBUSY) == 0) && | (object != NULL || (req & VM_ALLOC_SBUSY) == 0) && | ||||
((req & (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)) != | ((req & (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)) != | ||||
(VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)), | (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)), | ||||
("inconsistent object(%p)/req(%x)", object, req)); | ("inconsistent object(%p)/req(%x)", object, req)); | ||||
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, | ||||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | #endif | ||||
pagedaemon_wakeup(); | pagedaemon_wakeup(); | ||||
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")); | KASSERT(m != NULL, ("missing page")); | ||||
vm_phys_freecnt_adj(m, -1); | free_count = vm_phys_freecnt_adj(m, -1); | ||||
mtx_unlock(&vm_page_queue_free_mtx); | mtx_unlock(&vm_page_queue_free_mtx); | ||||
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; | flags = 0; | ||||
if ((req & VM_ALLOC_ZERO) != 0) | if ((req & VM_ALLOC_ZERO) != 0) | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | if (object->memattr != VM_MEMATTR_DEFAULT && | ||||
pmap_page_set_memattr(m, object->memattr); | pmap_page_set_memattr(m, object->memattr); | ||||
} else | } else | ||||
m->pindex = pindex; | m->pindex = pindex; | ||||
/* | /* | ||||
* Don't wakeup too often - wakeup the pageout daemon when | * Don't wakeup too often - wakeup the pageout daemon when | ||||
* we would be nearly out of memory. | * we would be nearly out of memory. | ||||
*/ | */ | ||||
if (vm_paging_needed()) | if (vm_paging_needed(free_count)) | ||||
pagedaemon_wakeup(); | pagedaemon_wakeup(); | ||||
return (m); | return (m); | ||||
} | } | ||||
/* | /* | ||||
* vm_page_alloc_contig: | * vm_page_alloc_contig: | ||||
* | * | ||||
▲ Show 20 Lines • Show All 169 Lines • ▼ Show 20 Lines | if (object != NULL) { | ||||
} | } | ||||
mpred = m; | mpred = m; | ||||
} else | } else | ||||
m->pindex = pindex; | m->pindex = pindex; | ||||
if (memattr != VM_MEMATTR_DEFAULT) | if (memattr != VM_MEMATTR_DEFAULT) | ||||
pmap_page_set_memattr(m, memattr); | pmap_page_set_memattr(m, memattr); | ||||
pindex++; | pindex++; | ||||
} | } | ||||
if (vm_paging_needed()) | if (vm_paging_needed(vm_cnt.v_free_count)) | ||||
pagedaemon_wakeup(); | pagedaemon_wakeup(); | ||||
return (m_ret); | return (m_ret); | ||||
} | } | ||||
/* | /* | ||||
* Check a page that has been freshly dequeued from a freelist. | * Check a page that has been freshly dequeued from a freelist. | ||||
*/ | */ | ||||
static void | static void | ||||
Show All 32 Lines | |||||
* VM_ALLOC_ZERO prefer a zeroed page | * VM_ALLOC_ZERO prefer a zeroed page | ||||
* | * | ||||
* This routine may not sleep. | * This routine may not sleep. | ||||
*/ | */ | ||||
vm_page_t | vm_page_t | ||||
vm_page_alloc_freelist(int flind, int req) | vm_page_alloc_freelist(int flind, int req) | ||||
{ | { | ||||
vm_page_t m; | vm_page_t m; | ||||
u_int flags; | u_int flags, free_count; | ||||
int req_class; | int req_class; | ||||
req_class = req & VM_ALLOC_CLASS_MASK; | req_class = req & VM_ALLOC_CLASS_MASK; | ||||
/* | /* | ||||
* The page daemon is allowed to dig deeper into the free page list. | * The page daemon is allowed to dig deeper into the free page list. | ||||
*/ | */ | ||||
if (curproc == pageproc && req_class != VM_ALLOC_INTERRUPT) | if (curproc == pageproc && req_class != VM_ALLOC_INTERRUPT) | ||||
Show All 15 Lines | atomic_add_int(&vm_pageout_deficit, | ||||
max((u_int)req >> VM_ALLOC_COUNT_SHIFT, 1)); | max((u_int)req >> VM_ALLOC_COUNT_SHIFT, 1)); | ||||
pagedaemon_wakeup(); | pagedaemon_wakeup(); | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
if (m == NULL) { | if (m == NULL) { | ||||
mtx_unlock(&vm_page_queue_free_mtx); | mtx_unlock(&vm_page_queue_free_mtx); | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
vm_phys_freecnt_adj(m, -1); | free_count = vm_phys_freecnt_adj(m, -1); | ||||
mtx_unlock(&vm_page_queue_free_mtx); | mtx_unlock(&vm_page_queue_free_mtx); | ||||
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. | ||||
*/ | */ | ||||
m->aflags = 0; | m->aflags = 0; | ||||
flags = 0; | flags = 0; | ||||
if ((req & VM_ALLOC_ZERO) != 0) | if ((req & VM_ALLOC_ZERO) != 0) | ||||
flags = PG_ZERO; | flags = PG_ZERO; | ||||
m->flags &= flags; | m->flags &= flags; | ||||
if ((req & VM_ALLOC_WIRED) != 0) { | if ((req & VM_ALLOC_WIRED) != 0) { | ||||
/* | /* | ||||
* The page lock is not required for wiring a page that does | * The page lock is not required for wiring a page that does | ||||
* not belong to an object. | * not belong to an object. | ||||
*/ | */ | ||||
atomic_add_int(&vm_cnt.v_wire_count, 1); | atomic_add_int(&vm_cnt.v_wire_count, 1); | ||||
m->wire_count = 1; | m->wire_count = 1; | ||||
} | } | ||||
/* Unmanaged pages don't use "act_count". */ | /* Unmanaged pages don't use "act_count". */ | ||||
m->oflags = VPO_UNMANAGED; | m->oflags = VPO_UNMANAGED; | ||||
if (vm_paging_needed()) | if (vm_paging_needed(free_count)) | ||||
pagedaemon_wakeup(); | pagedaemon_wakeup(); | ||||
return (m); | return (m); | ||||
} | } | ||||
#define VPSC_ANY 0 /* No restrictions. */ | #define VPSC_ANY 0 /* No restrictions. */ | ||||
#define VPSC_NORESERV 1 /* Skip reservations; implies VPSC_NOSUPER. */ | #define VPSC_NORESERV 1 /* Skip reservations; implies VPSC_NOSUPER. */ | ||||
#define VPSC_NOSUPER 2 /* Skip superpages. */ | #define VPSC_NOSUPER 2 /* Skip superpages. */ | ||||
▲ Show 20 Lines • Show All 1,820 Lines • Show Last 20 Lines |