summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPauli Nieminen <suokkos@gmail.com>2009-09-20 22:24:35 +0300
committerPauli Nieminen <suokkos@gmail.com>2009-09-20 22:28:52 +0300
commit284a7af274bc148f112bd0ebb40583923ee26b49 (patch)
tree7e59c977616c58ea557336dbda55d46e57cc1d8a
parent7e3b8b0d8fdfd7cffbb57afce67a3fe54827d90a (diff)
radeon: Fix legacy bo not to reuse dma buffers before refcount is 1.
This should help detecting possible memory leaks with dma buffers and prevent possible visual corruption if data would be overwriten too early.
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_dma.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/radeon/radeon_dma.c b/src/mesa/drivers/dri/radeon/radeon_dma.c
index c9a32c808be..c6edbae9a1b 100644
--- a/src/mesa/drivers/dri/radeon/radeon_dma.c
+++ b/src/mesa/drivers/dri/radeon/radeon_dma.c
@@ -207,7 +207,6 @@ again_alloc:
counter on unused buffers for later freeing them from
begin of list */
dma_bo = last_elem(&rmesa->dma.free);
- assert(dma_bo->bo->cref == 1);
remove_from_list(dma_bo);
insert_at_head(&rmesa->dma.reserved, dma_bo);
}
@@ -307,6 +306,10 @@ static int radeon_bo_is_idle(struct radeon_bo* bo)
WARN_ONCE("Your libdrm or kernel doesn't have support for busy query.\n"
"This may cause small performance drop for you.\n");
}
+ /* Protect against bug in legacy bo handling that causes bos stay
+ * referenced even after they should be freed */
+ if (bo->cref != 1)
+ return 0;
return ret != -EBUSY;
}
@@ -343,7 +346,9 @@ void radeonReleaseDmaRegions(radeonContextPtr rmesa)
foreach_s(dma_bo, temp, &rmesa->dma.wait) {
if (dma_bo->expire_counter == time) {
WARN_ONCE("Leaking dma buffer object!\n");
- radeon_bo_unref(dma_bo->bo);
+ /* force free of buffer so we don't realy start
+ * leaking stuff now*/
+ while ((dma_bo->bo = radeon_bo_unref(dma_bo->bo))) {}
remove_from_list(dma_bo);
FREE(dma_bo);
continue;