Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_shm.c
Show First 20 Lines • Show All 182 Lines • ▼ Show 20 Lines | uiomove_object_page(vm_object_t obj, size_t len, struct uio *uio) | ||||
* by exclusive busy. | * by exclusive busy. | ||||
* | * | ||||
* Although the tmpfs vnode lock is held here, it is | * Although the tmpfs vnode lock is held here, it is | ||||
* 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 | VM_ALLOC_NOBUSY); | rv = vm_page_grab_valid(&m, obj, idx, | ||||
if (m->valid != VM_PAGE_BITS_ALL) { | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY); | ||||
vm_page_xbusy(m); | |||||
if (vm_pager_has_page(obj, idx, NULL, NULL)) { | |||||
rv = vm_pager_get_pages(obj, &m, 1, NULL, NULL); | |||||
if (rv != VM_PAGER_OK) { | if (rv != VM_PAGER_OK) { | ||||
printf( | |||||
"uiomove_object: vm_obj %p idx %jd valid %x pager error %d\n", | |||||
obj, idx, m->valid, rv); | |||||
vm_page_lock(m); | |||||
vm_page_free(m); | |||||
vm_page_unlock(m); | |||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
printf("uiomove_object: vm_obj %p idx %jd pager error %d\n", | |||||
obj, idx, rv); | |||||
kib: Since you are changing the line, idx needs uintmax_t cast. | |||||
return (EIO); | return (EIO); | ||||
} | |||||
} else | |||||
vm_page_zero_invalid(m, TRUE); | |||||
vm_page_xunbusy(m); | |||||
} | } | ||||
vm_page_lock(m); | vm_page_lock(m); | ||||
vm_page_wire(m); | vm_page_wire(m); | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
alcUnsubmitted Not Done Inline ActionsWhy not replace this with VM_ALLOC_WIRED? alc: Why not replace this with VM_ALLOC_WIRED? | |||||
jeffAuthorUnsubmitted Done Inline Actionshttps://github.com/freebsd/freebsd/commit/21b376e179c036c9127f4a6cd977a5f60376ac61 It should be in this instance. But in a future patch, after I can protect valid/dirty with sbusy, I eliminate the wiring entirely. jeff: https://github.com/freebsd/freebsd/commit/21b376e179c036c9127f4a6cd977a5f60376ac61
It should… | |||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
error = uiomove_fromphys(&m, offset, tlen, uio); | error = uiomove_fromphys(&m, offset, tlen, uio); | ||||
if (uio->uio_rw == UIO_WRITE && error == 0) { | if (uio->uio_rw == UIO_WRITE && error == 0) { | ||||
VM_OBJECT_WLOCK(obj); | VM_OBJECT_WLOCK(obj); | ||||
vm_page_dirty(m); | vm_page_dirty(m); | ||||
vm_pager_page_unswapped(m); | vm_pager_page_unswapped(m); | ||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 969 Lines • Show Last 20 Lines |
Since you are changing the line, idx needs uintmax_t cast.