|
@@ -664,6 +664,18 @@ release_pages:
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
+void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages)
|
|
|
+{
|
|
|
+ unsigned i;
|
|
|
+
|
|
|
+ for (i = 0; i < ttm->num_pages; ++i) {
|
|
|
+ if (ttm->pages[i])
|
|
|
+ put_page(ttm->pages[i]);
|
|
|
+
|
|
|
+ ttm->pages[i] = pages ? pages[i] : NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void amdgpu_trace_dma_map(struct ttm_tt *ttm)
|
|
|
{
|
|
|
struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
|
|
@@ -738,7 +750,6 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
|
|
|
set_page_dirty(page);
|
|
|
|
|
|
mark_page_accessed(page);
|
|
|
- put_page(page);
|
|
|
}
|
|
|
|
|
|
amdgpu_trace_dma_unmap(ttm);
|
|
@@ -971,6 +982,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
|
|
|
bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
|
|
|
|
|
|
if (gtt && gtt->userptr) {
|
|
|
+ amdgpu_ttm_tt_set_user_pages(ttm, NULL);
|
|
|
kfree(ttm->sg);
|
|
|
ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
|
|
|
return;
|