diff options
author | Christian König <christian.koenig@amd.com> | 2017-09-05 08:36:44 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-12 14:24:18 -0400 |
commit | 1b0c0f9dc5ca6c0c8be21eeac92c7aa77bbf1d33 (patch) | |
tree | 6fe97ca83570c4e9107f30e3a3dfaecbadbd2369 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |
parent | ca666a3c298f838346ccea46ff542c605e68deb5 (diff) |
drm/amdgpu: move userptr BOs to CPU domain during CS v2
Instead of moving them in the MMU notifier move them during CS.
v2: still mark pages as accessed/dirty
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> (v1)
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index e67785191032..fe887f361be8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -685,6 +685,24 @@ void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages) | |||
685 | } | 685 | } |
686 | } | 686 | } |
687 | 687 | ||
688 | void amdgpu_ttm_tt_mark_user_pages(struct ttm_tt *ttm) | ||
689 | { | ||
690 | struct amdgpu_ttm_tt *gtt = (void *)ttm; | ||
691 | unsigned i; | ||
692 | |||
693 | for (i = 0; i < ttm->num_pages; ++i) { | ||
694 | struct page *page = ttm->pages[i]; | ||
695 | |||
696 | if (!page) | ||
697 | continue; | ||
698 | |||
699 | if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) | ||
700 | set_page_dirty(page); | ||
701 | |||
702 | mark_page_accessed(page); | ||
703 | } | ||
704 | } | ||
705 | |||
688 | static void amdgpu_trace_dma_map(struct ttm_tt *ttm) | 706 | static void amdgpu_trace_dma_map(struct ttm_tt *ttm) |
689 | { | 707 | { |
690 | struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); | 708 | struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); |
@@ -740,7 +758,6 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) | |||
740 | { | 758 | { |
741 | struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); | 759 | struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); |
742 | struct amdgpu_ttm_tt *gtt = (void *)ttm; | 760 | struct amdgpu_ttm_tt *gtt = (void *)ttm; |
743 | struct sg_page_iter sg_iter; | ||
744 | 761 | ||
745 | int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY); | 762 | int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY); |
746 | enum dma_data_direction direction = write ? | 763 | enum dma_data_direction direction = write ? |
@@ -753,13 +770,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) | |||
753 | /* free the sg table and pages again */ | 770 | /* free the sg table and pages again */ |
754 | dma_unmap_sg(adev->dev, ttm->sg->sgl, ttm->sg->nents, direction); | 771 | dma_unmap_sg(adev->dev, ttm->sg->sgl, ttm->sg->nents, direction); |
755 | 772 | ||
756 | for_each_sg_page(ttm->sg->sgl, &sg_iter, ttm->sg->nents, 0) { | 773 | amdgpu_ttm_tt_mark_user_pages(ttm); |
757 | struct page *page = sg_page_iter_page(&sg_iter); | ||
758 | if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY)) | ||
759 | set_page_dirty(page); | ||
760 | |||
761 | mark_page_accessed(page); | ||
762 | } | ||
763 | 774 | ||
764 | amdgpu_trace_dma_unmap(ttm); | 775 | amdgpu_trace_dma_unmap(ttm); |
765 | 776 | ||