r600g/compute: Fix possible endless loop in compute_memory_pool allocations.
authorJan Vesely <jan.vesely@rutgers.edu>
Thu, 19 Jun 2014 18:20:00 +0000 (20:20 +0200)
committerTom Stellard <thomas.stellard@amd.com>
Tue, 24 Jun 2014 16:36:55 +0000 (12:36 -0400)
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@gmail.com>
Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>
src/gallium/drivers/r600/compute_memory_pool.c

index 691c9383f15b2ddde14e7a48b61837e572ad3b2b..9cb16f8c29e42f08c10bd2b9bbcb55a500430c9e 100644 (file)
@@ -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);