From 3283415bbd9d291a20a2e02e1a76f6b1b4984eda Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 21 Feb 2024 11:04:51 -0500 Subject: [PATCH] zink: fix longstanding issue with active batch state recycling the previous code could recycle a currently-submitting state by hitting a race condition where zink_screen_check_last_finished(batch_id) returned true because batch_id was 0 this can no longer recycle the current batch, but the race should still be eliminated for consistency: check 'submitted' since this guarantees batch_id is valid cc: mesa-stable Part-of: --- src/gallium/drivers/zink/zink_batch.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 85f6c7c7b9e..01611452fab 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -460,8 +460,11 @@ get_batch_state(struct zink_context *ctx, struct zink_batch *batch) } /* states are stored sequentially, so if the first one doesn't work, none of them will */ if (!bs && ctx->batch_states && ctx->batch_states->next) { - if (zink_screen_check_last_finished(screen, ctx->batch_states->fence.batch_id) || - find_unused_state(ctx->batch_states)) { + /* only a submitted state can be reused */ + if (p_atomic_read(&ctx->batch_states->fence.submitted) && + /* a submitted state must have completed before it can be reused */ + (zink_screen_check_last_finished(screen, ctx->batch_states->fence.batch_id) || + p_atomic_read(&ctx->batch_states->fence.completed))) { bs = ctx->batch_states; pop_batch_state(ctx); }