drm/radeon: remove duplicates check
authorChristian König <christian.koenig@amd.com>
Wed, 3 Dec 2014 14:46:49 +0000 (15:46 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 3 Dec 2014 23:26:53 +0000 (18:26 -0500)
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>
drivers/gpu/drm/radeon/r600_cs.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_object.c
drivers/gpu/drm/radeon/radeon_uvd.c
drivers/gpu/drm/radeon/radeon_vce.c

index b81ba1926fa8948348d072a5dfe1cd129e6edf1a..e5521946cb7a14a832960f54bff9e924b567f070 100644 (file)
@@ -2452,7 +2452,7 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
                          idx, p->nrelocs);
                return -EINVAL;
        }
-       *cs_reloc = p->relocs_ptr[idx];
+       *cs_reloc = &p->relocs[idx];
        p->dma_reloc_idx++;
        return 0;
 }
index b59a4de76174675302f621782f7fa5e6081770ef..1319c9ccde5a1a2058852113e22ecc89863fadd5 100644 (file)
@@ -1076,7 +1076,6 @@ struct radeon_cs_parser {
        /* relocations */
        unsigned                nrelocs;
        struct radeon_bo_list   *relocs;
-       struct radeon_bo_list   **relocs_ptr;
        struct radeon_bo_list   *vm_bos;
        struct list_head        validated;
        unsigned                dma_reloc_idx;
index fb776cb2c8e9ddb1ea5b6e0912c4cc93c5ab9f5f..26f7855c3e1966394c42799451fe90410c40efb9 100644 (file)
@@ -77,8 +77,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
        struct drm_device *ddev = p->rdev->ddev;
        struct radeon_cs_chunk *chunk;
        struct radeon_cs_buckets buckets;
-       unsigned i, j;
-       bool duplicate, need_mmap_lock = false;
+       unsigned i;
+       bool need_mmap_lock = false;
        int r;
 
        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;
        /* FIXME: we assume that each relocs use 4 dwords */
        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);
        if (p->relocs == NULL) {
                return -ENOMEM;
@@ -104,28 +100,13 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
                struct drm_gem_object *gobj;
                unsigned priority;
 
-               duplicate = false;
                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);
                if (gobj == NULL) {
                        DRM_ERROR("gem object lookup failed 0x%x\n",
                                  r->handle);
                        return -ENOENT;
                }
-               p->relocs_ptr[i] = &p->relocs[i];
                p->relocs[i].robj = gem_to_radeon_bo(gobj);
 
                /* 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->relocs);
-       kfree(parser->relocs_ptr);
        drm_free_large(parser->vm_bos);
        for (i = 0; i < parser->nchunks; i++)
                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++) {
                struct radeon_bo *bo;
 
-               /* ignore duplicates */
-               if (p->relocs_ptr[i] != &p->relocs[i])
-                       continue;
-
                bo = p->relocs[i].robj;
                bo_va = radeon_vm_bo_find(vm, bo);
                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;
                (*cs_reloc)->gpu_offset |= relocs_chunk->kdata[idx + 0];
        } else
-               *cs_reloc = p->relocs_ptr[(idx / 4)];
+               *cs_reloc = &p->relocs[(idx / 4)];
        return 0;
 }
index a4a3ac824b45312f79e749f5aac54857905276d2..0a8ef9ef151997b4dd634d8e34763b467ffb77db 100644 (file)
@@ -503,18 +503,19 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
                            struct list_head *head, int ring)
 {
        struct radeon_bo_list *lobj;
-       struct radeon_bo *bo;
+       struct list_head duplicates;
        int r;
        u64 bytes_moved = 0, initial_bytes_moved;
        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)) {
                return r;
        }
 
        list_for_each_entry(lobj, head, tv.head) {
-               bo = lobj->robj;
+               struct radeon_bo *bo = lobj->robj;
                if (!bo->pin_count) {
                        u32 domain = lobj->prefered_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->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;
 }
 
index 7c22b9369aeaf73963276c496d4c4674003a7472..72cd47d041402cc39fb46ca23209694153ce71c2 100644 (file)
@@ -502,7 +502,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
                return -EINVAL;
        }
 
-       reloc = p->relocs_ptr[(idx / 4)];
+       reloc = &p->relocs[(idx / 4)];
        start = reloc->gpu_offset;
        end = start + radeon_bo_size(reloc->robj);
        start += offset;
index 8b4eea48159d1f453963c5c55ed87a88f5aba8ff..b3a1698e0443093da9fc5f4847289fe3a04e25b6 100644 (file)
@@ -467,7 +467,7 @@ int radeon_vce_cs_reloc(struct radeon_cs_parser *p, int lo, int hi,
                return -EINVAL;
        }
 
-       reloc = p->relocs_ptr[(idx / 4)];
+       reloc = &p->relocs[(idx / 4)];
        start = reloc->gpu_offset;
        end = start + radeon_bo_size(reloc->robj);
        start += offset;