All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: "Goel, Akash" <akash.goel@intel.com>,
	Chris Wilson <chris@chris-wilson.co.uk>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 19/19] drm/i915: Sync against the GuC log buffer flush work item on system suspend
Date: Thu, 18 Aug 2016 13:55:58 +0300	[thread overview]
Message-ID: <1471517758.28391.13.camel@intel.com> (raw)
In-Reply-To: <ed9d017d-ede2-9f35-f81f-3a7caed67618@intel.com>

On to, 2016-08-18 at 09:15 +0530, Goel, Akash wrote:
> 
> On 8/17/2016 9:07 PM, Goel, Akash wrote:
> > 
> > 
> > On 8/17/2016 6:41 PM, Imre Deak wrote:
> > > On ke, 2016-08-17 at 18:15 +0530, Goel, Akash wrote:
> > > > 
> > > > On 8/17/2016 5:11 PM, Chris Wilson wrote:
> > > > > On Wed, Aug 17, 2016 at 12:27:30PM +0100, Tvrtko Ursulin
> > > > > wrote:
> > > > > > 
> 
> > > > > > > +int intel_guc_suspend(struct drm_device *dev, bool
> > > > > > > rpm_suspend)
> > > > > > >  {
> > > > > > >      struct drm_i915_private *dev_priv = to_i915(dev);
> > > > > > >      struct intel_guc *guc = &dev_priv->guc;
> > > > > > > @@ -1530,6 +1530,12 @@ int intel_guc_suspend(struct
> > > > > > > drm_device *dev)
> > > > > > >          return 0;
> > > > > > > 
> > > > > > >      gen9_disable_guc_interrupts(dev_priv);
> > > > > > > +    /* Sync is needed only for the system suspend case,
> > > > > > > runtime
> > > > > > > suspend
> > > > > > > +     * case is covered due to rpm get/put calls used
> > > > > > > around Hw
> > > > > > > access in
> > > > > > > +     * the work item function.
> > > > > > > +     */
> > > > > > > +    if (!rpm_suspend && (i915.guc_log_level >= 0))
> > > > > > > +        flush_work(&dev_priv->guc.log.flush_work);
> > > > > 
> > > > > In which case (rpm suspend) the flush_work is idle and this a
> > > > > noop.
> > > > > That
> > > > > you have to pass around such state suggests that you are
> > > > > papering
> > > > > over a
> > > > > bug?
> > > > In case of rpm suspend the flush_work may not be a NOOP.
> > > > Can use the flush_work for runtime suspend also but in spite of
> > > > that
> > > > can't prevent the 'RPM wakelock' asserts, as the work item can
> > > > get
> > > > executed after the rpm ref count drops to zero and before
> > > > runtime
> > > > suspend kicks in (after autosuspend delay).
> > > > 
> > > > For that you had earlier suggested to use rpm get/put in the
> > > > work item
> > > > function, around the register access, but with that had to
> > > > remove the
> > > > flush_work from the suspend hook, otherwise a deadlock can
> > > > happen.
> > > > So doing the flush_work conditionally for system suspend case,
> > > > as rpm
> > > > get/put won't cause the resume of device in that case.
> > > > 
> > > > Actually I had discussed about this with Imre and as per his
> > > > inputs
> > > > prepared this patch.
> > > 
> > > There would be this alternative:
> > > 
> > Thanks much for suggesting the alternate approach.
> > 
> > Just to confirm whether I understood everything correctly,
> > 
> > > in gen9_guc_irq_handler():
> > >    WARN_ON(!intel_runtime_pm_get_if_in_use());
> > Used WARN, as we don't expect the device to be suspended at this
> > juncture, so intel_runtime_pm_get_if_in_use() should return true.
> > 
> > >    if (!queue_work(log.flush_work))
> > If queue_work returns 0, then work item is already pending, so it
> > won't
> > be queued hence can release the rpm ref count now only.
> > >        intel_runtime_pm_put();
> > 
> > > 
> > > and dropping the reference at the end of the work item.
> > This will be just like the __intel_autoenable_gt_powersave
> > 
> > > This would make the flush_work() a nop in case of
> > > runtime_suspend().
> > So can call the flush_work unconditionally.
> > 
> > Hope I understood it correctly.

Yes, the above is correct except for my mistake in
handling intel_runtime_pm_get_if_in_use() returning false as discussed
below.

> > 
> Hi Imre,
> 
> You had suggested to use the below code from irq handler, suspecting 
> that intel_runtime_pm_get_if_in_use() can return false, if interrupt 
> gets handled just after device goes out of use.
> 
> 	if (intel_runtime_pm_get_if_in_use()) {
> 		if (!queue_work(log.flush_work))
> 			intel_runtime_pm_put();
> 	}
> 
> Do you mean to say that interrupt can come when rpm suspend has
> already 
> started but before the interrupt is disabled from the suspend hook ?
> Like if interrupt comes b/w 1) & 4), then runtime_pm_get_if_in_use()
> will return false.
> 1)	Autosuspend delay elapses (device is marked as suspending)
> 2)		intel_runtime_suspend
> 3)			intel_guc_suspend
> 4)				gen9_disable_guc_interrupts(dev_pri
> v);

