Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_shm.c
Show First 20 Lines • Show All 192 Lines • ▼ Show 20 Lines | uiomove_object_page(vm_object_t obj, size_t len, struct uio *uio) | ||||
* | * | ||||
* 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. | ||||
*/ | */ | ||||
rv = vm_page_grab_valid(&m, obj, idx, | rv = vm_page_grab_valid(&m, obj, idx, | ||||
VM_ALLOC_NORMAL | VM_ALLOC_WIRED | VM_ALLOC_NOBUSY); | VM_ALLOC_NORMAL | VM_ALLOC_SBUSY | VM_ALLOC_IGN_SBUSY); | ||||
if (rv != VM_PAGER_OK) { | if (rv != VM_PAGER_OK) { | ||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
printf("uiomove_object: vm_obj %p idx %jd pager error %d\n", | printf("uiomove_object: vm_obj %p idx %jd pager error %d\n", | ||||
obj, idx, rv); | obj, idx, rv); | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
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_page_set_dirty(m, false); | ||||
vm_page_dirty(m); | vm_page_aflag_set(m, PGA_REFERENCED); | ||||
vm_pager_page_unswapped(m); | vm_page_sunbusy(m); | ||||
VM_OBJECT_WUNLOCK(obj); | |||||
} | |||||
vm_page_unwire(m, PQ_ACTIVE); | |||||
return (error); | return (error); | ||||
} | } | ||||
int | int | ||||
uiomove_object(vm_object_t obj, off_t obj_size, struct uio *uio) | uiomove_object(vm_object_t obj, off_t obj_size, struct uio *uio) | ||||
{ | { | ||||
ssize_t resid; | ssize_t resid; | ||||
▲ Show 20 Lines • Show All 299 Lines • ▼ Show 20 Lines | retry: | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
} | } | ||||
if (m != NULL) { | if (m != NULL) { | ||||
pmap_zero_page_area(m, base, PAGE_SIZE - base); | pmap_zero_page_area(m, base, PAGE_SIZE - base); | ||||
KASSERT(vm_page_all_valid(m), | KASSERT(vm_page_all_valid(m), | ||||
("shm_dotruncate: page %p is invalid", m)); | ("shm_dotruncate: page %p is invalid", m)); | ||||
vm_page_dirty(m); | vm_page_set_dirty(m, true); | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
vm_pager_page_unswapped(m); | |||||
} | } | ||||
} | } | ||||
delta = IDX_TO_OFF(object->size - nobjsize); | delta = IDX_TO_OFF(object->size - nobjsize); | ||||
/* Toss in memory pages. */ | /* Toss in memory pages. */ | ||||
if (nobjsize < object->size) | if (nobjsize < object->size) | ||||
vm_object_page_remove(object, nobjsize, object->size, | vm_object_page_remove(object, nobjsize, object->size, | ||||
0); | 0); | ||||
▲ Show 20 Lines • Show All 967 Lines • Show Last 20 Lines |