diff --git a/.pick_status.json b/.pick_status.json index f1604d47eb2..2a2e4bc0343 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -76,7 +76,7 @@ "description": "iris: avoid stack overflow in iris_bo_wait_syncobj()", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index e788305ae80..1d68460de17 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -50,6 +50,7 @@ #include "errno.h" #include "common/intel_aux_map.h" #include "common/intel_clflush.h" +#include "c99_alloca.h" #include "dev/intel_debug.h" #include "common/intel_gem.h" #include "dev/intel_device_info.h" @@ -455,7 +456,10 @@ iris_bo_wait_syncobj(struct iris_bo *bo, int64_t timeout_ns) simple_mtx_lock(&bufmgr->bo_deps_lock); - uint32_t handles[bo->deps_size * IRIS_BATCH_COUNT * 2]; + const int handles_len = bo->deps_size * IRIS_BATCH_COUNT * 2; + uint32_t *handles = handles_len <= 32 ? + (uint32_t *)alloca(handles_len * sizeof(*handles)) : + (uint32_t *)malloc(handles_len * sizeof(*handles)); int handle_count = 0; for (int d = 0; d < bo->deps_size; d++) { @@ -499,6 +503,8 @@ iris_bo_wait_syncobj(struct iris_bo *bo, int64_t timeout_ns) } out: + if (handles_len > 32) + free(handles); simple_mtx_unlock(&bufmgr->bo_deps_lock); return ret; }