On Tue, 2017-08-01 at 16:51 +0800, Ethan Hsieh wrote: > We do not update the status of connector when receiving MST unplug event. > Call detect function to get latest status and then update status of connector. > Cc'ing Daniel and Chris. Thanks for sending this to the list. The issue is connector ref count is not zero when destroy_mst_connector() is called, which results in the connector not being freed until the userspace shuts down the crtc tied to the connector. But the kernel needs to update the connector status for the user space to shut it down. > Before applying the patch: > [313.665321] [drm:intel_get_hpd_pins [i915]] hotplug event received, stat 0x00200000, dig 0x10101012, pins 0x00000020 > [313.665383] [drm:intel_hpd_irq_handler [i915]] digital hpd port B - long > [313.665436] [drm:intel_hpd_irq_handler [i915]] Received HPD interrupt on PIN 5 - cnt: 0 > [313.665539] [drm:intel_dp_hpd_pulse [i915]] got hpd irq on port B - long > [313.944743] [drm:intel_dp_destroy_mst_connector [i915]] > [313.944848] [drm:intel_dp_destroy_mst_connector [i915]] > > After applying the patch: > [43.175798] [drm:intel_dp_destroy_mst_connector [i915]] [CONNECTOR:70:DP-4] status updated from connected to disconnected > [43.175870] [drm:intel_dp_destroy_mst_connector [i915]] > [43.177675] [drm:drm_helper_probe_single_connector_modes [drm_kms_helper]] [CONNECTOR:70:DP-4] > [43.177679] [drm:drm_helper_probe_single_connector_modes [drm_kms_helper]] [CONNECTOR:70:DP-4] disconnected > > Signed-off-by: Ethan Hsieh <ethan.hsieh@xxxxxxxxxxxxx> This patch needs a Fixes: tag as it does fix a fdo bug. > --- > drivers/gpu/drm/i915/intel_dp_mst.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c > index e4ea968..b02a9a8 100644 > --- a/drivers/gpu/drm/i915/intel_dp_mst.c > +++ b/drivers/gpu/drm/i915/intel_dp_mst.c > @@ -492,6 +492,20 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, > { > struct intel_connector *intel_connector = to_intel_connector(connector); > struct drm_i915_private *dev_priv = to_i915(connector->dev); > + enum drm_connector_status old_status; > + > + mutex_lock(&connector->dev->mode_config.mutex); > + old_status = connector->status; > + connector->status = connector->funcs->detect(connector, false); Isn't detect already done by this point? destroy_connector() should be called after we know the display is disconnected. > + > + if (old_status != connector->status) > + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", > + connector->base.id, > + connector->name, > + drm_get_connector_status_name(old_status), > + drm_get_connector_status_name(connector->status)); > + > + mutex_unlock(&connector->dev->mode_config.mutex); > > drm_connector_unregister(connector); The connector is unregistered unconditionally here, so you might as well set connector->status = connector_status_disconnected; > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx