[Intel-gfx] [PATCH 19/19] drm/i915: Mark the GuC log buffer flush interrupts handling WQ as freezable
Imre Deak
imre.deak at intel.com
Fri Aug 19 10:19:13 UTC 2016
On pe, 2016-08-19 at 14:13 +0530, akash.goel at intel.com wrote:
> From: Akash Goel <akash.goel at intel.com>
>
> The GuC log buffer flush work item has to do a register access to send the
> ack to GuC and this work item, if not synced before suspend, can potentially
> get executed after the GFX device is suspended. This work item function uses
> rpm get/put calls around the Hw access, which covers the rpm suspend case
> but for system suspend a sync would be required as kernel can potentially
> schedule the work items even after some devices, including GFX, have been
> put to suspend. But sync has to be done only for the system suspend case,
> as sync along with rpm get/put can cause a deadlock for rpm suspend path.
> To have the sync, but like a NOOP, for rpm suspend path also this work
> item could have been queued from the irq handler only when the device is
> runtime active & kept active while that work item is pending or getting
> executed but an interrupt can come even after the device is out of use and
> so can potentially lead to missing of this work item.
>
> By marking the workqueue, dedicated for handling GuC log buffer flush
> interrupts, as freezable we don't have to bother about flushing of this
> work item from the suspend hooks, the pending work item if any will be
> either executed before the suspend or scheduled later on resume. This way
> the handling of log buffer flush work item can be kept same between system
> suspend & rpm suspend.
>
> Suggested-by: Imre Deak <imre.deak at intel.com>
> Cc: Imre Deak <imre.deak at intel.com>
> Signed-off-by: Akash Goel <akash.goel at intel.com>
Thanks for taking the time, looks good to me:
Reviewed-by: Imre Deak <imre.deak at intel.com>
> ---
> drivers/gpu/drm/i915/i915_guc_submission.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> index d4a1c84..bb25404 100644
> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> @@ -1242,8 +1242,19 @@ static int guc_create_log_extras(struct intel_guc *guc)
>
> /* Need a dedicated wq to process log buffer flush interrupts
> * from GuC without much delay so as to avoid any loss of logs.
> + *
> + * GuC log buffer flush work item has to do register access to
> + * send the ack to GuC and this work item, if not synced before
> + * suspend, can potentially get executed after the GFX device is
> + * suspended.
> + * By marking the WQ as freezable, we don't have to bother about
> + * flushing of this work item from the suspend hooks, the pending
> + * work item if any will be either executed before the suspend
> + * or scheduled later on resume. This way the handling of work
> + * item can be kept same between system suspend & rpm suspend.
> */
> - guc->log.flush_wq = alloc_ordered_workqueue("i915-guc_log", 0);
> + guc->log.flush_wq =
> + alloc_ordered_workqueue("i915-guc_log", WQ_FREEZABLE);
> if (guc->log.flush_wq == NULL) {
> DRM_ERROR("Couldn't allocate the wq for GuC logging\n");
> return -ENOMEM;
More information about the Intel-gfx
mailing list