Patch "drm: Don't race connector registration" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm: Don't race connector registration
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-don-t-race-connector-registration.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jun 15 14:38:52 CEST 2017
From: Daniel Vetter <[email protected]>
Date: Thu, 12 Jan 2017 17:15:56 +0100
Subject: drm: Don't race connector registration
From: Daniel Vetter <[email protected]>
[ Upstream commit e6e7b48b295afa5a5ab440de0a94d9ad8b3ce2d0 ]
I was under the misconception that the sysfs dev stuff can be fully set up, and then registered all in one step with device_add. That's true for properties and property groups, but not for parents and child devices. Those must be fully registered before you can register a child.
Add a bit of tracking to make sure that asynchronous mst connector hotplugging gets this right. For consistency we rely upon the implicit barriers of the connector->mutex, which is taken anyway, to ensure that at least either the connector or device registration call will work out.
Mildly tested since I can't reliably reproduce this on my mst box here.
--- drivers/gpu/drm/drm_connector.c | 3 +++ drivers/gpu/drm/drm_drv.c | 4 ++++ include/drm/drmP.h | 1 + 3 files changed, 8 insertions(+)
drivers/gpu/drm/drm_connector.c +3 -0
@@ -379,6 +379,9 @@ int drm_connector_register(struct drm_co {int ret =0 ; +if (!connector->dev->registered) +return 0 ; +mutex_lock (&connector->mutex);if (connector->registered) goto unlock;
drivers/gpu/drm/drm_drv.c +4 -0
@@ -710,6 +710,8 @@ int drm_dev_register(struct drm_device *if (ret) goto err_minors; + dev->registered = true; +if (dev->driver->load) { ret = dev->driver->load (dev, flags);if (ret)
@@ -749,6 +751,8 @@ void drm_dev_unregister(struct drm_devicdrm_lastclose (dev); + dev->registered = false; +if (drm_core_check_feature (dev,DRIVER_MODESET ))drm_modeset_unregister_all (dev);
include/drm/drmP.h +1 -0
@@ -776,6 +776,7 @@ struct drm_device {struct drm_minor *control;/**< Control node */ struct drm_minor *primary;/**< Primary node */ struct drm_minor *render;/**< Render node */ +bool registered;/* currently active master for this device. Protected by master_mutex */ struct drm_master *master;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/drm-prevent-double-un-registration-for-connectors.patch queue-4.9/drm-don-t-race-connector-registration.patch