drm/amdgpu: do not allocate entries separately
Allocate PD/PT entries while allocating VM BOs and use that instead of allocating those entries separately. v2: create a new var for num entries. Signed-off-by: Nirmoy Das <nirmoy.das@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
9c3fec688f
commit
c7b9aa7a92
@ -876,6 +876,7 @@ static int amdgpu_vm_pt_create(struct amdgpu_device *adev,
|
||||
struct amdgpu_bo_param bp;
|
||||
struct amdgpu_bo *bo;
|
||||
struct dma_resv *resv;
|
||||
unsigned int num_entries;
|
||||
int r;
|
||||
|
||||
memset(&bp, 0, sizeof(bp));
|
||||
@ -886,7 +887,14 @@ static int amdgpu_vm_pt_create(struct amdgpu_device *adev,
|
||||
bp.domain = amdgpu_bo_get_preferred_pin_domain(adev, bp.domain);
|
||||
bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
|
||||
AMDGPU_GEM_CREATE_CPU_GTT_USWC;
|
||||
bp.bo_ptr_size = sizeof(struct amdgpu_bo_vm);
|
||||
|
||||
if (level < AMDGPU_VM_PTB)
|
||||
num_entries = amdgpu_vm_num_entries(adev, level);
|
||||
else
|
||||
num_entries = 0;
|
||||
|
||||
bp.bo_ptr_size = struct_size((*vmbo), entries, num_entries);
|
||||
|
||||
if (vm->use_cpu_for_update)
|
||||
bp.flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
|
||||
|
||||
@ -957,19 +965,14 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
|
||||
struct amdgpu_bo_vm *pt;
|
||||
int r;
|
||||
|
||||
if (cursor->level < AMDGPU_VM_PTB && !entry->entries) {
|
||||
unsigned num_entries;
|
||||
|
||||
num_entries = amdgpu_vm_num_entries(adev, cursor->level);
|
||||
entry->entries = kvmalloc_array(num_entries,
|
||||
sizeof(*entry->entries),
|
||||
GFP_KERNEL | __GFP_ZERO);
|
||||
if (!entry->entries)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (entry->base.bo)
|
||||
if (entry->base.bo) {
|
||||
if (cursor->level < AMDGPU_VM_PTB)
|
||||
entry->entries =
|
||||
to_amdgpu_bo_vm(entry->base.bo)->entries;
|
||||
else
|
||||
entry->entries = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt);
|
||||
if (r)
|
||||
@ -981,6 +984,10 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
|
||||
pt_bo = &pt->bo;
|
||||
pt_bo->parent = amdgpu_bo_ref(cursor->parent->base.bo);
|
||||
amdgpu_vm_bo_base_init(&entry->base, vm, pt_bo);
|
||||
if (cursor->level < AMDGPU_VM_PTB)
|
||||
entry->entries = pt->entries;
|
||||
else
|
||||
entry->entries = NULL;
|
||||
|
||||
r = amdgpu_vm_clear_bo(adev, vm, pt, immediate);
|
||||
if (r)
|
||||
@ -1010,7 +1017,6 @@ static void amdgpu_vm_free_table(struct amdgpu_vm_pt *entry)
|
||||
amdgpu_bo_unref(&shadow);
|
||||
amdgpu_bo_unref(&entry->base.bo);
|
||||
}
|
||||
kvfree(entry->entries);
|
||||
entry->entries = NULL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user