Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_shm.c
Show First 20 Lines • Show All 179 Lines • ▼ Show 20 Lines | uiomove_object_page(vm_object_t obj, size_t len, struct uio *uio) | ||||
* nonetheless safe to sleep waiting for a free page. The | * nonetheless safe to sleep waiting for a free page. The | ||||
* pageout daemon does not need to acquire the tmpfs vnode | * pageout daemon does not need to acquire the tmpfs vnode | ||||
* lock to page out tobj's pages because tobj is a OBJT_SWAP | * lock to page out tobj's pages because tobj is a OBJT_SWAP | ||||
* type object. | * type object. | ||||
*/ | */ | ||||
m = vm_page_grab(obj, idx, VM_ALLOC_NORMAL); | m = vm_page_grab(obj, idx, VM_ALLOC_NORMAL); | ||||
if (m->valid != VM_PAGE_BITS_ALL) { | if (m->valid != VM_PAGE_BITS_ALL) { | ||||
if (vm_pager_has_page(obj, idx, NULL, NULL)) { | if (vm_pager_has_page(obj, idx, NULL, NULL)) { | ||||
rv = vm_pager_get_pages(obj, &m, 1, NULL, NULL); | rv = vm_pager_get_pages(obj, &m, 1, NULL, NULL, VM_PROT_READ|VM_PROT_WRITE); | ||||
if (rv != VM_PAGER_OK) { | if (rv != VM_PAGER_OK) { | ||||
printf( | printf( | ||||
"uiomove_object: vm_obj %p idx %jd valid %x pager error %d\n", | "uiomove_object: vm_obj %p idx %jd valid %x pager error %d\n", | ||||
obj, idx, m->valid, rv); | obj, idx, m->valid, rv); | ||||
vm_page_lock(m); | vm_page_lock(m); | ||||
vm_page_free(m); | vm_page_free(m); | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
▲ Show 20 Lines • Show All 254 Lines • ▼ Show 20 Lines | retry: | ||||
m = vm_page_alloc(object, idx, VM_ALLOC_NORMAL); | m = vm_page_alloc(object, idx, VM_ALLOC_NORMAL); | ||||
if (m == NULL) { | if (m == NULL) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
VM_WAIT; | VM_WAIT; | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
goto retry; | goto retry; | ||||
} else if (m->valid != VM_PAGE_BITS_ALL) | } else if (m->valid != VM_PAGE_BITS_ALL) | ||||
rv = vm_pager_get_pages(object, &m, 1, | rv = vm_pager_get_pages(object, &m, 1, | ||||
NULL, NULL); | NULL, NULL, VM_PROT_READ|VM_PROT_WRITE); | ||||
else | else | ||||
/* A cached page was reactivated. */ | /* A cached page was reactivated. */ | ||||
rv = VM_PAGER_OK; | rv = VM_PAGER_OK; | ||||
vm_page_lock(m); | vm_page_lock(m); | ||||
if (rv == VM_PAGER_OK) { | if (rv == VM_PAGER_OK) { | ||||
vm_page_deactivate(m); | vm_page_deactivate(m); | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
▲ Show 20 Lines • Show All 639 Lines • Show Last 20 Lines |