[PATCH i-g-t 1/3] lib/amdgpu: add timeout support for user queue submissions

vitaly prosyak vprosyak at amd.com
Fri May 9 02:42:04 UTC 2025


The change looks good to me

Reviewed-by Vitaly Prosyak <vitaly.prosyak at amd.com>

On 2025-05-08 22:33, vitaly prosyak wrote:
> The change looks good to me
>
> Reviewed-by Vitaly Prosyak <vitaly.prosyak at amd.com>
>
> On 2025-05-08 02:07, Jesse.Zhang wrote:
>> This patch adds timeout control for user queue operations in IGT's AMDGPU
>> tests by:
>>
>> 1. Adding a time_out field to struct amdgpu_ring_context to store per-ring
>>    timeout values
>> 2. Modifying amdgpu_user_queue_submit() to use the specified timeout or
>>    default to INT64_MAX (infinite wait) if not set
>> 3. Passing the timeout value to amdgpu_cs_syncobj_wait()
>>
>> The changes allow tests to specify timeout values for user queue operations
>> rather than always using an infinite wait. This provides better control
>> over test execution and helps prevent hangs during test development and
>> debugging.
>>
>> Cc: Prosyak, Vitaly <Vitaly.Prosyak at amd.com>
>> Cc: Sunil Khatri <sunil.khatri at amd.com>
>> Cc: Christian Koenig <christian.koenig at amd.com>
>> Cc: Alexander Deucher <alexander.deucher at amd.com>
>>
>> Signed-off-by: Jesse Zhang <jesse.zhang at amd.com>
>> ---
>>  lib/amdgpu/amd_command_submission.c | 3 +++
>>  lib/amdgpu/amd_ip_blocks.h          | 1 +
>>  lib/amdgpu/amd_userq.c              | 4 ++--
>>  3 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/amdgpu/amd_command_submission.c b/lib/amdgpu/amd_command_submission.c
>> index 80d03a498..fcc356f8f 100644
>> --- a/lib/amdgpu/amd_command_submission.c
>> +++ b/lib/amdgpu/amd_command_submission.c
>> @@ -153,6 +153,7 @@ void amdgpu_command_submission_write_linear_helper(amdgpu_device_handle device,
>>  	ring_context->pm4_size = pm4_dw;
>>  	ring_context->res_cnt = 1;
>>  	ring_context->user_queue = user_queue;
>> +	ring_context->time_out = 0;
>>  	igt_assert(ring_context->pm4);
>>  
>>  	r = amdgpu_query_hw_ip_info(device, ip_block->type, 0, &ring_context->hw_ip_info);
>> @@ -280,6 +281,7 @@ void amdgpu_command_submission_const_fill_helper(amdgpu_device_handle device,
>>  	ring_context->pm4_size = pm4_dw;
>>  	ring_context->res_cnt = 1;
>>  	ring_context->user_queue = user_queue;
>> +	ring_context->time_out = 0;
>>  	igt_assert(ring_context->pm4);
>>  	r = amdgpu_query_hw_ip_info(device, ip_block->type, 0, &ring_context->hw_ip_info);
>>  	igt_assert_eq(r, 0);
>> @@ -374,6 +376,7 @@ void amdgpu_command_submission_copy_linear_helper(amdgpu_device_handle device,
>>  	ring_context->pm4_size = pm4_dw;
>>  	ring_context->res_cnt = 2;
>>  	ring_context->user_queue = user_queue;
>> +	ring_context->time_out = 0;
>>  	igt_assert(ring_context->pm4);
>>  	r = amdgpu_query_hw_ip_info(device, ip_block->type, 0, &ring_context->hw_ip_info);
>>  	igt_assert_eq(r, 0);
>> diff --git a/lib/amdgpu/amd_ip_blocks.h b/lib/amdgpu/amd_ip_blocks.h
>> index 3c2ecd1ba..a6c35c171 100644
>> --- a/lib/amdgpu/amd_ip_blocks.h
>> +++ b/lib/amdgpu/amd_ip_blocks.h
>> @@ -175,6 +175,7 @@ struct amdgpu_ring_context {
>>  	uint32_t timeline_syncobj_handle;
>>  	uint64_t point;
>>  	bool user_queue;
>> +	uint64_t time_out;
>>  
>>  	struct drm_amdgpu_info_uq_fw_areas info;
>>  };
>> diff --git a/lib/amdgpu/amd_userq.c b/lib/amdgpu/amd_userq.c
>> index 50d058609..f8e1a4b45 100644
>> --- a/lib/amdgpu/amd_userq.c
>> +++ b/lib/amdgpu/amd_userq.c
>> @@ -133,7 +133,7 @@ void amdgpu_user_queue_submit(amdgpu_device_handle device, struct amdgpu_ring_co
>>  	uint32_t control = ring_context->pm4_dw;
>>  	uint32_t syncarray[1];
>>  	struct drm_amdgpu_userq_signal signal_data;
>> -
>> +	uint64_t timeout = ring_context->time_out ? ring_context->time_out : INT64_MAX;
>>  
>>  	amdgpu_pkt_begin();
>>  	/* Prepare the Indirect IB to submit the IB to user queue */
>> @@ -179,7 +179,7 @@ void amdgpu_user_queue_submit(amdgpu_device_handle device, struct amdgpu_ring_co
>>  	r = amdgpu_userq_signal(device, &signal_data);
>>  	igt_assert_eq(r, 0);
>>  
>> -	r = amdgpu_cs_syncobj_wait(device, &ring_context->timeline_syncobj_handle, 1, INT64_MAX,
>> +	r = amdgpu_cs_syncobj_wait(device, &ring_context->timeline_syncobj_handle, 1, timeout,
>>  				   DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL, NULL);
>>  	igt_assert_eq(r, 0);
>>  }


More information about the igt-dev mailing list