On Mon, Feb 10, 2020 at 12:37:52PM +0100, Gerd Hoffmann wrote: > Move final cleanups to qxl_drm_release() callback. > Add drm_atomic_helper_shutdown() call to qxl_pci_remove(). > > Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxxxxx> > --- > drivers/gpu/drm/qxl/qxl_drv.c | 26 +++++++++++++++++++------- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c > index 1d601f57a6ba..4fda3f9b29f4 100644 > --- a/drivers/gpu/drm/qxl/qxl_drv.c > +++ b/drivers/gpu/drm/qxl/qxl_drv.c > @@ -34,6 +34,7 @@ > #include <linux/pci.h> > > #include <drm/drm.h> > +#include <drm/drm_atomic_helper.h> > #include <drm/drm_drv.h> > #include <drm/drm_file.h> > #include <drm/drm_modeset_helper.h> > @@ -132,21 +133,30 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > return ret; > } > > +static void qxl_drm_release(struct drm_device *dev) > +{ > + struct qxl_device *qdev = dev->dev_private; > + > + /* > + * TODO: qxl_device_fini() call should be in qxl_pci_remove(), > + * reodering qxl_modeset_fini() + qxl_device_fini() calls is > + * non-trivial though. > + */ > + qxl_modeset_fini(qdev); So the drm_mode_config_cleanup call in here belongs in ->release, but the qxl_destroy_monitors_object feels like should be perfectly fine in the remove hook. You might need to sprinkle a few drm_dev_enter/exit around to protect code paths thought. Aside from this lgtm, for the series Acked-by: Daniel Vetter <daniel.vetter@xxxxxxxx> And up to you whether you want to fix this or not really. Btw for testing all these patches that add a ->release hook I think it'd be good if the drm core checks that drm_device->dev is set to NULL, and that we do this in the remove hook. Since that's guaranteed to be gone at that point, so anything in ->release that still needs the device is broken. Ofc maybe do that check only for drivers which have a ->release hook, and we might need a few fixups. Cheers, Daniel > + qxl_device_fini(qdev); > + dev->dev_private = NULL; > + kfree(qdev); > +} > + > static void > qxl_pci_remove(struct pci_dev *pdev) > { > struct drm_device *dev = pci_get_drvdata(pdev); > - struct qxl_device *qdev = dev->dev_private; > > drm_dev_unregister(dev); > - > - qxl_modeset_fini(qdev); > - qxl_device_fini(qdev); > + drm_atomic_helper_shutdown(dev); > if (is_vga(pdev)) > vga_put(pdev, VGA_RSRC_LEGACY_IO); > - > - dev->dev_private = NULL; > - kfree(qdev); > drm_dev_put(dev); > } > > @@ -279,6 +289,8 @@ static struct drm_driver qxl_driver = { > .major = 0, > .minor = 1, > .patchlevel = 0, > + > + .release = qxl_drm_release, > }; > > static int __init qxl_init(void) > -- > 2.18.1 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization