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

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>

authored by

Christian König and committed by
Alex Deucher
466be338 aa35071c

+16 -34
+1 -1
drivers/gpu/drm/radeon/r600_cs.c
··· 2452 2452 idx, p->nrelocs); 2453 2453 return -EINVAL; 2454 2454 } 2455 - *cs_reloc = p->relocs_ptr[idx]; 2455 + *cs_reloc = &p->relocs[idx]; 2456 2456 p->dma_reloc_idx++; 2457 2457 return 0; 2458 2458 }
-1
drivers/gpu/drm/radeon/radeon.h
··· 1076 1076 /* relocations */ 1077 1077 unsigned nrelocs; 1078 1078 struct radeon_bo_list *relocs; 1079 - struct radeon_bo_list **relocs_ptr; 1080 1079 struct radeon_bo_list *vm_bos; 1081 1080 struct list_head validated; 1082 1081 unsigned dma_reloc_idx;
+3 -27
drivers/gpu/drm/radeon/radeon_cs.c
··· 77 77 struct drm_device *ddev = p->rdev->ddev; 78 78 struct radeon_cs_chunk *chunk; 79 79 struct radeon_cs_buckets buckets; 80 - unsigned i, j; 81 - bool duplicate, need_mmap_lock = false; 80 + unsigned i; 81 + bool need_mmap_lock = false; 82 82 int r; 83 83 84 84 if (p->chunk_relocs_idx == -1) { ··· 88 88 p->dma_reloc_idx = 0; 89 89 /* FIXME: we assume that each relocs use 4 dwords */ 90 90 p->nrelocs = chunk->length_dw / 4; 91 - p->relocs_ptr = kcalloc(p->nrelocs, sizeof(void *), GFP_KERNEL); 92 - if (p->relocs_ptr == NULL) { 93 - return -ENOMEM; 94 - } 95 91 p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_bo_list), GFP_KERNEL); 96 92 if (p->relocs == NULL) { 97 93 return -ENOMEM; ··· 100 104 struct drm_gem_object *gobj; 101 105 unsigned priority; 102 106 103 - duplicate = false; 104 107 r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4]; 105 - for (j = 0; j < i; j++) { 106 - struct drm_radeon_cs_reloc *other; 107 - other = (void *)&chunk->kdata[j*4]; 108 - if (r->handle == other->handle) { 109 - p->relocs_ptr[i] = &p->relocs[j]; 110 - duplicate = true; 111 - break; 112 - } 113 - } 114 - if (duplicate) { 115 - continue; 116 - } 117 - 118 108 gobj = drm_gem_object_lookup(ddev, p->filp, r->handle); 119 109 if (gobj == NULL) { 120 110 DRM_ERROR("gem object lookup failed 0x%x\n", 121 111 r->handle); 122 112 return -ENOENT; 123 113 } 124 - p->relocs_ptr[i] = &p->relocs[i]; 125 114 p->relocs[i].robj = gem_to_radeon_bo(gobj); 126 115 127 116 /* The userspace buffer priorities are from 0 to 15. A higher ··· 429 448 } 430 449 kfree(parser->track); 431 450 kfree(parser->relocs); 432 - kfree(parser->relocs_ptr); 433 451 drm_free_large(parser->vm_bos); 434 452 for (i = 0; i < parser->nchunks; i++) 435 453 drm_free_large(parser->chunks[i].kdata); ··· 502 522 503 523 for (i = 0; i < p->nrelocs; i++) { 504 524 struct radeon_bo *bo; 505 - 506 - /* ignore duplicates */ 507 - if (p->relocs_ptr[i] != &p->relocs[i]) 508 - continue; 509 525 510 526 bo = p->relocs[i].robj; 511 527 bo_va = radeon_vm_bo_find(vm, bo); ··· 847 871 (u64)relocs_chunk->kdata[idx + 3] << 32; 848 872 (*cs_reloc)->gpu_offset |= relocs_chunk->kdata[idx + 0]; 849 873 } else 850 - *cs_reloc = p->relocs_ptr[(idx / 4)]; 874 + *cs_reloc = &p->relocs[(idx / 4)]; 851 875 return 0; 852 876 }
+10 -3
drivers/gpu/drm/radeon/radeon_object.c
··· 503 503 struct list_head *head, int ring) 504 504 { 505 505 struct radeon_bo_list *lobj; 506 - struct radeon_bo *bo; 506 + struct list_head duplicates; 507 507 int r; 508 508 u64 bytes_moved = 0, initial_bytes_moved; 509 509 u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev); 510 510 511 - r = ttm_eu_reserve_buffers(ticket, head, true, NULL); 511 + INIT_LIST_HEAD(&duplicates); 512 + r = ttm_eu_reserve_buffers(ticket, head, true, &duplicates); 512 513 if (unlikely(r != 0)) { 513 514 return r; 514 515 } 515 516 516 517 list_for_each_entry(lobj, head, tv.head) { 517 - bo = lobj->robj; 518 + struct radeon_bo *bo = lobj->robj; 518 519 if (!bo->pin_count) { 519 520 u32 domain = lobj->prefered_domains; 520 521 u32 allowed = lobj->allowed_domains; ··· 563 562 lobj->gpu_offset = radeon_bo_gpu_offset(bo); 564 563 lobj->tiling_flags = bo->tiling_flags; 565 564 } 565 + 566 + list_for_each_entry(lobj, &duplicates, tv.head) { 567 + lobj->gpu_offset = radeon_bo_gpu_offset(lobj->robj); 568 + lobj->tiling_flags = lobj->robj->tiling_flags; 569 + } 570 + 566 571 return 0; 567 572 } 568 573
+1 -1
drivers/gpu/drm/radeon/radeon_uvd.c
··· 502 502 return -EINVAL; 503 503 } 504 504 505 - reloc = p->relocs_ptr[(idx / 4)]; 505 + reloc = &p->relocs[(idx / 4)]; 506 506 start = reloc->gpu_offset; 507 507 end = start + radeon_bo_size(reloc->robj); 508 508 start += offset;
+1 -1
drivers/gpu/drm/radeon/radeon_vce.c
··· 467 467 return -EINVAL; 468 468 } 469 469 470 - reloc = p->relocs_ptr[(idx / 4)]; 470 + reloc = &p->relocs[(idx / 4)]; 471 471 start = reloc->gpu_offset; 472 472 end = start + radeon_bo_size(reloc->robj); 473 473 start += offset;