Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_glue.c
Show First 20 Lines • Show All 233 Lines • ▼ Show 20 Lines | vm_imgact_hold_page(vm_object_t object, vm_ooffset_t offset) | ||||
vm_pindex_t pindex; | vm_pindex_t pindex; | ||||
int rv; | int rv; | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
pindex = OFF_TO_IDX(offset); | pindex = OFF_TO_IDX(offset); | ||||
m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY); | m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY); | ||||
if (m->valid != VM_PAGE_BITS_ALL) { | if (m->valid != VM_PAGE_BITS_ALL) { | ||||
vm_page_xbusy(m); | vm_page_xbusy(m); | ||||
rv = vm_pager_get_pages(object, &m, 1, NULL, NULL); | rv = vm_pager_get_pages(object, &m, 1, VM_PROT_ALL, NULL, NULL); | ||||
if (rv != VM_PAGER_OK) { | if (rv != VM_PAGER_OK) { | ||||
vm_page_lock(m); | vm_page_lock(m); | ||||
vm_page_free(m); | vm_page_free(m); | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
m = NULL; | m = NULL; | ||||
goto out; | goto out; | ||||
} | } | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
▲ Show 20 Lines • Show All 336 Lines • ▼ Show 20 Lines | for (int i = 0; i < pages;) { | ||||
} | } | ||||
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 (ma[j]->valid == VM_PAGE_BITS_ALL) | if (ma[j]->valid == VM_PAGE_BITS_ALL) | ||||
break; | break; | ||||
rv = vm_pager_has_page(ksobj, ma[i]->pindex, NULL, &a); | rv = vm_pager_has_page(ksobj, ma[i]->pindex, NULL, &a); | ||||
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, VM_PROT_ALL, | ||||
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); | VM_OBJECT_WUNLOCK(ksobj); | ||||
▲ Show 20 Lines • Show All 500 Lines • Show Last 20 Lines |