intel/ds: lock submissions to u_trace_context
This allows for submissions to be outside the global anv_device mutex. Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Acked-by: Emma Anholt <emma@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24744>
This commit is contained in:

committed by
Marge Bot

parent
a851dc5e3c
commit
a5f58e5f85
@@ -270,8 +270,7 @@ iris_fence_flush(struct pipe_context *ctx,
|
|||||||
iris_measure_frame_end(ice);
|
iris_measure_frame_end(ice);
|
||||||
}
|
}
|
||||||
|
|
||||||
u_trace_context_process(&ice->ds.trace_context,
|
intel_ds_device_process(&ice->ds, flags & PIPE_FLUSH_END_OF_FRAME);
|
||||||
flags & PIPE_FLUSH_END_OF_FRAME);
|
|
||||||
|
|
||||||
if (!out_fence)
|
if (!out_fence)
|
||||||
return;
|
return;
|
||||||
|
@@ -168,7 +168,7 @@ void iris_utrace_flush(struct iris_batch *batch, uint64_t submission_id)
|
|||||||
{
|
{
|
||||||
struct intel_ds_flush_data *flush_data = malloc(sizeof(*flush_data));
|
struct intel_ds_flush_data *flush_data = malloc(sizeof(*flush_data));
|
||||||
intel_ds_flush_data_init(flush_data, &batch->ds, submission_id);
|
intel_ds_flush_data_init(flush_data, &batch->ds, submission_id);
|
||||||
u_trace_flush(&batch->trace, flush_data, false);
|
intel_ds_queue_flush_data(&batch->ds, &batch->trace, flush_data, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void iris_utrace_init(struct iris_context *ice)
|
void iris_utrace_init(struct iris_context *ice)
|
||||||
|
@@ -555,12 +555,14 @@ intel_ds_device_init(struct intel_ds_device *device,
|
|||||||
device->iid = get_iid();
|
device->iid = get_iid();
|
||||||
device->api = api;
|
device->api = api;
|
||||||
list_inithead(&device->queues);
|
list_inithead(&device->queues);
|
||||||
|
simple_mtx_init(&device->trace_context_mutex, mtx_plain);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
intel_ds_device_fini(struct intel_ds_device *device)
|
intel_ds_device_fini(struct intel_ds_device *device)
|
||||||
{
|
{
|
||||||
u_trace_context_fini(&device->trace_context);
|
u_trace_context_fini(&device->trace_context);
|
||||||
|
simple_mtx_destroy(&device->trace_context_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct intel_ds_queue *
|
struct intel_ds_queue *
|
||||||
@@ -606,6 +608,24 @@ void intel_ds_flush_data_fini(struct intel_ds_flush_data *data)
|
|||||||
u_trace_fini(&data->trace);
|
u_trace_fini(&data->trace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void intel_ds_queue_flush_data(struct intel_ds_queue *queue,
|
||||||
|
struct u_trace *ut,
|
||||||
|
struct intel_ds_flush_data *data,
|
||||||
|
bool free_data)
|
||||||
|
{
|
||||||
|
simple_mtx_lock(&queue->device->trace_context_mutex);
|
||||||
|
u_trace_flush(ut, data, free_data);
|
||||||
|
simple_mtx_unlock(&queue->device->trace_context_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void intel_ds_device_process(struct intel_ds_device *device,
|
||||||
|
bool eof)
|
||||||
|
{
|
||||||
|
simple_mtx_lock(&device->trace_context_mutex);
|
||||||
|
u_trace_context_process(&device->trace_context, eof);
|
||||||
|
simple_mtx_unlock(&device->trace_context_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -112,6 +112,9 @@ struct intel_ds_device {
|
|||||||
*/
|
*/
|
||||||
uint64_t event_id;
|
uint64_t event_id;
|
||||||
|
|
||||||
|
/* Protects submissions of u_trace data to trace_context */
|
||||||
|
simple_mtx_t trace_context_mutex;
|
||||||
|
|
||||||
struct u_trace_context trace_context;
|
struct u_trace_context trace_context;
|
||||||
|
|
||||||
/* List of intel_ds_queue */
|
/* List of intel_ds_queue */
|
||||||
@@ -183,6 +186,13 @@ void intel_ds_flush_data_init(struct intel_ds_flush_data *data,
|
|||||||
|
|
||||||
void intel_ds_flush_data_fini(struct intel_ds_flush_data *data);
|
void intel_ds_flush_data_fini(struct intel_ds_flush_data *data);
|
||||||
|
|
||||||
|
void intel_ds_queue_flush_data(struct intel_ds_queue *queue,
|
||||||
|
struct u_trace *ut,
|
||||||
|
struct intel_ds_flush_data *data,
|
||||||
|
bool free_data);
|
||||||
|
|
||||||
|
void intel_ds_device_process(struct intel_ds_device *device, bool eof);
|
||||||
|
|
||||||
#ifdef HAVE_PERFETTO
|
#ifdef HAVE_PERFETTO
|
||||||
|
|
||||||
uint64_t intel_ds_begin_submit(struct intel_ds_queue *queue);
|
uint64_t intel_ds_begin_submit(struct intel_ds_queue *queue);
|
||||||
|
@@ -1481,10 +1481,10 @@ anv_queue_submit(struct vk_queue *vk_queue,
|
|||||||
/* Take submission ID under lock */
|
/* Take submission ID under lock */
|
||||||
intel_ds_end_submit(&queue->ds, start_ts);
|
intel_ds_end_submit(&queue->ds, start_ts);
|
||||||
|
|
||||||
u_trace_context_process(&device->ds.trace_context, true);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&device->mutex);
|
pthread_mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
|
intel_ds_device_process(&device->ds, true);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -232,7 +232,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
&submit->batch);
|
&submit->batch);
|
||||||
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
||||||
if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
|
if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
|
||||||
u_trace_flush(&cmd_buffers[i]->trace, submit, false);
|
intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
|
||||||
|
&submit->ds, false);
|
||||||
} else {
|
} else {
|
||||||
u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
|
u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
|
||||||
u_trace_end_iterator(&cmd_buffers[i]->trace),
|
u_trace_end_iterator(&cmd_buffers[i]->trace),
|
||||||
@@ -258,7 +259,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
|
|
||||||
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
||||||
if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
|
if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
|
||||||
u_trace_flush(&cmd_buffers[i]->trace, submit, false);
|
intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
|
||||||
|
&submit->ds, false);
|
||||||
} else {
|
} else {
|
||||||
u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
|
u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
|
||||||
u_trace_end_iterator(&cmd_buffers[i]->trace),
|
u_trace_end_iterator(&cmd_buffers[i]->trace),
|
||||||
@@ -271,7 +273,7 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
anv_genX(device->info, emit_simple_shader_end)(&submit->simple_state);
|
anv_genX(device->info, emit_simple_shader_end)(&submit->simple_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
u_trace_flush(&submit->ds.trace, submit, true);
|
intel_ds_queue_flush_data(&queue->ds, &submit->ds.trace, &submit->ds, true);
|
||||||
|
|
||||||
if (submit->batch.status != VK_SUCCESS) {
|
if (submit->batch.status != VK_SUCCESS) {
|
||||||
result = submit->batch.status;
|
result = submit->batch.status;
|
||||||
@@ -280,7 +282,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
} else {
|
} else {
|
||||||
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
||||||
assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
|
assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
|
||||||
u_trace_flush(&cmd_buffers[i]->trace, submit, i == (cmd_buffer_count - 1));
|
intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
|
||||||
|
&submit->ds, i == (cmd_buffer_count - 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,7 +448,7 @@ anv_device_utrace_init(struct anv_device *device)
|
|||||||
void
|
void
|
||||||
anv_device_utrace_finish(struct anv_device *device)
|
anv_device_utrace_finish(struct anv_device *device)
|
||||||
{
|
{
|
||||||
u_trace_context_process(&device->ds.trace_context, true);
|
intel_ds_device_process(&device->ds, true);
|
||||||
intel_ds_device_fini(&device->ds);
|
intel_ds_device_fini(&device->ds);
|
||||||
anv_bo_pool_finish(&device->utrace_bo_pool);
|
anv_bo_pool_finish(&device->utrace_bo_pool);
|
||||||
}
|
}
|
||||||
@@ -574,7 +577,7 @@ anv_queue_trace(struct anv_queue *queue, const char *label, bool frame, bool beg
|
|||||||
goto error_reloc_list;
|
goto error_reloc_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
u_trace_flush(&submit->ds.trace, submit, true);
|
intel_ds_queue_flush_data(&queue->ds, &submit->ds.trace, &submit->ds, true);
|
||||||
|
|
||||||
pthread_mutex_lock(&device->mutex);
|
pthread_mutex_lock(&device->mutex);
|
||||||
device->kmd_backend->queue_exec_trace(queue, submit);
|
device->kmd_backend->queue_exec_trace(queue, submit);
|
||||||
@@ -617,7 +620,7 @@ anv_QueueEndDebugUtilsLabelEXT(VkQueue _queue)
|
|||||||
anv_queue_trace(queue, label->pLabelName,
|
anv_queue_trace(queue, label->pLabelName,
|
||||||
false /* frame */, false /* begin */);
|
false /* frame */, false /* begin */);
|
||||||
|
|
||||||
u_trace_context_process(&queue->device->ds.trace_context, true);
|
intel_ds_device_process(&queue->device->ds, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
vk_common_QueueEndDebugUtilsLabelEXT(_queue);
|
vk_common_QueueEndDebugUtilsLabelEXT(_queue);
|
||||||
|
@@ -148,7 +148,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
&flush->batch);
|
&flush->batch);
|
||||||
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
||||||
if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
|
if (cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) {
|
||||||
u_trace_flush(&cmd_buffers[i]->trace, flush, false);
|
intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
|
||||||
|
&flush->ds, false);
|
||||||
} else {
|
} else {
|
||||||
u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
|
u_trace_clone_append(u_trace_begin_iterator(&cmd_buffers[i]->trace),
|
||||||
u_trace_end_iterator(&cmd_buffers[i]->trace),
|
u_trace_end_iterator(&cmd_buffers[i]->trace),
|
||||||
@@ -159,7 +160,7 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
}
|
}
|
||||||
anv_genX(device->info, emit_so_memcpy_fini)(&flush->memcpy_state);
|
anv_genX(device->info, emit_so_memcpy_fini)(&flush->memcpy_state);
|
||||||
|
|
||||||
u_trace_flush(&flush->ds.trace, flush, true);
|
intel_ds_queue_flush_data(&queue->ds, &flush->ds.trace, &flush->ds, true);
|
||||||
|
|
||||||
if (flush->batch.status != VK_SUCCESS) {
|
if (flush->batch.status != VK_SUCCESS) {
|
||||||
result = flush->batch.status;
|
result = flush->batch.status;
|
||||||
@@ -168,7 +169,8 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
|
|||||||
} else {
|
} else {
|
||||||
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
for (uint32_t i = 0; i < cmd_buffer_count; i++) {
|
||||||
assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
|
assert(cmd_buffers[i]->usage_flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
|
||||||
u_trace_flush(&cmd_buffers[i]->trace, flush, i == (cmd_buffer_count - 1));
|
intel_ds_queue_flush_data(&queue->ds, &cmd_buffers[i]->trace,
|
||||||
|
&flush->ds, i == (cmd_buffer_count - 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +295,7 @@ anv_device_utrace_init(struct anv_device *device)
|
|||||||
void
|
void
|
||||||
anv_device_utrace_finish(struct anv_device *device)
|
anv_device_utrace_finish(struct anv_device *device)
|
||||||
{
|
{
|
||||||
u_trace_context_process(&device->ds.trace_context, true);
|
intel_ds_device_process(&device->ds, true);
|
||||||
intel_ds_device_fini(&device->ds);
|
intel_ds_device_fini(&device->ds);
|
||||||
anv_bo_pool_finish(&device->utrace_bo_pool);
|
anv_bo_pool_finish(&device->utrace_bo_pool);
|
||||||
}
|
}
|
||||||
|
@@ -112,7 +112,7 @@ VkResult anv_QueuePresentKHR(
|
|||||||
_queue, 0,
|
_queue, 0,
|
||||||
pPresentInfo);
|
pPresentInfo);
|
||||||
|
|
||||||
u_trace_context_process(&device->ds.trace_context, true);
|
intel_ds_device_process(&device->ds, true);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user