[PATCH 23/24] drm/radeon: keep the cs relocs inside the ib

j.glisse at gmail.com j.glisse at gmail.com
Wed Apr 25 12:03:28 PDT 2012


From: Christian König <deathsimple at 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



More information about the dri-devel mailing list