Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_page.c
Show First 20 Lines • Show All 2,397 Lines • ▼ Show 20 Lines | #if VM_NRESERVLEVEL > 0 | ||||
(level = vm_reserv_level_iffullpop(m)) >= 0) { | (level = vm_reserv_level_iffullpop(m)) >= 0) { | ||||
run_ext = 0; | run_ext = 0; | ||||
/* Advance to the end of the superpage. */ | /* Advance to the end of the superpage. */ | ||||
pa = VM_PAGE_TO_PHYS(m); | pa = VM_PAGE_TO_PHYS(m); | ||||
m_inc = atop(roundup2(pa + 1, | m_inc = atop(roundup2(pa + 1, | ||||
vm_reserv_size(level)) - pa); | vm_reserv_size(level)) - pa); | ||||
#endif | #endif | ||||
} else if (object->memattr == VM_MEMATTR_DEFAULT && | } else if (object->memattr == VM_MEMATTR_DEFAULT && | ||||
vm_page_enqueued(m) && !vm_page_busied(m)) { | vm_page_queue(m) != PQ_NONE && !vm_page_busied(m)) { | ||||
/* | /* | ||||
* The page is allocated but eligible for | * The page is allocated but eligible for | ||||
* relocation. Extend the current run by one | * relocation. Extend the current run by one | ||||
* page. | * page. | ||||
*/ | */ | ||||
KASSERT(pmap_page_get_memattr(m) == | KASSERT(pmap_page_get_memattr(m) == | ||||
VM_MEMATTR_DEFAULT, | VM_MEMATTR_DEFAULT, | ||||
("page %p has an unexpected memattr", m)); | ("page %p has an unexpected memattr", m)); | ||||
▲ Show 20 Lines • Show All 134 Lines • ▼ Show 20 Lines | else if ((object = m->object) != NULL) { | ||||
("page %p is PG_UNHOLDFREE", m)); | ("page %p is PG_UNHOLDFREE", m)); | ||||
/* Don't care: PG_NODUMP, PG_ZERO. */ | /* Don't care: PG_NODUMP, PG_ZERO. */ | ||||
if (object->type != OBJT_DEFAULT && | if (object->type != OBJT_DEFAULT && | ||||
object->type != OBJT_SWAP && | object->type != OBJT_SWAP && | ||||
object->type != OBJT_VNODE) | object->type != OBJT_VNODE) | ||||
error = EINVAL; | error = EINVAL; | ||||
else if (object->memattr != VM_MEMATTR_DEFAULT) | else if (object->memattr != VM_MEMATTR_DEFAULT) | ||||
error = EINVAL; | error = EINVAL; | ||||
else if (vm_page_enqueued(m) && !vm_page_busied(m)) { | else if (vm_page_queue(m) != PQ_NONE && | ||||
!vm_page_busied(m)) { | |||||
KASSERT(pmap_page_get_memattr(m) == | KASSERT(pmap_page_get_memattr(m) == | ||||
VM_MEMATTR_DEFAULT, | VM_MEMATTR_DEFAULT, | ||||
("page %p has an unexpected memattr", m)); | ("page %p has an unexpected memattr", m)); | ||||
KASSERT((m->oflags & (VPO_SWAPINPROG | | KASSERT((m->oflags & (VPO_SWAPINPROG | | ||||
VPO_SWAPSLEEP | VPO_UNMANAGED)) == 0, | VPO_SWAPSLEEP | VPO_UNMANAGED)) == 0, | ||||
("page %p has unexpected oflags", m)); | ("page %p has unexpected oflags", m)); | ||||
/* Don't care: VPO_NOSYNC. */ | /* Don't care: VPO_NOSYNC. */ | ||||
if (m->valid != 0) { | if (m->valid != 0) { | ||||
▲ Show 20 Lines • Show All 820 Lines • ▼ Show 20 Lines | |||||
* | * | ||||
* The page must be locked. | * The page must be locked. | ||||
*/ | */ | ||||
void | void | ||||
vm_page_activate(vm_page_t m) | vm_page_activate(vm_page_t m) | ||||
{ | { | ||||
int queue; | int queue; | ||||
vm_page_lock_assert(m, MA_OWNED); | vm_page_assert_locked(m); | ||||
if ((queue = m->queue) == PQ_ACTIVE || m->wire_count > 0 || | if ((queue = vm_page_queue(m)) == PQ_ACTIVE || m->wire_count > 0 || | ||||
(m->oflags & VPO_UNMANAGED) != 0) { | (m->oflags & VPO_UNMANAGED) != 0) { | ||||
if (queue == PQ_ACTIVE && m->act_count < ACT_INIT) | if (queue == PQ_ACTIVE && m->act_count < ACT_INIT) | ||||
m->act_count = ACT_INIT; | m->act_count = ACT_INIT; | ||||
return; | return; | ||||
} | } | ||||
vm_page_remque(m); | vm_page_remque(m); | ||||
if (m->act_count < ACT_INIT) | if (m->act_count < ACT_INIT) | ||||
▲ Show 20 Lines • Show All 200 Lines • ▼ Show 20 Lines | KASSERT(queue < PQ_COUNT || queue == PQ_NONE, | ||||
queue, m)); | queue, m)); | ||||
if ((m->oflags & VPO_UNMANAGED) == 0) | if ((m->oflags & VPO_UNMANAGED) == 0) | ||||
vm_page_assert_locked(m); | vm_page_assert_locked(m); | ||||
unwired = vm_page_unwire_noq(m); | unwired = vm_page_unwire_noq(m); | ||||
if (!unwired || (m->oflags & VPO_UNMANAGED) != 0 || m->object == NULL) | if (!unwired || (m->oflags & VPO_UNMANAGED) != 0 || m->object == NULL) | ||||
return (unwired); | return (unwired); | ||||
if (m->queue == queue) { | if (vm_page_queue(m) == queue) { | ||||
if (queue == PQ_ACTIVE) | if (queue == PQ_ACTIVE) | ||||
vm_page_reference(m); | vm_page_reference(m); | ||||
else if (queue != PQ_NONE) | else if (queue != PQ_NONE) | ||||
vm_page_requeue(m); | vm_page_requeue(m); | ||||
} else { | } else { | ||||
vm_page_dequeue(m); | vm_page_dequeue(m); | ||||
if (queue != PQ_NONE) { | if (queue != PQ_NONE) { | ||||
vm_page_enqueue(m, queue); | vm_page_enqueue(m, queue); | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | |||||
void | void | ||||
vm_page_launder(vm_page_t m) | vm_page_launder(vm_page_t m) | ||||
{ | { | ||||
vm_page_assert_locked(m); | vm_page_assert_locked(m); | ||||
if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0) | if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0) | ||||
return; | return; | ||||
if (m->queue == PQ_LAUNDRY) | if (vm_page_in_laundry(m)) | ||||
vm_page_requeue(m); | vm_page_requeue(m); | ||||
else { | else { | ||||
vm_page_remque(m); | vm_page_remque(m); | ||||
vm_page_enqueue(m, PQ_LAUNDRY); | vm_page_enqueue(m, PQ_LAUNDRY); | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 774 Lines • Show Last 20 Lines |