No, it can return false anytime the last RPM reference is dropped, that
is even before the autosuspend delay elapses. But that still makes the
likelihood for a missed work item scheduling small, because 1) we want
to reduce the autosuspend delay considerably from the current 10 sec
and 2) because what you say below about the GPU actually idling before
the RPM refcount going to 0.

> If the above hypothesis is correct, then it implies that interrupt
> has 
> to come after autosuspend delay has elapsed for the above scenario to
> arise.
> 
> I think it would be unlikely for the interrupt to come so late
> because 
> device would have gone idle just before the autosuspend period
> started 
> and so no GuC submissions would have been done after that.

Right.

> So the probability of missing a work item could be very less and we
> can bear that.

I haven't looked into what is the consequence of missing a work item,
you know this better. In any case - since it is still a possibility -
if it's a problem you could still make sure in intel_guc_suspend() that
any pending work is completed by calling guc_read_update_log_buffer(),
host2guc_logbuffer_flush_complete() if necessary after disabling
interrupts in intel_guc_suspend().

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

  reply	other threads:[~2016-08-18 10:56 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-17 10:14 [PATCH v7 00/19] Support for sustained capturing of GuC firmware logs akash.goel
2016-08-17 10:14 ` [PATCH 01/19] drm/i915: Decouple GuC log setup from verbosity parameter akash.goel
2016-08-17 10:14 ` [PATCH 02/19] drm/i915: Add GuC ukernel logging related fields to fw interface file akash.goel
2016-08-17 10:14 ` [PATCH 03/19] drm/i915: New structure to contain GuC logging related fields akash.goel
2016-08-17 10:14 ` [PATCH 04/19] drm/i915: Add low level set of routines for programming PM IER/IIR/IMR register set akash.goel
2016-08-17 10:14 ` [PATCH 05/19] drm/i915: Support for GuC interrupts akash.goel
2016-08-17 10:51   ` Tvrtko Ursulin
2016-08-17 10:14 ` [PATCH 06/19] drm/i915: Handle log buffer flush interrupt event from GuC akash.goel
2016-08-17 11:07   ` Tvrtko Ursulin
2016-08-17 11:24     ` Goel, Akash
2016-08-17 11:35       ` Tvrtko Ursulin
2016-08-17 13:19         ` Tvrtko Ursulin
2016-08-17 10:14 ` [PATCH 07/19] relay: Use per CPU constructs for the relay channel buffer pointers akash.goel
2016-08-17 10:14 ` [PATCH 08/19] drm/i915: Add a relay backed debugfs interface for capturing GuC logs akash.goel
2016-08-17 11:11   ` Tvrtko Ursulin
2016-08-17 10:14 ` [PATCH 09/19] drm/i915: New lock to serialize the Host2GuC actions akash.goel
2016-08-17 10:14 ` [PATCH 10/19] drm/i915: Add stats for GuC log buffer flush interrupts akash.goel
2016-08-17 10:14 ` [PATCH 11/19] drm/i915: Optimization to reduce the sampling time of GuC log buffer akash.goel
2016-08-17 10:14 ` [PATCH 12/19] drm/i915: Increase GuC log buffer size to reduce flush interrupts akash.goel
2016-08-17 10:14 ` [PATCH 13/19] drm/i915: Augment i915 error state to include the dump of GuC log buffer akash.goel
2016-08-17 10:14 ` [PATCH 14/19] drm/i915: Forcefully flush GuC log buffer on reset akash.goel
2016-08-17 11:16   ` Tvrtko Ursulin
2016-08-17 10:14 ` [PATCH 15/19] drm/i915: Debugfs support for GuC logging control akash.goel
2016-08-17 10:14 ` [PATCH 16/19] drm/i915: Use uncached(WC) mapping for acessing the GuC log buffer akash.goel
2016-08-17 10:14 ` [PATCH 17/19] drm/i915: Use SSE4.1 movntdqa based memcpy for sampling " akash.goel
2016-08-17 10:14 ` [PATCH 18/19] drm/i915: Early creation of relay channel for capturing boot time logs akash.goel
2016-08-17 10:14 ` [PATCH 19/19] drm/i915: Sync against the GuC log buffer flush work item on system suspend akash.goel
2016-08-17 11:27   ` Tvrtko Ursulin
2016-08-17 11:41     ` Chris Wilson
2016-08-17 12:45       ` Goel, Akash
2016-08-17 13:11         ` Imre Deak
2016-08-17 15:37           ` Goel, Akash
2016-08-18  3:45             ` Goel, Akash
2016-08-18 10:55               ` Imre Deak [this message]
2016-08-18 11:24                 ` Goel, Akash
2016-08-18 12:59                   ` Imre Deak
2016-08-18 13:47                     ` Goel, Akash
2016-08-18 14:18                       ` Imre Deak
2016-08-18 14:35                         ` Goel, Akash
2016-08-18 14:55                           ` Imre Deak
2016-08-18 15:01                             ` Goel, Akash
2016-08-17 10:29 ` ✗ Ro.CI.BAT: failure for Support for sustained capturing of GuC firmware logs (rev8) Patchwork

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=1471517758.28391.13.camel@intel.com \
    --to=imre.deak@intel.com \
    --cc=akash.goel@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.