Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/drm2/ttm/ttm_bo_vm.c
Show First 20 Lines • Show All 227 Lines • ▼ Show 20 Lines | if (unlikely(!m)) { | ||||
goto out_io_unlock; | goto out_io_unlock; | ||||
} | } | ||||
pmap_page_set_memattr(m, | pmap_page_set_memattr(m, | ||||
(bo->mem.placement & TTM_PL_FLAG_CACHED) ? | (bo->mem.placement & TTM_PL_FLAG_CACHED) ? | ||||
VM_MEMATTR_WRITE_BACK : ttm_io_prot(bo->mem.placement)); | VM_MEMATTR_WRITE_BACK : ttm_io_prot(bo->mem.placement)); | ||||
} | } | ||||
VM_OBJECT_WLOCK(vm_obj); | VM_OBJECT_WLOCK(vm_obj); | ||||
if (vm_page_busied(m)) { | if (vm_page_busy_acquire(m, VM_ALLOC_WAITFAIL) == 0) { | ||||
VM_OBJECT_WUNLOCK(vm_obj); | |||||
vm_page_busy_sleep(m, "ttmpbs", false); | |||||
VM_OBJECT_WLOCK(vm_obj); | |||||
ttm_mem_io_unlock(man); | ttm_mem_io_unlock(man); | ||||
ttm_bo_unreserve(bo); | ttm_bo_unreserve(bo); | ||||
goto retry; | goto retry; | ||||
} | } | ||||
m1 = vm_page_lookup(vm_obj, OFF_TO_IDX(offset)); | m1 = vm_page_lookup(vm_obj, OFF_TO_IDX(offset)); | ||||
if (m1 == NULL) { | if (m1 == NULL) { | ||||
if (vm_page_insert(m, vm_obj, OFF_TO_IDX(offset))) { | if (vm_page_insert(m, vm_obj, OFF_TO_IDX(offset))) { | ||||
vm_page_xunbusy(m); | |||||
VM_OBJECT_WUNLOCK(vm_obj); | VM_OBJECT_WUNLOCK(vm_obj); | ||||
vm_wait(vm_obj); | vm_wait(vm_obj); | ||||
VM_OBJECT_WLOCK(vm_obj); | VM_OBJECT_WLOCK(vm_obj); | ||||
ttm_mem_io_unlock(man); | ttm_mem_io_unlock(man); | ||||
ttm_bo_unreserve(bo); | ttm_bo_unreserve(bo); | ||||
goto retry; | goto retry; | ||||
} | } | ||||
} else { | } else { | ||||
KASSERT(m == m1, | KASSERT(m == m1, | ||||
("inconsistent insert bo %p m %p m1 %p offset %jx", | ("inconsistent insert bo %p m %p m1 %p offset %jx", | ||||
bo, m, m1, (uintmax_t)offset)); | bo, m, m1, (uintmax_t)offset)); | ||||
} | } | ||||
m->valid = VM_PAGE_BITS_ALL; | m->valid = VM_PAGE_BITS_ALL; | ||||
vm_page_xbusy(m); | |||||
if (*mres != NULL) { | if (*mres != NULL) { | ||||
KASSERT(*mres != m, ("losing %p %p", *mres, m)); | KASSERT(*mres != m, ("losing %p %p", *mres, m)); | ||||
vm_page_lock(*mres); | vm_page_lock(*mres); | ||||
vm_page_free(*mres); | vm_page_free(*mres); | ||||
vm_page_unlock(*mres); | vm_page_unlock(*mres); | ||||
} | } | ||||
*mres = m; | *mres = m; | ||||
▲ Show 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | if (vm_obj == NULL) | ||||
return; | return; | ||||
VM_OBJECT_WLOCK(vm_obj); | VM_OBJECT_WLOCK(vm_obj); | ||||
retry: | retry: | ||||
for (i = 0; i < bo->num_pages; i++) { | for (i = 0; i < bo->num_pages; i++) { | ||||
m = vm_page_lookup(vm_obj, i); | m = vm_page_lookup(vm_obj, i); | ||||
if (m == NULL) | if (m == NULL) | ||||
continue; | continue; | ||||
if (vm_page_sleep_if_busy(m, "ttm_unm")) | if (vm_page_busy_acquire(m, VM_ALLOC_WAITFAIL) == 0) | ||||
goto retry; | goto retry; | ||||
cdev_pager_free_page(vm_obj, m); | cdev_pager_free_page(vm_obj, m); | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(vm_obj); | VM_OBJECT_WUNLOCK(vm_obj); | ||||
vm_object_deallocate(vm_obj); | vm_object_deallocate(vm_obj); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 170 Lines • Show Last 20 Lines |