Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_bio.c
Show First 20 Lines • Show All 2,930 Lines • ▼ Show 20 Lines | for (i = 0; i < bp->b_npages; i++) { | ||||
m = bp->b_pages[i]; | m = bp->b_pages[i]; | ||||
if (m == bogus_page) | if (m == bogus_page) | ||||
panic("vfs_vmio_invalidate: Unexpected bogus page."); | panic("vfs_vmio_invalidate: Unexpected bogus page."); | ||||
bp->b_pages[i] = NULL; | bp->b_pages[i] = NULL; | ||||
presid = resid > (PAGE_SIZE - poffset) ? | presid = resid > (PAGE_SIZE - poffset) ? | ||||
(PAGE_SIZE - poffset) : resid; | (PAGE_SIZE - poffset) : resid; | ||||
KASSERT(presid >= 0, ("brelse: extra page")); | KASSERT(presid >= 0, ("brelse: extra page")); | ||||
while (vm_page_xbusied(m)) { | while (vm_page_xbusied(m)) | ||||
vm_page_lock(m); | vm_page_sleep_if_xbusy(m, "mbncsh"); | ||||
VM_OBJECT_WUNLOCK(obj); | |||||
vm_page_busy_sleep(m, "mbncsh", true); | |||||
VM_OBJECT_WLOCK(obj); | |||||
} | |||||
if (pmap_page_wired_mappings(m) == 0) | if (pmap_page_wired_mappings(m) == 0) | ||||
vm_page_set_invalid(m, poffset, presid); | vm_page_set_invalid(m, poffset, presid); | ||||
vm_page_release_locked(m, flags); | vm_page_release_locked(m, flags); | ||||
resid -= presid; | resid -= presid; | ||||
poffset = 0; | poffset = 0; | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(obj); | VM_OBJECT_WUNLOCK(obj); | ||||
bp->b_npages = 0; | bp->b_npages = 0; | ||||
▲ Show 20 Lines • Show All 1,617 Lines • ▼ Show 20 Lines | vfs_drain_busy_pages(struct buf *bp) | ||||
VM_OBJECT_ASSERT_WLOCKED(bp->b_bufobj->bo_object); | VM_OBJECT_ASSERT_WLOCKED(bp->b_bufobj->bo_object); | ||||
last_busied = 0; | last_busied = 0; | ||||
for (i = 0; i < bp->b_npages; i++) { | for (i = 0; i < bp->b_npages; i++) { | ||||
m = bp->b_pages[i]; | m = bp->b_pages[i]; | ||||
if (vm_page_xbusied(m)) { | if (vm_page_xbusied(m)) { | ||||
for (; last_busied < i; last_busied++) | for (; last_busied < i; last_busied++) | ||||
vm_page_sbusy(bp->b_pages[last_busied]); | vm_page_sbusy(bp->b_pages[last_busied]); | ||||
while (vm_page_xbusied(m)) { | while (vm_page_xbusied(m)) { | ||||
vm_page_lock(m); | vm_page_sleep_if_xbusy(m, "vbpage"); | ||||
VM_OBJECT_WUNLOCK(bp->b_bufobj->bo_object); | |||||
vm_page_busy_sleep(m, "vbpage", true); | |||||
VM_OBJECT_WLOCK(bp->b_bufobj->bo_object); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
for (i = 0; i < last_busied; i++) | for (i = 0; i < last_busied; i++) | ||||
vm_page_sunbusy(bp->b_pages[i]); | vm_page_sunbusy(bp->b_pages[i]); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 879 Lines • Show Last 20 Lines |