aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-01-10 11:27:49 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-01-27 12:20:33 -0500
commite1f055b30187204439b6693a118b9dde9cda04ae (patch)
tree29689d69c58bacf23601ef70a1adde165d3b1a88 /drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
parentcf6c467d67d319e239aec57d7ba31cb9946f29bf (diff)
drm/amdgpu: user BO priority instead of self coding it (v2)
Keeping groups of BOs on the LRU is to time consuming on command submission. Instead use the newly added BO priority to give a certain eviction order. v2: agd: trivial warning fix Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Roger.He <Hongbo.He@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.c69
1 files changed, 2 insertions, 67 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index d53445074897..6b1f85b1a1cb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1048,56 +1048,6 @@ uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
1048 return flags; 1048 return flags;
1049} 1049}
1050 1050
1051static void amdgpu_ttm_lru_removal(struct ttm_buffer_object *tbo)
1052{
1053 struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
1054 unsigned i, j;
1055
1056 for (i = 0; i < AMDGPU_TTM_LRU_SIZE; ++i) {
1057 struct amdgpu_mman_lru *lru = &adev->mman.log2_size[i];
1058
1059 for (j = 0; j < TTM_NUM_MEM_TYPES; ++j)
1060 if (&tbo->lru == lru->lru[j])
1061 lru->lru[j] = tbo->lru.prev;
1062
1063 if (&tbo->swap == lru->swap_lru)
1064 lru->swap_lru = tbo->swap.prev;
1065 }
1066}
1067
1068static struct amdgpu_mman_lru *amdgpu_ttm_lru(struct ttm_buffer_object *tbo)
1069{
1070 struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
1071 unsigned log2_size = min(ilog2(tbo->num_pages),
1072 AMDGPU_TTM_LRU_SIZE - 1);
1073
1074 return &adev->mman.log2_size[log2_size];
1075}
1076
1077static struct list_head *amdgpu_ttm_lru_tail(struct ttm_buffer_object *tbo)
1078{
1079 struct amdgpu_mman_lru *lru = amdgpu_ttm_lru(tbo);
1080 struct list_head *res = lru->lru[tbo->mem.mem_type];
1081
1082 lru->lru[tbo->mem.mem_type] = &tbo->lru;
1083 while ((++lru)->lru[tbo->mem.mem_type] == res)
1084 lru->lru[tbo->mem.mem_type] = &tbo->lru;
1085
1086 return res;
1087}
1088
1089static struct list_head *amdgpu_ttm_swap_lru_tail(struct ttm_buffer_object *tbo)
1090{
1091 struct amdgpu_mman_lru *lru = amdgpu_ttm_lru(tbo);
1092 struct list_head *res = lru->swap_lru;
1093
1094 lru->swap_lru = &tbo->swap;
1095 while ((++lru)->swap_lru == res)
1096 lru->swap_lru = &tbo->swap;
1097
1098 return res;
1099}
1100
1101static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 1051static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
1102 const struct ttm_place *place) 1052 const struct ttm_place *place)
1103{ 1053{
@@ -1136,14 +1086,12 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
1136 .fault_reserve_notify = &amdgpu_bo_fault_reserve_notify, 1086 .fault_reserve_notify = &amdgpu_bo_fault_reserve_notify,
1137 .io_mem_reserve = &amdgpu_ttm_io_mem_reserve, 1087 .io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
1138 .io_mem_free = &amdgpu_ttm_io_mem_free, 1088 .io_mem_free = &amdgpu_ttm_io_mem_free,
1139 .lru_removal = &amdgpu_ttm_lru_removal, 1089 .lru_tail = &ttm_bo_default_lru_tail,
1140 .lru_tail = &amdgpu_ttm_lru_tail, 1090 .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
1141 .swap_lru_tail = &amdgpu_ttm_swap_lru_tail,
1142}; 1091};
1143 1092
1144int amdgpu_ttm_init(struct amdgpu_device *adev) 1093int amdgpu_ttm_init(struct amdgpu_device *adev)
1145{ 1094{
1146 unsigned i, j;
1147 int r; 1095 int r;
1148 1096
1149 r = amdgpu_ttm_global_init(adev); 1097 r = amdgpu_ttm_global_init(adev);
@@ -1161,19 +1109,6 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
1161 DRM_ERROR("failed initializing buffer object driver(%d).\n", r); 1109 DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
1162 return r; 1110 return r;
1163 } 1111 }
1164
1165 for (i = 0; i < AMDGPU_TTM_LRU_SIZE; ++i) {
1166 struct amdgpu_mman_lru *lru = &adev->mman.log2_size[i];
1167
1168 for (j = 0; j < TTM_NUM_MEM_TYPES; ++j)
1169 lru->lru[j] = &adev->mman.bdev.man[j].lru[0];
1170 lru->swap_lru = &adev->mman.bdev.glob->swap_lru[0];
1171 }
1172
1173 for (j = 0; j < TTM_NUM_MEM_TYPES; ++j)
1174 adev->mman.guard.lru[j] = NULL;
1175 adev->mman.guard.swap_lru = NULL;
1176
1177 adev->mman.initialized = true; 1112 adev->mman.initialized = true;
1178 r = ttm_bo_init_mm(&adev->mman.bdev, TTM_PL_VRAM, 1113 r = ttm_bo_init_mm(&adev->mman.bdev, TTM_PL_VRAM,
1179 adev->mc.real_vram_size >> PAGE_SHIFT); 1114 adev->mc.real_vram_size >> PAGE_SHIFT);