diff options
author | monk.liu <monk.liu@amd.com> | 2015-04-30 15:23:04 +0800 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-05-04 16:53:42 -0400 |
commit | 8574b4b73fc2ab57a2ddb4ac5eb162eb5e2dcb1d (patch) | |
tree | 60d288684588aac6ab68a5b6a185b9a9313bf296 | |
parent | c381ea89718f159553c19c253bd730bd091c1d87 (diff) |
drm/amdgpu: fix userptr BO unpin bugamdgpu-upstream-wip2
sg could point to array of contigiouse page*, only free page could lead
to memory leak.
Signed-off-by: monk.liu <monk.liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Jammy Zhou <jammy.zhou@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 120e6e7c4647..8e60218e8d4d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -570,13 +570,18 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) dma_unmap_sg(adev->dev, ttm->sg->sgl, ttm->sg->nents, direction); for_each_sg(ttm->sg->sgl, sg, ttm->sg->nents, i) { + int len = sg->length >> PAGE_SHIFT; struct page *page = sg_page(sg); + while (len > 0) { + if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) + set_page_dirty(page); - if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) - set_page_dirty(page); + mark_page_accessed(page); + page_cache_release(page); - mark_page_accessed(page); - page_cache_release(page); + page++; + len--; + } } sg_free_table(ttm->sg); |