drm/radeon: remove duplicates check
Completely unnecessary since the ww_mutex used to reserve a buffer can detect double reservations from the same thread anyway. Signed-off-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
aa35071c59
commit
466be3386f
6 changed files with 16 additions and 34 deletions
|
@ -2452,7 +2452,7 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
|
||||||
idx, p->nrelocs);
|
idx, p->nrelocs);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
*cs_reloc = p->relocs_ptr[idx];
|
*cs_reloc = &p->relocs[idx];
|
||||||
p->dma_reloc_idx++;
|
p->dma_reloc_idx++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1076,7 +1076,6 @@ struct radeon_cs_parser {
|
||||||
/* relocations */
|
/* relocations */
|
||||||
unsigned nrelocs;
|
unsigned nrelocs;
|
||||||
struct radeon_bo_list *relocs;
|
struct radeon_bo_list *relocs;
|
||||||
struct radeon_bo_list **relocs_ptr;
|
|
||||||
struct radeon_bo_list *vm_bos;
|
struct radeon_bo_list *vm_bos;
|
||||||
struct list_head validated;
|
struct list_head validated;
|
||||||
unsigned dma_reloc_idx;
|
unsigned dma_reloc_idx;
|
||||||
|
|
|
@ -77,8 +77,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
||||||
struct drm_device *ddev = p->rdev->ddev;
|
struct drm_device *ddev = p->rdev->ddev;
|
||||||
struct radeon_cs_chunk *chunk;
|
struct radeon_cs_chunk *chunk;
|
||||||
struct radeon_cs_buckets buckets;
|
struct radeon_cs_buckets buckets;
|
||||||
unsigned i, j;
|
unsigned i;
|
||||||
bool duplicate, need_mmap_lock = false;
|
bool need_mmap_lock = false;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (p->chunk_relocs_idx == -1) {
|
if (p->chunk_relocs_idx == -1) {
|
||||||
|
@ -88,10 +88,6 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
||||||
p->dma_reloc_idx = 0;
|
p->dma_reloc_idx = 0;
|
||||||
/* FIXME: we assume that each relocs use 4 dwords */
|
/* FIXME: we assume that each relocs use 4 dwords */
|
||||||
p->nrelocs = chunk->length_dw / 4;
|
p->nrelocs = chunk->length_dw / 4;
|
||||||
p->relocs_ptr = kcalloc(p->nrelocs, sizeof(void *), GFP_KERNEL);
|
|
||||||
if (p->relocs_ptr == NULL) {
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_bo_list), GFP_KERNEL);
|
p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_bo_list), GFP_KERNEL);
|
||||||
if (p->relocs == NULL) {
|
if (p->relocs == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -104,28 +100,13 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
||||||
struct drm_gem_object *gobj;
|
struct drm_gem_object *gobj;
|
||||||
unsigned priority;
|
unsigned priority;
|
||||||
|
|
||||||
duplicate = false;
|
|
||||||
r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4];
|
r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4];
|
||||||
for (j = 0; j < i; j++) {
|
|
||||||
struct drm_radeon_cs_reloc *other;
|
|
||||||
other = (void *)&chunk->kdata[j*4];
|
|
||||||
if (r->handle == other->handle) {
|
|
||||||
p->relocs_ptr[i] = &p->relocs[j];
|
|
||||||
duplicate = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (duplicate) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
gobj = drm_gem_object_lookup(ddev, p->filp, r->handle);
|
gobj = drm_gem_object_lookup(ddev, p->filp, r->handle);
|
||||||
if (gobj == NULL) {
|
if (gobj == NULL) {
|
||||||
DRM_ERROR("gem object lookup failed 0x%x\n",
|
DRM_ERROR("gem object lookup failed 0x%x\n",
|
||||||
r->handle);
|
r->handle);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
p->relocs_ptr[i] = &p->relocs[i];
|
|
||||||
p->relocs[i].robj = gem_to_radeon_bo(gobj);
|
p->relocs[i].robj = gem_to_radeon_bo(gobj);
|
||||||
|
|
||||||
/* The userspace buffer priorities are from 0 to 15. A higher
|
/* The userspace buffer priorities are from 0 to 15. A higher
|
||||||
|
@ -448,7 +429,6 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
|
||||||
}
|
}
|
||||||
kfree(parser->track);
|
kfree(parser->track);
|
||||||
kfree(parser->relocs);
|
kfree(parser->relocs);
|
||||||
kfree(parser->relocs_ptr);
|
|
||||||
drm_free_large(parser->vm_bos);
|
drm_free_large(parser->vm_bos);
|
||||||
for (i = 0; i < parser->nchunks; i++)
|
for (i = 0; i < parser->nchunks; i++)
|
||||||
drm_free_large(parser->chunks[i].kdata);
|
drm_free_large(parser->chunks[i].kdata);
|
||||||
|
@ -523,10 +503,6 @@ static int radeon_bo_vm_update_pte(struct radeon_cs_parser *p,
|
||||||
for (i = 0; i < p->nrelocs; i++) {
|
for (i = 0; i < p->nrelocs; i++) {
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
||||||
|
|
||||||
/* ignore duplicates */
|
|
||||||
if (p->relocs_ptr[i] != &p->relocs[i])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bo = p->relocs[i].robj;
|
bo = p->relocs[i].robj;
|
||||||
bo_va = radeon_vm_bo_find(vm, bo);
|
bo_va = radeon_vm_bo_find(vm, bo);
|
||||||
if (bo_va == NULL) {
|
if (bo_va == NULL) {
|
||||||
|
@ -871,6 +847,6 @@ int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p,
|
||||||
(u64)relocs_chunk->kdata[idx + 3] << 32;
|
(u64)relocs_chunk->kdata[idx + 3] << 32;
|
||||||
(*cs_reloc)->gpu_offset |= relocs_chunk->kdata[idx + 0];
|
(*cs_reloc)->gpu_offset |= relocs_chunk->kdata[idx + 0];
|
||||||
} else
|
} else
|
||||||
*cs_reloc = p->relocs_ptr[(idx / 4)];
|
*cs_reloc = &p->relocs[(idx / 4)];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -503,18 +503,19 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
|
||||||
struct list_head *head, int ring)
|
struct list_head *head, int ring)
|
||||||
{
|
{
|
||||||
struct radeon_bo_list *lobj;
|
struct radeon_bo_list *lobj;
|
||||||
struct radeon_bo *bo;
|
struct list_head duplicates;
|
||||||
int r;
|
int r;
|
||||||
u64 bytes_moved = 0, initial_bytes_moved;
|
u64 bytes_moved = 0, initial_bytes_moved;
|
||||||
u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev);
|
u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev);
|
||||||
|
|
||||||
r = ttm_eu_reserve_buffers(ticket, head, true, NULL);
|
INIT_LIST_HEAD(&duplicates);
|
||||||
|
r = ttm_eu_reserve_buffers(ticket, head, true, &duplicates);
|
||||||
if (unlikely(r != 0)) {
|
if (unlikely(r != 0)) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(lobj, head, tv.head) {
|
list_for_each_entry(lobj, head, tv.head) {
|
||||||
bo = lobj->robj;
|
struct radeon_bo *bo = lobj->robj;
|
||||||
if (!bo->pin_count) {
|
if (!bo->pin_count) {
|
||||||
u32 domain = lobj->prefered_domains;
|
u32 domain = lobj->prefered_domains;
|
||||||
u32 allowed = lobj->allowed_domains;
|
u32 allowed = lobj->allowed_domains;
|
||||||
|
@ -562,6 +563,12 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
|
||||||
lobj->gpu_offset = radeon_bo_gpu_offset(bo);
|
lobj->gpu_offset = radeon_bo_gpu_offset(bo);
|
||||||
lobj->tiling_flags = bo->tiling_flags;
|
lobj->tiling_flags = bo->tiling_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_for_each_entry(lobj, &duplicates, tv.head) {
|
||||||
|
lobj->gpu_offset = radeon_bo_gpu_offset(lobj->robj);
|
||||||
|
lobj->tiling_flags = lobj->robj->tiling_flags;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -502,7 +502,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
reloc = p->relocs_ptr[(idx / 4)];
|
reloc = &p->relocs[(idx / 4)];
|
||||||
start = reloc->gpu_offset;
|
start = reloc->gpu_offset;
|
||||||
end = start + radeon_bo_size(reloc->robj);
|
end = start + radeon_bo_size(reloc->robj);
|
||||||
start += offset;
|
start += offset;
|
||||||
|
|
|
@ -467,7 +467,7 @@ int radeon_vce_cs_reloc(struct radeon_cs_parser *p, int lo, int hi,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
reloc = p->relocs_ptr[(idx / 4)];
|
reloc = &p->relocs[(idx / 4)];
|
||||||
start = reloc->gpu_offset;
|
start = reloc->gpu_offset;
|
||||||
end = start + radeon_bo_size(reloc->robj);
|
end = start + radeon_bo_size(reloc->robj);
|
||||||
start += offset;
|
start += offset;
|
||||||
|
|
Loading…
Add table
Reference in a new issue