[Intel-gfx] [PATCH] drm/i915: Check caller held wakerefs in assert_forcewakes_active
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Jul 4 08:10:32 UTC 2019
On 03/07/2019 13:48, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2019-07-03 13:43:34)
>>
>> On 03/07/2019 13:12, Chris Wilson wrote:
>>> The intent of the assert is to document that the caller took the
>>> appropriate wakerefs for the function. However, as Tvrtko pointed out,
>>> we simply check whether the fw_domains are active and may be confused by
>>> the auto wakeref which may be dropped between the check and use. Let's
>>> be more careful in the assert and check that each fw_domain has an
>>> explicit caller wakeref above and beyond the automatic wakeref.
>>
>> Although we still don't know if it is our caller who took the fw or some
>> unrelated thread. Still, a more thorough check is better even if not
>> perfect.
>
> Since it's not a mutex, we can't stuff an owner field in here, the only
> way to properly track in that case would be to return cookies from
> forcewake_get and verify the cookies are still active.
>
> Not feeling the inclination to do that yet. Maybe if we get a few fw
> leaks.
Agreed, I wasn't trying to say we have to do it.
>
>>> Reported-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>>> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
>>> ---
>>> drivers/gpu/drm/i915/intel_uncore.c | 24 ++++++++++++++++++++++++
>>> 1 file changed, 24 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
>>> index 68d54e126d79..bc25a6e51463 100644
>>> --- a/drivers/gpu/drm/i915/intel_uncore.c
>>> +++ b/drivers/gpu/drm/i915/intel_uncore.c
>>> @@ -738,6 +738,12 @@ void assert_forcewakes_inactive(struct intel_uncore *uncore)
>>> void assert_forcewakes_active(struct intel_uncore *uncore,
>>> enum forcewake_domains fw_domains)
>>> {
>>> + struct intel_uncore_forcewake_domain *domain;
>>> + unsigned int tmp;
>>> +
>>> + if (!IS_ENABLED(CONFIG_DRM_i915_RUNTIME_PM))
>>> + return;
>>> +
>>
>> If uncore->funcs.force_wake_get is set why wouldn't we still want to run
>> the asserts?
>
> I'm just being worried by adding a loop under irq-off and didn't want to
> add more trouble to non-debug kernels. (Closing the stable door much?)
What is the connection between debug/non-debug kernels and
CONFIG_DRM_i915_RUNTIME_PM?
Regards,
Tvrtko
>>
>>> if (!uncore->funcs.force_wake_get)
>>> return;
>>>
>>> @@ -747,6 +753,24 @@ void assert_forcewakes_active(struct intel_uncore *uncore,
>>> WARN(fw_domains & ~uncore->fw_domains_active,
>>> "Expected %08x fw_domains to be active, but %08x are off\n",
>>> fw_domains, fw_domains & ~uncore->fw_domains_active);
>>> +
>>> + /*
>>> + * Check that the caller has an explicit wakeref and we don't mistake
>>> + * it for the auto wakeref.
>>> + */
>>> + local_irq_disable();
>>> + for_each_fw_domain_masked(domain, fw_domains, uncore, tmp) {
>>> + unsigned int expect = 1;
>>> +
>>> + if (hrtimer_active(&domain->timer))
>>> + expect++;
>>> +
>>> + if (WARN(domain->wake_count < expect,
>>> + "Expected domain %d to be held awake by caller\n",
>>> + domain->id))
>>> + break;
>>> + }
>>> + local_irq_enable();
>>
>> This part looks good. Let wait and see if CI calls me a fool.
>
> Aye, that's what I'm waiting for as well. Personalized insults from CI :)
> -Chris
>
More information about the Intel-gfx
mailing list