Quoting Dmitry Baryshkov (2021-03-18 13:05:44) > if GPU components have failed to bind, shutdown callback would fail with > the following backtrace. Add safeguard check to stop that oops from > happening and allow the board to reboot. [...] > diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c > index 94525ac76d4e..fd2ac54caf9f 100644 > --- a/drivers/gpu/drm/msm/msm_drv.c > +++ b/drivers/gpu/drm/msm/msm_drv.c > @@ -1311,6 +1311,10 @@ static int msm_pdev_remove(struct platform_device *pdev) > static void msm_pdev_shutdown(struct platform_device *pdev) > { > struct drm_device *drm = platform_get_drvdata(pdev); > + struct msm_drm_private *priv = drm ? drm->dev_private : NULL; > + > + if (!priv || !priv->kms) > + return; > I see a problem where if I don't get a backlight probing then my graphics card doesn't appear but this driver is still bound. I was hoping this patch would fix it but it doesn't. I have slab poisoning enabled so sometimes the 'priv' pointer is 0x6b6b6b6b6b6b6b6b meaning it got all freed. I found that the 'drm' pointer here is pointing at junk. The msm_drm_init() function calls drm_dev_put() on the error path and that will destroy the drm pointer but it doesn't update this platform drivers drvdata. Do we need another patch that sets the drvdata to NULL on msm_drm_init() failing? One last note, I'm seeing this on 5.4 so maybe I missed something and the drvdata has been set to NULL somewhere else upstream. I sort of doubt it though. ---8<---- diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index c842a270806d..895d74aa8834 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -577,6 +577,7 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv) kfree(priv); err_put_drm_dev: drm_dev_put(ddev); + platform_set_drvdata(pdev, NULL); return ret; } _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel