Re: [PATCH] drm: hdlcd: Unwind the DRM setup on error conditions in the right order.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08/06/16 13:56, Liviu Dudau wrote:
In hdlcd_drm_bind()/hdlcd_drm_unbind() we unwind the DRM setup in the
wrong order (drm_mode_config_cleanup() before connector and encoder
had a chance to cleanup their memory or before drm_dev_unregister()).
The correct order should match in both functions.

Reported-by: Robin Murphy <Robin.Murphy@xxxxxxx>
Signed-off-by: Liviu Dudau <Liviu.Dudau@xxxxxxx>
---

Robin,

I believe this should fix your problems with HDLCD failing to allocate CMA
memory and then crashing.

Heh, I'm not sure I'd even clocked that there was yet another propblem beyond the original gem_free_object() crash. I've just tried 4.7-rc3 with the relevant fixes for that, and indeed drm_connector_cleanup() does go bang, and this patch makes it happy again.

Tested-by: Robin Murphy <robin.murphy@xxxxxxx>

Thanks,
Robin.


Best regards,
Liviu

  drivers/gpu/drm/arm/hdlcd_drv.c | 8 ++++----
  1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index 3422ca2..2c6eddb 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -382,7 +382,6 @@ static int hdlcd_drm_bind(struct device *dev)

  err_fbdev:
  	drm_kms_helper_poll_fini(drm);
-	drm_mode_config_cleanup(drm);
  	drm_vblank_cleanup(drm);
  err_vblank:
  	pm_runtime_disable(drm->dev);
@@ -390,6 +389,7 @@ err_pm_active:
  	component_unbind_all(dev, drm);
  err_unregister:
  	drm_dev_unregister(drm);
+	drm_mode_config_cleanup(drm);
  err_unload:
  	drm_irq_uninstall(drm);
  	of_reserved_mem_device_release(drm->dev);
@@ -410,15 +410,15 @@ static void hdlcd_drm_unbind(struct device *dev)
  		hdlcd->fbdev = NULL;
  	}
  	drm_kms_helper_poll_fini(drm);
-	component_unbind_all(dev, drm);
  	drm_vblank_cleanup(drm);
+	component_unbind_all(dev, drm);
  	pm_runtime_get_sync(drm->dev);
  	drm_irq_uninstall(drm);
  	pm_runtime_put_sync(drm->dev);
  	pm_runtime_disable(drm->dev);
-	of_reserved_mem_device_release(drm->dev);
-	drm_mode_config_cleanup(drm);
  	drm_dev_unregister(drm);
+	drm_mode_config_cleanup(drm);
+	of_reserved_mem_device_release(drm->dev);
  	drm_dev_unref(drm);
  	drm->dev_private = NULL;
  	dev_set_drvdata(dev, NULL);


_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux