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

drm/amdgpu: stop allocating dummy GTT nodes

Now that TTM is fixed up we can finally stop that nonsense.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Madhav Chauhan <madhav.chauhan@amd.com>
Link: https://patchwork.freedesktop.org/patch/375620

+42 -80
+28 -76
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
··· 150 150 */ 151 151 bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_mem_reg *mem) 152 152 { 153 - struct amdgpu_gtt_node *node = mem->mm_node; 154 - 155 - return (node->node.start != AMDGPU_BO_INVALID_OFFSET); 156 - } 157 - 158 - /** 159 - * amdgpu_gtt_mgr_alloc - allocate new ranges 160 - * 161 - * @man: TTM memory type manager 162 - * @tbo: TTM BO we need this range for 163 - * @place: placement flags and restrictions 164 - * @mem: the resulting mem object 165 - * 166 - * Allocate the address space for a node. 167 - */ 168 - static int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, 169 - struct ttm_buffer_object *tbo, 170 - const struct ttm_place *place, 171 - struct ttm_mem_reg *mem) 172 - { 173 - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); 174 - struct amdgpu_gtt_mgr *mgr = man->priv; 175 - struct amdgpu_gtt_node *node = mem->mm_node; 176 - enum drm_mm_insert_mode mode; 177 - unsigned long fpfn, lpfn; 178 - int r; 179 - 180 - if (amdgpu_gtt_mgr_has_gart_addr(mem)) 181 - return 0; 182 - 183 - if (place) 184 - fpfn = place->fpfn; 185 - else 186 - fpfn = 0; 187 - 188 - if (place && place->lpfn) 189 - lpfn = place->lpfn; 190 - else 191 - lpfn = adev->gart.num_cpu_pages; 192 - 193 - mode = DRM_MM_INSERT_BEST; 194 - if (place && place->flags & TTM_PL_FLAG_TOPDOWN) 195 - mode = DRM_MM_INSERT_HIGH; 196 - 197 - spin_lock(&mgr->lock); 198 - r = drm_mm_insert_node_in_range(&mgr->mm, &node->node, mem->num_pages, 199 - mem->page_alignment, 0, fpfn, lpfn, 200 - mode); 201 - spin_unlock(&mgr->lock); 202 - 203 - if (!r) 204 - mem->start = node->node.start; 205 - 206 - return r; 153 + return mem->mm_node != NULL; 207 154 } 208 155 209 156 /** ··· 181 234 atomic64_sub(mem->num_pages, &mgr->available); 182 235 spin_unlock(&mgr->lock); 183 236 237 + if (!place->lpfn) { 238 + mem->mm_node = NULL; 239 + mem->start = AMDGPU_BO_INVALID_OFFSET; 240 + return 0; 241 + } 242 + 184 243 node = kzalloc(sizeof(*node), GFP_KERNEL); 185 244 if (!node) { 186 245 r = -ENOMEM; 187 246 goto err_out; 188 247 } 189 248 190 - node->node.start = AMDGPU_BO_INVALID_OFFSET; 191 - node->node.size = mem->num_pages; 192 249 node->tbo = tbo; 193 - mem->mm_node = node; 194 250 195 - if (place->fpfn || place->lpfn || place->flags & TTM_PL_FLAG_TOPDOWN) { 196 - r = amdgpu_gtt_mgr_alloc(man, tbo, place, mem); 197 - if (unlikely(r)) { 198 - kfree(node); 199 - mem->mm_node = NULL; 200 - goto err_out; 201 - } 202 - } else { 203 - mem->start = node->node.start; 204 - } 251 + spin_lock(&mgr->lock); 252 + r = drm_mm_insert_node_in_range(&mgr->mm, &node->node, mem->num_pages, 253 + mem->page_alignment, 0, place->fpfn, 254 + place->lpfn, DRM_MM_INSERT_BEST); 255 + spin_unlock(&mgr->lock); 256 + 257 + if (unlikely(r)) 258 + goto err_free; 259 + 260 + mem->mm_node = node; 261 + mem->start = node->node.start; 205 262 206 263 return 0; 264 + 265 + err_free: 266 + kfree(node); 267 + 207 268 err_out: 208 269 atomic64_add(mem->num_pages, &mgr->available); 209 270 ··· 234 279 struct amdgpu_gtt_mgr *mgr = man->priv; 235 280 struct amdgpu_gtt_node *node = mem->mm_node; 236 281 237 - if (!node) 238 - return; 239 - 240 - spin_lock(&mgr->lock); 241 - if (node->node.start != AMDGPU_BO_INVALID_OFFSET) 282 + if (node) { 283 + spin_lock(&mgr->lock); 242 284 drm_mm_remove_node(&node->node); 243 - spin_unlock(&mgr->lock); 244 - atomic64_add(mem->num_pages, &mgr->available); 285 + spin_unlock(&mgr->lock); 286 + kfree(node); 287 + } 245 288 246 - kfree(node); 247 - mem->mm_node = NULL; 289 + atomic64_add(mem->num_pages, &mgr->available); 248 290 } 249 291 250 292 /**
+14 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 429 429 } 430 430 431 431 src_offset = src->offset; 432 - src_mm = amdgpu_find_mm_node(src->mem, &src_offset); 433 - src_node_size = (src_mm->size << PAGE_SHIFT) - src_offset; 432 + if (src->mem->mm_node) { 433 + src_mm = amdgpu_find_mm_node(src->mem, &src_offset); 434 + src_node_size = (src_mm->size << PAGE_SHIFT) - src_offset; 435 + } else { 436 + src_mm = NULL; 437 + src_node_size = ULLONG_MAX; 438 + } 434 439 435 440 dst_offset = dst->offset; 436 - dst_mm = amdgpu_find_mm_node(dst->mem, &dst_offset); 437 - dst_node_size = (dst_mm->size << PAGE_SHIFT) - dst_offset; 441 + if (dst->mem->mm_node) { 442 + dst_mm = amdgpu_find_mm_node(dst->mem, &dst_offset); 443 + dst_node_size = (dst_mm->size << PAGE_SHIFT) - dst_offset; 444 + } else { 445 + dst_mm = NULL; 446 + dst_node_size = ULLONG_MAX; 447 + } 438 448 439 449 mutex_lock(&adev->mman.gtt_window_lock); 440 450