diff options
author | Christian König <christian.koenig@amd.com> | 2017-09-05 08:30:05 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-12 14:24:09 -0400 |
commit | ca666a3c298f838346ccea46ff542c605e68deb5 (patch) | |
tree | 7ac2c1cecaaf8c52a94439604d942f6001af0cd2 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |
parent | b72cf4fca2bb786e20864b5e8755105aa9626fb4 (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.c | 14 |
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 | ||
673 | void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages) | 674 | void 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(>t->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(>t->guptasklock); | 1028 | spin_lock_init(>t->guptasklock); |
1026 | INIT_LIST_HEAD(>t->guptasks); | 1029 | INIT_LIST_HEAD(>t->guptasks); |
1027 | atomic_set(>t->mmu_invalidations, 0); | 1030 | atomic_set(>t->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 | ||
1084 | bool 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(>t->mmu_invalidations) != gtt->last_set_pages; | ||
1092 | } | ||
1093 | |||
1080 | bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm) | 1094 | bool 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; |