|
@@ -1023,9 +1023,20 @@ static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_
|
|
static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
|
|
static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
|
|
{
|
|
{
|
|
struct drm_dp_mst_port *rport = NULL;
|
|
struct drm_dp_mst_port *rport = NULL;
|
|
|
|
+
|
|
mutex_lock(&mgr->lock);
|
|
mutex_lock(&mgr->lock);
|
|
- if (mgr->mst_primary)
|
|
|
|
- rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Port may or may not be 'valid' but we don't care about that when
|
|
|
|
+ * destroying the port and we are guaranteed that the port pointer
|
|
|
|
+ * will be valid until we've finished
|
|
|
|
+ */
|
|
|
|
+ if (current_work() == &mgr->destroy_connector_work) {
|
|
|
|
+ kref_get(&port->kref);
|
|
|
|
+ rport = port;
|
|
|
|
+ } else if (mgr->mst_primary) {
|
|
|
|
+ rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary,
|
|
|
|
+ port);
|
|
|
|
+ }
|
|
mutex_unlock(&mgr->lock);
|
|
mutex_unlock(&mgr->lock);
|
|
return rport;
|
|
return rport;
|
|
}
|
|
}
|