Message ID | 1413393304-3224-1-git-send-email-przanoni@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Oct 15, 2014 at 02:15:04PM -0300, Paulo Zanoni wrote: > From: Paulo Zanoni <paulo.r.zanoni@intel.com> > > In its current place, it just segfaults while trying to access the > CRTC structures: > > [ 9132.421681] Call Trace: > [ 9132.421707] [<ffffffffa01130d8>] i915_get_crtc_scanoutpos+0x1e8/0x220 [i915] > [ 9132.421727] [<ffffffffa001da34>] drm_calc_vbltimestamp_from_scanoutpos+0x94/0x330 [drm] > [ 9132.421744] [<ffffffffa001d240>] ?vblank_disable_and_save+0x40/0x1e0 [drm] > [ 9132.421769] [<ffffffffa0114328>] i915_get_vblank_timestamp+0x68/0xb0 [i915] > [ 9132.421786] [<ffffffffa001d094>] drm_get_last_vbltimestamp+0x44/0x80 [drm] > [ 9132.421801] [<ffffffffa001d3a6>] vblank_disable_and_save+0x1a6/0x1e0 [drm] > [ 9132.421817] [<ffffffffa001eac1>] drm_vblank_cleanup+0x61/0xa0 [drm] > [ 9132.421849] [<ffffffffa0177a5e>] i915_driver_unload+0xde/0x290 [i915] > [ 9132.421867] [<ffffffffa0020264>] drm_dev_unregister+0x24/0xb0 [drm] > [ 9132.421884] [<ffffffffa002090e>] drm_put_dev+0x1e/0x70 [drm] > [ 9132.421901] [<ffffffffa00e01e0>] i915_pci_remove+0x10/0x20 [i915] > [ 9132.421910] [<ffffffff81347556>] pci_device_remove+0x36/0xb0 > [ 9132.421920] [<ffffffff8140084a>] __device_release_driver+0x7a/0xf0 > [ 9132.421928] [<ffffffff81400fc8>] driver_detach+0xb8/0xc0 > [ 9132.421936] [<ffffffff8140054a>] bus_remove_driver+0x4a/0xb0 > [ 9132.421944] [<ffffffff81401717>] driver_unregister+0x27/0x50 > [ 9132.421953] [<ffffffff81346f65>] pci_unregister_driver+0x25/0x70 > [ 9132.421971] [<ffffffffa00229c8>] drm_pci_exit+0x78/0xa0 [drm] > [ 9132.422000] [<ffffffffa017a6d2>] i915_exit+0x20/0x94e [i915] > [ 9132.422009] [<ffffffff810fb9dc>] SyS_delete_module+0x13c/0x1f0 > [ 9132.422019] [<ffffffff8131c5fb>] ? > trace_hardirqs_on_thunk+0x3a/0x3f > [ 9132.422028] [<ffffffff816f7792>] system_call_fastpath+0x16/0x1b > > This means it has to be before intel_modeset_cleanup, which cleans the > CRTC structures. But if we move it to before intel_fbdev_fini(), we > get WARNs because intel_fbdev_fini() still tries to use the vblanks, > so the only acceptable point for drm_vblank_cleanup() seems to be this > place. Hmm. Yeah that seems like the spot we have to put it given it wants to call the vblank disable hook. Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Related commit: > > commit cbb47d179fb345c579cd8cd884693903fceed26a > Author: Chris Wilson <chris@chris-wilson.co.uk> > Date: Mon Sep 23 17:33:20 2013 -0300 > drm/i915: Add some missing steps to i915_driver_load error path > > Testsuite: igt/drv_module_reload > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77511 > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83484 > Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> > --- > drivers/gpu/drm/i915/i915_dma.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c > index 85d14e1..1b39807 100644 > --- a/drivers/gpu/drm/i915/i915_dma.c > +++ b/drivers/gpu/drm/i915/i915_dma.c > @@ -1853,8 +1853,12 @@ int i915_driver_unload(struct drm_device *dev) > > acpi_video_unregister(); > > - if (drm_core_check_feature(dev, DRIVER_MODESET)) { > + if (drm_core_check_feature(dev, DRIVER_MODESET)) > intel_fbdev_fini(dev); > + > + drm_vblank_cleanup(dev); > + > + if (drm_core_check_feature(dev, DRIVER_MODESET)) { > intel_modeset_cleanup(dev); > > /* > @@ -1895,8 +1899,6 @@ int i915_driver_unload(struct drm_device *dev) > i915_free_hws(dev); > } > > - drm_vblank_cleanup(dev); > - > intel_teardown_gmbus(dev); > intel_teardown_mchbar(dev); > > -- > 2.1.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Fri, Oct 17, 2014 at 02:18:34PM +0300, Ville Syrjälä wrote: > On Wed, Oct 15, 2014 at 02:15:04PM -0300, Paulo Zanoni wrote: > > From: Paulo Zanoni <paulo.r.zanoni@intel.com> > > > > In its current place, it just segfaults while trying to access the > > CRTC structures: > > > > [ 9132.421681] Call Trace: > > [ 9132.421707] [<ffffffffa01130d8>] i915_get_crtc_scanoutpos+0x1e8/0x220 [i915] > > [ 9132.421727] [<ffffffffa001da34>] drm_calc_vbltimestamp_from_scanoutpos+0x94/0x330 [drm] > > [ 9132.421744] [<ffffffffa001d240>] ?vblank_disable_and_save+0x40/0x1e0 [drm] > > [ 9132.421769] [<ffffffffa0114328>] i915_get_vblank_timestamp+0x68/0xb0 [i915] > > [ 9132.421786] [<ffffffffa001d094>] drm_get_last_vbltimestamp+0x44/0x80 [drm] > > [ 9132.421801] [<ffffffffa001d3a6>] vblank_disable_and_save+0x1a6/0x1e0 [drm] > > [ 9132.421817] [<ffffffffa001eac1>] drm_vblank_cleanup+0x61/0xa0 [drm] > > [ 9132.421849] [<ffffffffa0177a5e>] i915_driver_unload+0xde/0x290 [i915] > > [ 9132.421867] [<ffffffffa0020264>] drm_dev_unregister+0x24/0xb0 [drm] > > [ 9132.421884] [<ffffffffa002090e>] drm_put_dev+0x1e/0x70 [drm] > > [ 9132.421901] [<ffffffffa00e01e0>] i915_pci_remove+0x10/0x20 [i915] > > [ 9132.421910] [<ffffffff81347556>] pci_device_remove+0x36/0xb0 > > [ 9132.421920] [<ffffffff8140084a>] __device_release_driver+0x7a/0xf0 > > [ 9132.421928] [<ffffffff81400fc8>] driver_detach+0xb8/0xc0 > > [ 9132.421936] [<ffffffff8140054a>] bus_remove_driver+0x4a/0xb0 > > [ 9132.421944] [<ffffffff81401717>] driver_unregister+0x27/0x50 > > [ 9132.421953] [<ffffffff81346f65>] pci_unregister_driver+0x25/0x70 > > [ 9132.421971] [<ffffffffa00229c8>] drm_pci_exit+0x78/0xa0 [drm] > > [ 9132.422000] [<ffffffffa017a6d2>] i915_exit+0x20/0x94e [i915] > > [ 9132.422009] [<ffffffff810fb9dc>] SyS_delete_module+0x13c/0x1f0 > > [ 9132.422019] [<ffffffff8131c5fb>] ? > > trace_hardirqs_on_thunk+0x3a/0x3f > > [ 9132.422028] [<ffffffff816f7792>] system_call_fastpath+0x16/0x1b > > > > This means it has to be before intel_modeset_cleanup, which cleans the > > CRTC structures. But if we move it to before intel_fbdev_fini(), we > > get WARNs because intel_fbdev_fini() still tries to use the vblanks, > > so the only acceptable point for drm_vblank_cleanup() seems to be this > > place. > > Hmm. Yeah that seems like the spot we have to put it given it wants > to call the vblank disable hook. > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Queued for -next, thanks for the patch. -Daniel
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 85d14e1..1b39807 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -1853,8 +1853,12 @@ int i915_driver_unload(struct drm_device *dev) acpi_video_unregister(); - if (drm_core_check_feature(dev, DRIVER_MODESET)) { + if (drm_core_check_feature(dev, DRIVER_MODESET)) intel_fbdev_fini(dev); + + drm_vblank_cleanup(dev); + + if (drm_core_check_feature(dev, DRIVER_MODESET)) { intel_modeset_cleanup(dev); /* @@ -1895,8 +1899,6 @@ int i915_driver_unload(struct drm_device *dev) i915_free_hws(dev); } - drm_vblank_cleanup(dev); - intel_teardown_gmbus(dev); intel_teardown_mchbar(dev);