diff --git a/.pick_status.json b/.pick_status.json index 840767d4079..c832f4478ca 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -310,7 +310,7 @@ "description": "tu/kgsl: Fix memory leak of tmp allocations during submissions", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/freedreno/vulkan/tu_knl_kgsl.cc b/src/freedreno/vulkan/tu_knl_kgsl.cc index 34627f29d7d..31425651656 100644 --- a/src/freedreno/vulkan/tu_knl_kgsl.cc +++ b/src/freedreno/vulkan/tu_knl_kgsl.cc @@ -1120,8 +1120,7 @@ kgsl_queue_submit(struct tu_queue *queue, struct vk_queue_submit *vk_submit) if (ret) { result = vk_device_set_lost(&queue->device->vk, "submit failed: %s\n", strerror(errno)); - pthread_mutex_unlock(&queue->device->submit_mutex); - return result; + goto fail_submit; } queue->last_submit_timestamp = req.timestamp; @@ -1140,6 +1139,21 @@ kgsl_queue_submit(struct tu_queue *queue, struct vk_queue_submit *vk_submit) pthread_mutex_unlock(&queue->device->submit_mutex); pthread_cond_broadcast(&queue->device->timeline_cond); + if (cmd_buffers != (struct tu_cmd_buffer **) vk_submit->command_buffers) + vk_free(&queue->device->vk.alloc, cmd_buffers); + + vk_free(&queue->device->vk.alloc, cmds); + + return VK_SUCCESS; + +fail_submit: + pthread_mutex_unlock(&queue->device->submit_mutex); + + if (cmd_buffers != (struct tu_cmd_buffer **) vk_submit->command_buffers) + vk_free(&queue->device->vk.alloc, cmd_buffers); + + vk_free(&queue->device->vk.alloc, cmds); + return result; }