drm/amdgpu: use fence_context to judge ctx switch v2
authorChristian König <christian.koenig@amd.com>
Tue, 3 May 2016 13:17:40 +0000 (15:17 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 11 May 2016 16:31:27 +0000 (12:31 -0400)
Use of the ctx pointer is not safe, because they are likely already
be assigned to another ctx when doing comparing.

v2: recreate from scratch, avoid all unnecessary changes.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Monk.Liu <monk.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c

index ac26b13..781f047 100644 (file)
@@ -743,7 +743,7 @@ struct amdgpu_ib {
        struct amdgpu_user_fence        *user;
        unsigned                        vm_id;
        uint64_t                        vm_pd_addr;
-       struct amdgpu_ctx               *ctx;
+       uint64_t                        ctx;
        uint32_t                        gds_base, gds_size;
        uint32_t                        gws_base, gws_size;
        uint32_t                        oa_base, oa_size;
@@ -806,7 +806,7 @@ struct amdgpu_ring {
        unsigned                wptr_offs;
        unsigned                next_rptr_offs;
        unsigned                fence_offs;
-       struct amdgpu_ctx       *current_ctx;
+       uint64_t                current_ctx;
        enum amdgpu_ring_type   type;
        char                    name[16];
        unsigned                cond_exe_offs;
index 1a06596..87ec113 100644 (file)
@@ -741,7 +741,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
 
                ib->length_dw = chunk_ib->ib_bytes / 4;
                ib->flags = chunk_ib->flags;
-               ib->ctx = parser->ctx;
+               ib->ctx = parser->ctx->rings[ring->idx].entity.fence_context;
                j++;
        }
 
index 9105561..f670519 100644 (file)
@@ -121,7 +121,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib *ib = &ibs[0];
-       struct amdgpu_ctx *ctx, *old_ctx;
+       uint64_t ctx, old_ctx;
        struct fence *hwf;
        struct amdgpu_vm *vm = NULL;
        unsigned i, patch_offset = ~0;