Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_shm.c
Show First 20 Lines • Show All 453 Lines • ▼ Show 20 Lines | if (length < shmfd->shm_size) { | ||||
* Zero the truncated part of the last page. | * Zero the truncated part of the last page. | ||||
*/ | */ | ||||
base = length & PAGE_MASK; | base = length & PAGE_MASK; | ||||
if (base != 0) { | if (base != 0) { | ||||
idx = OFF_TO_IDX(length); | idx = OFF_TO_IDX(length); | ||||
retry: | retry: | ||||
m = vm_page_grab(object, idx, VM_ALLOC_NOCREAT); | m = vm_page_grab(object, idx, VM_ALLOC_NOCREAT); | ||||
if (m != NULL) { | if (m != NULL) { | ||||
MPASS(m->valid == VM_PAGE_BITS_ALL); | MPASS(vm_page_all_valid(m)); | ||||
} else if (vm_pager_has_page(object, idx, NULL, NULL)) { | } else if (vm_pager_has_page(object, idx, NULL, NULL)) { | ||||
m = vm_page_alloc(object, idx, | m = vm_page_alloc(object, idx, | ||||
VM_ALLOC_NORMAL | VM_ALLOC_WAITFAIL); | VM_ALLOC_NORMAL | VM_ALLOC_WAITFAIL); | ||||
if (m == NULL) | if (m == NULL) | ||||
goto retry; | goto retry; | ||||
rv = vm_pager_get_pages(object, &m, 1, NULL, | rv = vm_pager_get_pages(object, &m, 1, NULL, | ||||
NULL); | NULL); | ||||
if (rv == VM_PAGER_OK) { | if (rv == VM_PAGER_OK) { | ||||
Show All 9 Lines | retry: | ||||
} else { | } else { | ||||
vm_page_free(m); | vm_page_free(m); | ||||
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(m->valid == VM_PAGE_BITS_ALL, | 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_dirty(m); | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
vm_pager_page_unswapped(m); | vm_pager_page_unswapped(m); | ||||
} | } | ||||
} | } | ||||
delta = IDX_TO_OFF(object->size - nobjsize); | delta = IDX_TO_OFF(object->size - nobjsize); | ||||
▲ Show 20 Lines • Show All 1,009 Lines • Show Last 20 Lines |