[Intel-gfx] [PATCH] Avoid i915 flip unpin/HPD event handler deadlock.
Daniel Vetter
daniel at ffwll.ch
Mon Sep 2 08:47:47 CEST 2013
On Sat, Aug 31, 2013 at 10:15:25AM +0100, Chris Wilson wrote:
> On Fri, Aug 30, 2013 at 06:30:55PM -0700, Stuart Abercrombie wrote:
> > Both of these were taking the mode_config mutex but executed from the
> > same work queue. If intel_crtc_page_flip happened to flush a work queue
> > containing an HPD event handler work item, deadlock resulted, since the
> > mutex required by the HPD handler was taken before the flush. Instead
> > use a separate work queue for the flip unpin work.
> >
> > Signed-off-by: sabercrombie at chromium.org
> > Reviewed-by: marcheu at chromium.org
>
> It would be possible to rearrange the flip to drop the lock around the
> flush (which is a regression from the kernel/workqueue.c refacting...).
> However, this looks much simpler. In the long run being strict on
> calling flush_workqueue() unlocked is likely to be safer though.
>
> Reviewed-by; Chris Wilson <chris at chris-wilson.co.uk>
Actually this is a regression from
commit 69787f7da6b2adc4054357a661aaa1701a9ca76f
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date: Tue Oct 23 18:23:34 2012 +0000
drm: run the hpd irq event code directly
and the fix is a bit simpler.
-Daniel
>
> > ---
> > drivers/gpu/drm/i915/i915_dma.c | 21 ++++++++++++++++++++-
> > drivers/gpu/drm/i915/i915_drv.h | 1 +
> > drivers/gpu/drm/i915/intel_display.c | 4 ++--
> > 3 files changed, 23 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> > index 4f129bb..9215360 100644
> > --- a/drivers/gpu/drm/i915/i915_dma.c
> > +++ b/drivers/gpu/drm/i915/i915_dma.c
> > @@ -1558,6 +1558,22 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
> > goto out_mtrrfree;
> > }
> >
> > + /* intel_crtc_page_flip runs with the mode_config mutex having been
> > + * taken in the DRM layer. It synchronously waits for pending unpin
> > + * work items while holding this mutex. Therefore this queue cannot
> > + * contain work items that take this mutex, such as HPD event
> > + * handling, or we deadlock. There is also no reason for flipping to
> > + * wait on such events. Therefore put flip unpinning in its own
> > + * work queue.
> > + */
> > + dev_priv->flip_unpin_wq = alloc_ordered_workqueue("i915", 0);
> > + if (dev_priv->flip_unpin_wq == NULL) {
> > + DRM_ERROR("Failed to create flip unpin workqueue.\n");
> > + destroy_workqueue(dev_priv->wq);
> > + ret = -ENOMEM;
> > + goto out_mtrrfree;
> > + }
> > +
> > /* This must be called before any calls to HAS_PCH_* */
> > intel_detect_pch(dev);
> >
> > @@ -1628,6 +1644,7 @@ out_gem_unload:
> > intel_teardown_gmbus(dev);
> > intel_teardown_mchbar(dev);
> > destroy_workqueue(dev_priv->wq);
> > + destroy_workqueue(dev_priv->flip_unpin_wq);
>
> To be consistent, flip_wq then wq. In case we get ordering issues later.
> -Chris
>
> --
> Chris Wilson, Intel Open Source Technology Centre
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the Intel-gfx
mailing list