From 26d695c5de61a5b9138f88ce1fb4d20a478a97b9 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 22 Mar 2022 16:25:11 -0400 Subject: [PATCH] lavapipe: enforce monotonic timeline incrementing maybe just being overly paranoid, but make sure that the timeline id gets compared while the lock is held in every scenario cc: mesa-stable Reviewed-by: Omar Akkila Reviewed-by: Dave Airlie Part-of: (cherry picked from commit 5461a1cbaa40731e82e2a1751cf4e862463aeb8e) --- .pick_status.json | 2 +- src/gallium/frontends/lavapipe/lvp_device.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 09004721c36..6d57c1edfc9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1700,7 +1700,7 @@ "description": "lavapipe: enforce monotonic timeline incrementing", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "because_sha": null }, { diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index a91a85114d0..8809cb2b2cb 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -1622,7 +1622,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_QueueWaitIdle( if (queue->last_fence) { queue->device->pscreen->fence_finish(queue->device->pscreen, NULL, queue->last_fence, PIPE_TIMEOUT_INFINITE); queue->device->pscreen->fence_reference(queue->device->pscreen, &queue->device->queue.last_fence, NULL); - queue->last_finished = timeline; + if (timeline > queue->last_finished) + queue->last_finished = timeline; } simple_mtx_unlock(&queue->last_lock); return VK_SUCCESS; @@ -2136,7 +2137,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetFenceStatus( simple_mtx_lock(&device->queue.last_lock); if (fence->handle == device->queue.last_fence) { device->pscreen->fence_reference(device->pscreen, &device->queue.last_fence, NULL); - device->queue.last_finished = fence->timeline; + if (fence->timeline > device->queue.last_finished) + device->queue.last_finished = fence->timeline; } simple_mtx_unlock(&device->queue.last_lock); return VK_SUCCESS; @@ -2252,7 +2254,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_WaitForFences( simple_mtx_lock(&device->queue.last_lock); if (fence->handle == device->queue.last_fence) { device->pscreen->fence_reference(device->pscreen, &device->queue.last_fence, NULL); - device->queue.last_finished = fence->timeline; + if (fence->timeline > device->queue.last_finished) + device->queue.last_finished = fence->timeline; } simple_mtx_unlock(&device->queue.last_lock); fence->signalled = true;