[Mesa-dev] [PATCH 10/12] r600g/compute: Fix possible endless loop in compute_memory_pool allocations.
Bruno Jiménez
brunojimen at gmail.com
Thu Jun 19 11:20:00 PDT 2014
From: Jan Vesely <jan.vesely at rutgers.edu>
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.
Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
CC: Bruno Jimenez <brunojimen at gmail.com>
---
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 518ea65..a78ff1e 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);
--
2.0.0
More information about the mesa-dev
mailing list