Skip to content

Commit 1e691e2

Browse files
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 <[email protected]> Reviewed-by: Madhav Chauhan <[email protected]> Link: https://patchwork.freedesktop.org/patch/375620
1 parent e04be23 commit 1e691e2

File tree

2 files changed

+42
-80
lines changed

2 files changed

+42
-80
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c

Lines changed: 28 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -150,60 +150,7 @@ static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man)
150150
*/
151151
bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_mem_reg *mem)
152152
{
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;
207154
}
208155

209156
/**
@@ -234,29 +181,37 @@ static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man,
234181
atomic64_sub(mem->num_pages, &mgr->available);
235182
spin_unlock(&mgr->lock);
236183

184+
if (!place->lpfn) {
185+
mem->mm_node = NULL;
186+
mem->start = AMDGPU_BO_INVALID_OFFSET;
187+
return 0;
188+
}
189+
237190
node = kzalloc(sizeof(*node), GFP_KERNEL);
238191
if (!node) {
239192
r = -ENOMEM;
240193
goto err_out;
241194
}
242195

243-
node->node.start = AMDGPU_BO_INVALID_OFFSET;
244-
node->node.size = mem->num_pages;
245196
node->tbo = tbo;
246-
mem->mm_node = node;
247197

248-
if (place->fpfn || place->lpfn || place->flags & TTM_PL_FLAG_TOPDOWN) {
249-
r = amdgpu_gtt_mgr_alloc(man, tbo, place, mem);
250-
if (unlikely(r)) {
251-
kfree(node);
252-
mem->mm_node = NULL;
253-
goto err_out;
254-
}
255-
} else {
256-
mem->start = node->node.start;
257-
}
198+
spin_lock(&mgr->lock);
199+
r = drm_mm_insert_node_in_range(&mgr->mm, &node->node, mem->num_pages,
200+
mem->page_alignment, 0, place->fpfn,
201+
place->lpfn, DRM_MM_INSERT_BEST);
202+
spin_unlock(&mgr->lock);
203+
204+
if (unlikely(r))
205+
goto err_free;
206+
207+
mem->mm_node = node;
208+
mem->start = node->node.start;
258209

259210
return 0;
211+
212+
err_free:
213+
kfree(node);
214+
260215
err_out:
261216
atomic64_add(mem->num_pages, &mgr->available);
262217

@@ -279,17 +234,14 @@ static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man,
279234
struct amdgpu_gtt_mgr *mgr = man->priv;
280235
struct amdgpu_gtt_node *node = mem->mm_node;
281236

282-
if (!node)
283-
return;
284-
285-
spin_lock(&mgr->lock);
286-
if (node->node.start != AMDGPU_BO_INVALID_OFFSET)
237+
if (node) {
238+
spin_lock(&mgr->lock);
287239
drm_mm_remove_node(&node->node);
288-
spin_unlock(&mgr->lock);
289-
atomic64_add(mem->num_pages, &mgr->available);
240+
spin_unlock(&mgr->lock);
241+
kfree(node);
242+
}
290243

291-
kfree(node);
292-
mem->mm_node = NULL;
244+
atomic64_add(mem->num_pages, &mgr->available);
293245
}
294246

295247
/**

drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -429,12 +429,22 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
429429
}
430430

431431
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+
}
434439

435440
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+
}
438448

439449
mutex_lock(&adev->mman.gtt_window_lock);
440450

0 commit comments

Comments
 (0)