aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-09-05 08:30:05 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-12 14:24:09 -0400
commitca666a3c298f838346ccea46ff542c605e68deb5 (patch)
tree7ac2c1cecaaf8c52a94439604d942f6001af0cd2 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
parentb72cf4fca2bb786e20864b5e8755105aa9626fb4 (diff)
drm/amdgpu: stop using BO status for user pages
Instead use a counter to figure out if we need to set new pages or not. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> 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.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index ea0378c8b049..e67785191032 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -609,6 +609,7 @@ struct amdgpu_ttm_tt {
609 spinlock_t guptasklock; 609 spinlock_t guptasklock;
610 struct list_head guptasks; 610 struct list_head guptasks;
611 atomic_t mmu_invalidations; 611 atomic_t mmu_invalidations;
612 uint32_t last_set_pages;
612 struct list_head list; 613 struct list_head list;
613}; 614};
614 615
@@ -672,8 +673,10 @@ release_pages:
672 673
673void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages) 674void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages)
674{ 675{
676 struct amdgpu_ttm_tt *gtt = (void *)ttm;
675 unsigned i; 677 unsigned i;
676 678
679 gtt->last_set_pages = atomic_read(&gtt->mmu_invalidations);
677 for (i = 0; i < ttm->num_pages; ++i) { 680 for (i = 0; i < ttm->num_pages; ++i) {
678 if (ttm->pages[i]) 681 if (ttm->pages[i])
679 put_page(ttm->pages[i]); 682 put_page(ttm->pages[i]);
@@ -1025,6 +1028,7 @@ int amdgpu_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr,
1025 spin_lock_init(&gtt->guptasklock); 1028 spin_lock_init(&gtt->guptasklock);
1026 INIT_LIST_HEAD(&gtt->guptasks); 1029 INIT_LIST_HEAD(&gtt->guptasks);
1027 atomic_set(&gtt->mmu_invalidations, 0); 1030 atomic_set(&gtt->mmu_invalidations, 0);
1031 gtt->last_set_pages = 0;
1028 1032
1029 return 0; 1033 return 0;
1030} 1034}
@@ -1077,6 +1081,16 @@ bool amdgpu_ttm_tt_userptr_invalidated(struct ttm_tt *ttm,
1077 return prev_invalidated != *last_invalidated; 1081 return prev_invalidated != *last_invalidated;
1078} 1082}
1079 1083
1084bool amdgpu_ttm_tt_userptr_needs_pages(struct ttm_tt *ttm)
1085{
1086 struct amdgpu_ttm_tt *gtt = (void *)ttm;
1087
1088 if (gtt == NULL || !gtt->userptr)
1089 return false;
1090
1091 return atomic_read(&gtt->mmu_invalidations) != gtt->last_set_pages;
1092}
1093
1080bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm) 1094bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)
1081{ 1095{
1082 struct amdgpu_ttm_tt *gtt = (void *)ttm; 1096 struct amdgpu_ttm_tt *gtt = (void *)ttm;