All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH] drm/i915: Only report a wakeup if the waiter was truly asleep
Date: Mon, 11 Dec 2017 17:21:09 +0000	[thread overview]
Message-ID: <a8029b47-1573-bbeb-669b-859b3952a34e@linux.intel.com> (raw)
In-Reply-To: <151301212325.4445.3209035629990326085@mail.alporthouse.com>


On 11/12/2017 17:08, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2017-12-11 16:10:49)
>>
>> On 09/12/2017 12:47, Chris Wilson wrote:
>>> If we attempt to wake up a waiter, who is currently checking the seqno
>>> it will be in the TASK_INTERRUPTIBLE state and ttwu will report success.
>>> However, it is actually awake and functioning -- so delay reporting the
>>> actual wake up until it sleeps. This fixes some spurious claims of
>>> missed_breadcrumbs when running under heavy load; i.e. sufficient load to
>>> preempt away the newly woken waiter before they complete their checks.
>>> However, it does so at the cost of a rare false negative; where the
>>> waiter changes between the check and ttwu -- the only way to fix that
>>> would be to extend the reporting from ttwu where the check could be done
>>> atomically.
>>>
>>> v2: Defend against !CONFIG_SMP
>>> v3: Don't filter out calls to wake_up_process
>>>
>>> Testcase: igt/drv_missed_irq # sanity check we do detect missed_breadcrumb()
>>> Testcase: igt/gem_concurrent_blit # for generating false positives
>>> References: https://bugs.freedesktop.org/show_bug.cgi?id=100007
>>> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
>>> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>>> ---
>>>    drivers/gpu/drm/i915/intel_breadcrumbs.c | 39 ++++++++++++++++++++++++--------
>>>    1 file changed, 30 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
>>> index 24c6fefdd0b1..76e6f8e7cfd4 100644
>>> --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
>>> +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
>>> @@ -27,6 +27,12 @@
>>>    
>>>    #include "i915_drv.h"
>>>    
>>> +#ifdef CONFIG_SMP
>>> +#define task_asleep(tsk) ((tsk)->state & TASK_NORMAL && !(tsk)->on_cpu)
>>> +#else
>>> +#define task_asleep(tsk) ((tsk)->state & TASK_NORMAL)
>>> +#endif
>>> +
>>
>> I kind of remember the on_cpu from before and I was probably complaining
>> about it. Sigh, if it helps ok..
>>
>>>    static unsigned int __intel_breadcrumbs_wakeup(struct intel_breadcrumbs *b)
>>>    {
>>>        struct intel_wait *wait;
>>> @@ -36,8 +42,20 @@ static unsigned int __intel_breadcrumbs_wakeup(struct intel_breadcrumbs *b)
>>>    
>>>        wait = b->irq_wait;
>>>        if (wait) {
>>> +             /*
>>> +              * N.B. Since task_asleep() and ttwu are not atomic, the
>>> +              * waiter may actually go to sleep after the check, causing
>>> +              * us to suppress a valid wakeup. We prefer to reduce the
>>> +              * number of false positive missed_breadcrumb() warnings
>>> +              * at the expense of a few false negatives, as it it easy
>>> +              * to trigger a false positive under heavy load. Enough
>>> +              * signal should remain from genuine missed_breadcrumb()
>>> +              * for us to detect in CI.
>>> +              */
>>> +             bool was_asleep = task_asleep(wait->tsk);
>>> +
>>>                result = ENGINE_WAKEUP_WAITER;
>>> -             if (wake_up_process(wait->tsk))
>>> +             if (wake_up_process(wait->tsk) && was_asleep)
>>>                        result |= ENGINE_WAKEUP_ASLEEP;
>>>        }
>>>    
>>> @@ -47,12 +65,15 @@ static unsigned int __intel_breadcrumbs_wakeup(struct intel_breadcrumbs *b)
>>>    unsigned int intel_engine_wakeup(struct intel_engine_cs *engine)
>>>    {
>>>        struct intel_breadcrumbs *b = &engine->breadcrumbs;
>>> -     unsigned long flags;
>>> -     unsigned int result;
>>> +     unsigned int result = 0;
>>>    
>>> -     spin_lock_irqsave(&b->irq_lock, flags);
>>> -     result = __intel_breadcrumbs_wakeup(b);
>>> -     spin_unlock_irqrestore(&b->irq_lock, flags);
>>> +     if (READ_ONCE(b->irq_wait)) {
>>> +             unsigned long flags;
>>> +
>>> +             spin_lock_irqsave(&b->irq_lock, flags);
>>> +             result = __intel_breadcrumbs_wakeup(b);
>>> +             spin_unlock_irqrestore(&b->irq_lock, flags);
>>> +     }
>>
>> This hunk I'd leave out from the fix.
> 
> And if I postpone that hunk to tomorrow, would r-b the rest?

Yep.

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2017-12-11 17:21 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-09 12:47 [PATCH] drm/i915: Only report a wakeup if the waiter was truly asleep Chris Wilson
2017-12-09 13:17 ` ✓ Fi.CI.BAT: success for drm/i915: Only report a wakeup if the waiter was truly asleep (rev4) Patchwork
2017-12-09 14:09 ` ✗ Fi.CI.IGT: warning " Patchwork
2017-12-11 16:10 ` [PATCH] drm/i915: Only report a wakeup if the waiter was truly asleep Tvrtko Ursulin
2017-12-11 17:08   ` Chris Wilson
2017-12-11 17:21     ` Tvrtko Ursulin [this message]
  -- strict thread matches above, loose matches on Subject: below --
2017-04-04 14:38 Chris Wilson
2017-04-05 10:40 ` kbuild test robot
2017-04-05 12:20 ` kbuild test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a8029b47-1573-bbeb-669b-859b3952a34e@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.