Commit 8acd2d7e authored by Myeonghun Pak's avatar Myeonghun Pak Committed by Thomas Zimmermann
Browse files

drm/qxl: Fix missing KMS poll cleanup



drm_kms_helper_poll_init() initializes the output polling work and
enables polling for the DRM device. qxl enables polling before calling
drm_dev_register(), but the drm_dev_register() failure path tears down
the modeset and device state without disabling the polling helper.

The remove path also unregisters and shuts down the DRM device without
first disabling the polling helper. Add matching drm_kms_helper_poll_fini()
calls in both paths so the delayed polling work is cancelled before qxl
tears down the associated modeset/device state.

Signed-off-by: default avatarMyeonghun Pak <mhun512@gmail.com>
Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Fixes: 5ff91e44 ("qxl: use drm helper hotplug support")
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://patch.msgid.link/20260424112543.57819-1-mhun512@gmail.com
parent 84d5d76c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -118,12 +118,13 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	/* Complete initialization. */
	ret = drm_dev_register(&qdev->ddev, ent->driver_data);
	if (ret)
		goto modeset_cleanup;
		goto poll_fini;

	drm_client_setup(&qdev->ddev, NULL);
	return 0;

modeset_cleanup:
poll_fini:
	drm_kms_helper_poll_fini(&qdev->ddev);
	qxl_modeset_fini(qdev);
unload:
	qxl_device_fini(qdev);
@@ -154,6 +155,7 @@ qxl_pci_remove(struct pci_dev *pdev)
{
	struct drm_device *dev = pci_get_drvdata(pdev);

	drm_kms_helper_poll_fini(dev);
	drm_dev_unregister(dev);
	drm_atomic_helper_shutdown(dev);
	if (pci_is_vga(pdev) && pdev->revision < 5)