aux/trace: move fence_server calls outside the locked area

Multiple contexts can use those causing deadlocks if e.g. fence_get_fd
gets called before fence_server_signal on another thread on the same
pipe_fence_handle.

Cc: mesa-stable
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36819>
(cherry picked from commit d9c3bbb08c)
This commit is contained in:
Karol Herbst 2025-08-18 15:16:12 +02:00 committed by Eric Engestrom
parent 049afa43d3
commit 4fdc7e990d
3 changed files with 6 additions and 9 deletions

View file

@ -5374,7 +5374,7 @@
"description": "aux/trace: move fence_server calls outside the locked area",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null,
"notes": null

View file

@ -1626,14 +1626,14 @@ trace_context_fence_server_sync(struct pipe_context *_pipe,
struct trace_context *tr_ctx = trace_context(_pipe);
struct pipe_context *pipe = tr_ctx->pipe;
pipe->fence_server_sync(pipe, fence, timeline_value);
trace_dump_call_begin("pipe_context", "fence_server_sync");
trace_dump_arg(ptr, pipe);
trace_dump_arg(ptr, fence);
trace_dump_arg(uint, timeline_value);
pipe->fence_server_sync(pipe, fence, timeline_value);
trace_dump_call_end();
}
@ -1646,14 +1646,14 @@ trace_context_fence_server_signal(struct pipe_context *_pipe,
struct trace_context *tr_ctx = trace_context(_pipe);
struct pipe_context *pipe = tr_ctx->pipe;
pipe->fence_server_signal(pipe, fence, timeline_value);
trace_dump_call_begin("pipe_context", "fence_server_signal");
trace_dump_arg(ptr, pipe);
trace_dump_arg(ptr, fence);
trace_dump_arg(uint, timeline_value);
pipe->fence_server_signal(pipe, fence, timeline_value);
trace_dump_call_end();
}

View file

@ -965,15 +965,12 @@ trace_screen_fence_get_fd(struct pipe_screen *_screen,
{
struct trace_screen *tr_scr = trace_screen(_screen);
struct pipe_screen *screen = tr_scr->screen;
int result;
int result = screen->fence_get_fd(screen, fence);
trace_dump_call_begin("pipe_screen", "fence_get_fd");
trace_dump_arg(ptr, screen);
trace_dump_arg(ptr, fence);
result = screen->fence_get_fd(screen, fence);
trace_dump_ret(int, result);
trace_dump_call_end();