[PATCH v2 02/23] drm/xe: Modify xe_force_wake_put to handle _get returned mask

Ghimiray, Himal Prasad himal.prasad.ghimiray at intel.com
Fri Sep 13 04:05:28 UTC 2024



On 13-09-2024 03:04, Michal Wajdeczko wrote:
> 
> 
> On 12.09.2024 21:15, Himal Prasad Ghimiray wrote:
>> Instead of calling xe_force_wake_put on all domains that were input to
>> xe_force_wake_get, call _put only on the domains whose reference counts
>> were successfully incremented by the _get call. Since the return value
>> of _get can be a mask that does not match any specific value in the enum
>> xe_force_wake_domains, change the input parameter of _put to int.
>>
>> Add kernel-doc for the xe_force_wake_put()
>>
>> Cc: Badal Nilawar <badal.nilawar at intel.com>
>> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
>> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>> Cc: Nirmoy Das <nirmoy.das at intel.com>
>> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray at intel.com>
>> ---
>>   drivers/gpu/drm/xe/xe_force_wake.c | 24 ++++++++++++++++++++++--
>>   drivers/gpu/drm/xe/xe_force_wake.h |  2 +-
>>   2 files changed, 23 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_force_wake.c b/drivers/gpu/drm/xe/xe_force_wake.c
>> index fa42d652d23f..e91bbcbddb8b 100644
>> --- a/drivers/gpu/drm/xe/xe_force_wake.c
>> +++ b/drivers/gpu/drm/xe/xe_force_wake.c
>> @@ -198,8 +198,21 @@ int xe_force_wake_get(struct xe_force_wake *fw,
>>   	return ret;
>>   }
>>   
>> +/**
>> + * xe_force_wake_put - Decrement the refcount and put domain to sleep if refcount becomes 0
>> + * @fw: Pointer to the force wake structure
>> + * @domains_mask: forcewake domain mask to put reference
>> + *
>> + * This function reduces the reference counts for specified domain mask. If
>> + * refcount for any of the specified domain reaches 0, it puts the domain to sleep
>> + * and waits for acknowledgment for domain to sleep within specified timeout.
>> + * Ensure this function is always called with return of xe_force_wake_get() as
>> + * @domains_mask.
>> + *
>> + * Returns 0 in case of success or non-zero in case of timeout of ack
> 
> what's the expectation for the caller when this function returns an
> error? if just WARN() then maybe this can be done inside this function
> and we can make it void ?

Completely agreed here. Currently the failure is returned as error 
leading to abort/further escalation in few cases. IMO, xe_force_wake_put 
failure shouldn't be leading to abort/furtherescalation therefore have 
raised a patch for the same and is part of this series:

[PATCH v2 23/23] drm/xe: Change return type to void for xe_force_wake_put


> 
>> + */
>>   int xe_force_wake_put(struct xe_force_wake *fw,
>> -		      enum xe_force_wake_domains domains)
>> +		      int domains_mask)
>>   {
>>   	struct xe_gt *gt = fw->gt;
>>   	struct xe_force_wake_domain *domain;
>> @@ -207,8 +220,15 @@ int xe_force_wake_put(struct xe_force_wake *fw,
>>   	unsigned long flags;
>>   	int ret = 0;
>>   
>> +	/*
>> +	 * Avoid unnecessary lock and unlock when the function is called
>> +	 * in error path of individual domains.
>> +	 */
>> +	if (!domains_mask)
>> +		return 0;
>> +
>>   	spin_lock_irqsave(&fw->lock, flags);
>> -	for_each_fw_domain_masked(domain, domains, fw, tmp) {
>> +	for_each_fw_domain_masked(domain, domains_mask, fw, tmp) {
>>   		if (!--domain->ref) {
>>   			sleep |= BIT(domain->id);
>>   			domain_sleep(gt, domain);
>> diff --git a/drivers/gpu/drm/xe/xe_force_wake.h b/drivers/gpu/drm/xe/xe_force_wake.h
>> index a2577672f4e3..e2bb6b03e495 100644
>> --- a/drivers/gpu/drm/xe/xe_force_wake.h
>> +++ b/drivers/gpu/drm/xe/xe_force_wake.h
>> @@ -18,7 +18,7 @@ void xe_force_wake_init_engines(struct xe_gt *gt,
>>   int xe_force_wake_get(struct xe_force_wake *fw,
>>   		      enum xe_force_wake_domains domains);
>>   int xe_force_wake_put(struct xe_force_wake *fw,
>> -		      enum xe_force_wake_domains domains);
>> +		      int domains_mask);
>>   
>>   static inline int
>>   xe_force_wake_ref(struct xe_force_wake *fw,


More information about the Intel-xe mailing list