Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_swapout.c
Show First 20 Lines • Show All 554 Lines • ▼ Show 20 Lines | vm_thread_swapin(struct thread *td, int oom_alloc) | ||||
vm_page_t ma[KSTACK_MAX_PAGES]; | vm_page_t ma[KSTACK_MAX_PAGES]; | ||||
int a, count, i, j, pages, rv; | int a, count, i, j, pages, rv; | ||||
pages = td->td_kstack_pages; | pages = td->td_kstack_pages; | ||||
ksobj = td->td_kstack_obj; | ksobj = td->td_kstack_obj; | ||||
VM_OBJECT_WLOCK(ksobj); | VM_OBJECT_WLOCK(ksobj); | ||||
(void)vm_page_grab_pages(ksobj, 0, oom_alloc | VM_ALLOC_WIRED, ma, | (void)vm_page_grab_pages(ksobj, 0, oom_alloc | VM_ALLOC_WIRED, ma, | ||||
pages); | pages); | ||||
VM_OBJECT_WUNLOCK(ksobj); | |||||
for (i = 0; i < pages;) { | for (i = 0; i < pages;) { | ||||
vm_page_assert_xbusied(ma[i]); | vm_page_assert_xbusied(ma[i]); | ||||
if (vm_page_all_valid(ma[i])) { | if (vm_page_all_valid(ma[i])) { | ||||
vm_page_xunbusy(ma[i]); | vm_page_xunbusy(ma[i]); | ||||
i++; | i++; | ||||
continue; | continue; | ||||
} | } | ||||
vm_object_pip_add(ksobj, 1); | vm_object_pip_add(ksobj, 1); | ||||
for (j = i + 1; j < pages; j++) | for (j = i + 1; j < pages; j++) | ||||
if (vm_page_all_valid(ma[j])) | if (vm_page_all_valid(ma[j])) | ||||
break; | break; | ||||
VM_OBJECT_WLOCK(ksobj); | |||||
rv = vm_pager_has_page(ksobj, ma[i]->pindex, NULL, &a); | rv = vm_pager_has_page(ksobj, ma[i]->pindex, NULL, &a); | ||||
VM_OBJECT_WUNLOCK(ksobj); | |||||
KASSERT(rv == 1, ("%s: missing page %p", __func__, ma[i])); | KASSERT(rv == 1, ("%s: missing page %p", __func__, ma[i])); | ||||
count = min(a + 1, j - i); | count = min(a + 1, j - i); | ||||
rv = vm_pager_get_pages(ksobj, ma + i, count, NULL, NULL); | rv = vm_pager_get_pages(ksobj, ma + i, count, NULL, NULL); | ||||
KASSERT(rv == VM_PAGER_OK, ("%s: cannot get kstack for proc %d", | KASSERT(rv == VM_PAGER_OK, ("%s: cannot get kstack for proc %d", | ||||
__func__, td->td_proc->p_pid)); | __func__, td->td_proc->p_pid)); | ||||
vm_object_pip_wakeup(ksobj); | vm_object_pip_wakeup(ksobj); | ||||
for (j = i; j < i + count; j++) | for (j = i; j < i + count; j++) | ||||
vm_page_xunbusy(ma[j]); | vm_page_xunbusy(ma[j]); | ||||
i += count; | i += count; | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(ksobj); | |||||
pmap_qenter(td->td_kstack, ma, pages); | pmap_qenter(td->td_kstack, ma, pages); | ||||
cpu_thread_swapin(td); | cpu_thread_swapin(td); | ||||
} | } | ||||
void | void | ||||
faultin(struct proc *p) | faultin(struct proc *p) | ||||
{ | { | ||||
struct thread *td; | struct thread *td; | ||||
▲ Show 20 Lines • Show All 354 Lines • Show Last 20 Lines |