summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsg <jsg@openbsd.org>2020-01-28 02:24:48 +0000
committerjsg <jsg@openbsd.org>2020-01-28 02:24:48 +0000
commit2403824a60c781961bb20fec444d3584e497077c (patch)
tree6fdee1f1857923eeba956cfe8a188e2ec3ad421a
parentmake IPTOS_DSCP_LE available via IPQoS directive; bz2986, based on (diff)
downloadwireguard-openbsd-2403824a60c781961bb20fec444d3584e497077c.tar.xz
wireguard-openbsd-2403824a60c781961bb20fec444d3584e497077c.zip
drm/dp_mst: Skip validating ports during destruction, just ref
From Lyude Paul 035e304f95c3b3ed11ef8a0de48269ef4faad2e7 in linux 4.19.y/4.19.99 c54c7374ff44de5e609506aca7c0deae4703b6d1 in mainline linux
-rw-r--r--sys/dev/pci/drm/drm_dp_mst_topology.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/dev/pci/drm/drm_dp_mst_topology.c b/sys/dev/pci/drm/drm_dp_mst_topology.c
index 415a90259eb..cf1849e36b1 100644
--- a/sys/dev/pci/drm/drm_dp_mst_topology.c
+++ b/sys/dev/pci/drm/drm_dp_mst_topology.c
@@ -1024,9 +1024,25 @@ 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)
{
struct drm_dp_mst_port *rport = NULL;
+
mutex_lock(&mgr->lock);
+ /*
+ * 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
+ */
+#ifdef notyet
+ 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);
+ }
+#else
if (mgr->mst_primary)
rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port);
+#endif
mutex_unlock(&mgr->lock);
return rport;
}