Free them wenn the ib is freed, another
step to better debugging.

Signed-off-by: Christian K?nig <deathsimple at vodafone.de>
---
 drivers/gpu/drm/radeon/radeon.h      |    3 +++
 drivers/gpu/drm/radeon/radeon_cs.c   |   14 ++++++++++++--
 drivers/gpu/drm/radeon/radeon_ring.c |    3 +++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 21b9a75..6070c3e 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -576,6 +576,7 @@ void radeon_irq_kms_pflip_irq_put(struct radeon_device 
*rdev, int crtc);
 /*
  * CP & rings.
  */
+struct radeon_cs_reloc;

 struct radeon_ib {
        struct radeon_sa_bo     sa_bo;
@@ -585,6 +586,8 @@ struct radeon_ib {
        struct radeon_fence     *fence;
        unsigned                vm_id;
        bool                    is_const_ib;
+       unsigned                nrelocs;
+       struct radeon_cs_reloc  *relocs;
 };

 struct radeon_ring {
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c 
b/drivers/gpu/drm/radeon/radeon_cs.c
index c3273b8..a3ce65a 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -313,7 +313,6 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser 
*parser, int error)
                }
        }
        kfree(parser->track);
-       kfree(parser->relocs);
        kfree(parser->relocs_ptr);
        for (i = 0; i < parser->nchunks; i++) {
                kfree(parser->chunks[i].kdata);
@@ -324,7 +323,18 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser 
*parser, int error)
        }
        kfree(parser->chunks);
        kfree(parser->chunks_array);
-       radeon_ib_free(parser->rdev, &parser->ib);
+
+       if (parser->ib) {
+               /* keep the relocs for debugging */
+               parser->ib->nrelocs = parser->nrelocs;
+               parser->ib->relocs = parser->relocs;
+
+               /* even if we locally free it the ib stays
+                  alive until it is processed */
+               radeon_ib_free(parser->rdev, &parser->ib);
+       } else {
+               kfree(parser->relocs);
+       }
 }

 static int radeon_cs_ib_chunk(struct radeon_device *rdev,
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c 
b/drivers/gpu/drm/radeon/radeon_ring.c
index 992a615..1c4348c 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -97,6 +97,8 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
        (*ib)->gpu_addr += (*ib)->sa_bo.offset;
        (*ib)->vm_id = 0;
        (*ib)->is_const_ib = false;
+       (*ib)->nrelocs = 0;
+       (*ib)->relocs = NULL;

        return 0;
 }
@@ -118,6 +120,7 @@ void radeon_ib_free(struct radeon_device *rdev, struct 
radeon_ib **ib)
        if (destroy) {
                radeon_sa_bo_free(rdev, &tmp->sa_bo);
                radeon_fence_unref(&tmp->fence);
+               kfree(tmp->relocs);
                kfree(tmp);
        }
 }
-- 
1.7.5.4

Reply via email to