From: Christian K?nig <deathsim...@vodafone.de>

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 6377f8c..7b2125b 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -567,6 +567,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;
@@ -576,6 +577,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 38e1496..ecef708 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -308,7 +308,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);
@@ -317,7 +316,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 f256eae..c635aad 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -95,6 +95,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;
 }
@@ -116,6 +118,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.7.6

Reply via email to