Mesa (master): r600g/compute: Fix possible endless loop in compute_memory_pool allocations.

Tom Stellard tstellar at kemper.freedesktop.org
Tue Jun 24 16:43:45 UTC 2014


Module: Mesa
Branch: master
Commit: 9575225e12c66bf409ce2269400f9ad148ffe0a2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9575225e12c66bf409ce2269400f9ad148ffe0a2

Author: Jan Vesely <jan.vesely at rutgers.edu>
Date:   Thu Jun 19 20:20:00 2014 +0200

r600g/compute: Fix possible endless loop in compute_memory_pool allocations.

The important part is the change of the condition to <= 0. Otherwise the loop
gets stuck never actually growing the pool.

The change in the aux-need calculation guarantees max 2 iterations, and
avoids wasting memory in case a smaller item can't fit into a relatively larger
pool.

Reviewed-by: Bruno Jiménez <brunojimen at gmail.com>
Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>

---

 src/gallium/drivers/r600/compute_memory_pool.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 691c938..9cb16f8 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -323,8 +323,11 @@ int compute_memory_promote_item(struct compute_memory_pool *pool,
 		int64_t need = item->size_in_dw + 2048 -
 			(pool->size_in_dw - allocated);
 
-		if (need < 0) {
-			need = pool->size_in_dw / 10;
+		if (need <= 0) {
+			/* There's enough free space, but it's too
+			 * fragmented. Assume half of the item can fit
+			 * int the last chunk */
+			need = (item->size_in_dw / 2) + ITEM_ALIGNMENT;
 		}
 
 		need = align(need, ITEM_ALIGNMENT);




More information about the mesa-commit mailing list