[Intel-gfx] [PATCH] drm/i915/guc: Initialize GuC submission locks and queues early

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Feb 16 11:54:35 UTC 2022


On 15/02/2022 16:39, Ceraolo Spurio, Daniele wrote:
> On 2/15/2022 1:09 AM, Tvrtko Ursulin wrote:
>>
>> On 15/02/2022 01:11, Daniele Ceraolo Spurio wrote:
>>> Move initialization of submission-related spinlock, lists and workers to
>>> init_early. This fixes an issue where if the GuC init fails we might
>>> still try to get the lock in the context cleanup code. Note that it is
>>
>> What's the worst case impact on non-debug builds aka is Fixes: required?
> 
> There is no lock contention in this scenario and nothing is done within 
> the locked section (because submission is not initialized and all 
> contexts are marked as invalid), so no problems from the fact that the 
> lock doesn't work. Is that enough to avoid a fixes tag?

If the "lock doesn't work" is benign due no chance of touching 
uninitialised memory and then deadlocking then it's good. I just 
couldn't read that part from the commit message and did not have time to 
go dig into the code.

Regards,

Tvrtko

> Daniele
> 
>>
>> Regards,
>>
>> Tvrtko
>>
>>> safe to call the GuC context cleanup code even if the init failed
>>> because all contexts are initialized with an invalid GuC ID, which will
>>> cause the GuC side of the cleanup to be skipped, so it is easier to just
>>> make sure the variables are initialized than to special case the cleanup
>>> to handle the case when they're not.
>>>
>>> References: https://gitlab.freedesktop.org/drm/intel/-/issues/4932
>>> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>>> Cc: Matthew Brost <matthew.brost at intel.com>
>>> Cc: John Harrison <John.C.Harrison at Intel.com>
>>> ---
>>>   .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 27 ++++++++++---------
>>>   1 file changed, 14 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c 
>>> b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
>>> index b3a429a92c0da..2160da2c83cbf 100644
>>> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
>>> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
>>> @@ -1818,24 +1818,11 @@ int intel_guc_submission_init(struct 
>>> intel_guc *guc)
>>>        */
>>>       GEM_BUG_ON(!guc->lrc_desc_pool);
>>>   -    xa_init_flags(&guc->context_lookup, XA_FLAGS_LOCK_IRQ);
>>> -
>>> -    spin_lock_init(&guc->submission_state.lock);
>>> -    INIT_LIST_HEAD(&guc->submission_state.guc_id_list);
>>> -    ida_init(&guc->submission_state.guc_ids);
>>> - INIT_LIST_HEAD(&guc->submission_state.destroyed_contexts);
>>> -    INIT_WORK(&guc->submission_state.destroyed_worker,
>>> -          destroyed_worker_func);
>>> -    INIT_WORK(&guc->submission_state.reset_fail_worker,
>>> -          reset_fail_worker_func);
>>> -
>>>       guc->submission_state.guc_ids_bitmap =
>>>           bitmap_zalloc(NUMBER_MULTI_LRC_GUC_ID(guc), GFP_KERNEL);
>>>       if (!guc->submission_state.guc_ids_bitmap)
>>>           return -ENOMEM;
>>>   -    spin_lock_init(&guc->timestamp.lock);
>>> -    INIT_DELAYED_WORK(&guc->timestamp.work, guc_timestamp_ping);
>>>       guc->timestamp.ping_delay = (POLL_TIME_CLKS / 
>>> gt->clock_frequency + 1) * HZ;
>>>       guc->timestamp.shift = gpm_timestamp_shift(gt);
>>>   @@ -3831,6 +3818,20 @@ static bool __guc_submission_selected(struct 
>>> intel_guc *guc)
>>>     void intel_guc_submission_init_early(struct intel_guc *guc)
>>>   {
>>> +    xa_init_flags(&guc->context_lookup, XA_FLAGS_LOCK_IRQ);
>>> +
>>> +    spin_lock_init(&guc->submission_state.lock);
>>> +    INIT_LIST_HEAD(&guc->submission_state.guc_id_list);
>>> +    ida_init(&guc->submission_state.guc_ids);
>>> + INIT_LIST_HEAD(&guc->submission_state.destroyed_contexts);
>>> +    INIT_WORK(&guc->submission_state.destroyed_worker,
>>> +          destroyed_worker_func);
>>> +    INIT_WORK(&guc->submission_state.reset_fail_worker,
>>> +          reset_fail_worker_func);
>>> +
>>> +    spin_lock_init(&guc->timestamp.lock);
>>> +    INIT_DELAYED_WORK(&guc->timestamp.work, guc_timestamp_ping);
>>> +
>>>       guc->submission_state.num_guc_ids = GUC_MAX_LRC_DESCRIPTORS;
>>>       guc->submission_supported = __guc_submission_supported(guc);
>>>       guc->submission_selected = __guc_submission_selected(guc);
> 


More information about the Intel-gfx mailing list