Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christian König and committed by
Alex Deucher
e1f055b3 cf6c467d

+5 -79
+3
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 386 386 if (unlikely(r != 0)) 387 387 return r; 388 388 389 + bo->tbo.priority = ilog2(bo->tbo.num_pages); 390 + bo->tbo.priority = min(bo->tbo.priority, (unsigned)(TTM_MAX_BO_PRIORITY - 1)); 391 + 389 392 if (flags & AMDGPU_GEM_CREATE_VRAM_CLEARED && 390 393 bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) { 391 394 struct dma_fence *fence;
+2 -67
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 1048 1048 return flags; 1049 1049 } 1050 1050 1051 - static 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 - 1068 - static 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 - 1077 - static 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 - 1089 - static 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 - 1101 1051 static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 1102 1052 const struct ttm_place *place) 1103 1053 { ··· 1086 1136 .fault_reserve_notify = &amdgpu_bo_fault_reserve_notify, 1087 1137 .io_mem_reserve = &amdgpu_ttm_io_mem_reserve, 1088 1138 .io_mem_free = &amdgpu_ttm_io_mem_free, 1089 - .lru_removal = &amdgpu_ttm_lru_removal, 1090 - .lru_tail = &amdgpu_ttm_lru_tail, 1091 - .swap_lru_tail = &amdgpu_ttm_swap_lru_tail, 1139 + .lru_tail = &ttm_bo_default_lru_tail, 1140 + .swap_lru_tail = &ttm_bo_default_swap_lru_tail, 1092 1141 }; 1093 1142 1094 1143 int amdgpu_ttm_init(struct amdgpu_device *adev) 1095 1144 { 1096 - unsigned i, j; 1097 1145 int r; 1098 1146 1099 1147 r = amdgpu_ttm_global_init(adev); ··· 1109 1161 DRM_ERROR("failed initializing buffer object driver(%d).\n", r); 1110 1162 return r; 1111 1163 } 1112 - 1113 - for (i = 0; i < AMDGPU_TTM_LRU_SIZE; ++i) { 1114 - struct amdgpu_mman_lru *lru = &adev->mman.log2_size[i]; 1115 - 1116 - for (j = 0; j < TTM_NUM_MEM_TYPES; ++j) 1117 - lru->lru[j] = &adev->mman.bdev.man[j].lru[0]; 1118 - lru->swap_lru = &adev->mman.bdev.glob->swap_lru[0]; 1119 - } 1120 - 1121 - for (j = 0; j < TTM_NUM_MEM_TYPES; ++j) 1122 - adev->mman.guard.lru[j] = NULL; 1123 - adev->mman.guard.swap_lru = NULL; 1124 - 1125 1164 adev->mman.initialized = true; 1126 1165 r = ttm_bo_init_mm(&adev->mman.bdev, TTM_PL_VRAM, 1127 1166 adev->mc.real_vram_size >> PAGE_SHIFT);
-12
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
··· 34 34 #define AMDGPU_PL_FLAG_GWS (TTM_PL_FLAG_PRIV << 1) 35 35 #define AMDGPU_PL_FLAG_OA (TTM_PL_FLAG_PRIV << 2) 36 36 37 - #define AMDGPU_TTM_LRU_SIZE 20 38 - 39 - struct amdgpu_mman_lru { 40 - struct list_head *lru[TTM_NUM_MEM_TYPES]; 41 - struct list_head *swap_lru; 42 - }; 43 - 44 37 struct amdgpu_mman { 45 38 struct ttm_bo_global_ref bo_global_ref; 46 39 struct drm_global_reference mem_global_ref; ··· 51 58 struct amdgpu_ring *buffer_funcs_ring; 52 59 /* Scheduler entity for buffer moves */ 53 60 struct amd_sched_entity entity; 54 - 55 - /* custom LRU management */ 56 - struct amdgpu_mman_lru log2_size[AMDGPU_TTM_LRU_SIZE]; 57 - /* guard for log2_size array, don't add anything in between */ 58 - struct amdgpu_mman_lru guard; 59 61 }; 60 62 61 63 extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func;