[Mesa-dev] [PATCH 1/2] r600: Fix possible endless loop in compute_memory_pool allocations.
Bruno Jimenez
brunojimen at gmail.com
Thu Jun 19 08:27:27 PDT 2014
Hi,
Thanks for catching this bug!
Reviewed-by: Bruno Jiménez <brunojimen at gmail.com>
Also, could you please send me a copy of the tests?
On Thu, 2014-06-19 at 10:21 -0400, Jan Vesely wrote:
> 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>
> ---
>
> This fixes hang in gegl colors.xml test
>
> 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 ec8c470..0b6d2da6 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.c
> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
> @@ -320,8 +320,11 @@ int compute_memory_finalize_pending(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-dev
mailing list