Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/drm2/ttm/ttm_tt.c
Show First 20 Lines • Show All 282 Lines • ▼ Show 20 Lines | int ttm_tt_swapin(struct ttm_tt *ttm) | ||||
vm_page_t from_page, to_page; | vm_page_t from_page, to_page; | ||||
int i, ret, rv; | int i, ret, rv; | ||||
obj = ttm->swap_storage; | obj = ttm->swap_storage; | ||||
VM_OBJECT_WLOCK(obj); | VM_OBJECT_WLOCK(obj); | ||||
vm_object_pip_add(obj, 1); | vm_object_pip_add(obj, 1); | ||||
for (i = 0; i < ttm->num_pages; ++i) { | for (i = 0; i < ttm->num_pages; ++i) { | ||||
from_page = vm_page_grab(obj, i, VM_ALLOC_NORMAL); | rv = vm_page_grab_valid(&from_page, obj, i, | ||||
if (from_page->valid != VM_PAGE_BITS_ALL) { | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY); | ||||
if (vm_pager_has_page(obj, i, NULL, NULL)) { | |||||
rv = vm_pager_get_pages(obj, &from_page, 1, | |||||
NULL, NULL); | |||||
if (rv != VM_PAGER_OK) { | if (rv != VM_PAGER_OK) { | ||||
vm_page_lock(from_page); | |||||
vm_page_free(from_page); | |||||
vm_page_unlock(from_page); | |||||
ret = -EIO; | ret = -EIO; | ||||
goto err_ret; | goto err_ret; | ||||
} | } | ||||
} else | |||||
vm_page_zero_invalid(from_page, TRUE); | |||||
} | |||||
vm_page_xunbusy(from_page); | |||||
to_page = ttm->pages[i]; | to_page = ttm->pages[i]; | ||||
if (unlikely(to_page == NULL)) { | if (unlikely(to_page == NULL)) { | ||||
ret = -ENOMEM; | ret = -ENOMEM; | ||||
goto err_ret; | goto err_ret; | ||||
} | } | ||||
pmap_copy_page(from_page, to_page); | pmap_copy_page(from_page, to_page); | ||||
} | } | ||||
vm_object_pip_wakeup(obj); | vm_object_pip_wakeup(obj); | ||||
▲ Show 20 Lines • Show All 56 Lines • Show Last 20 Lines |