• Lyude Paul's avatar
    drm/dp_mst: Destroy MSTBs asynchronously · 7cb12d48
    Lyude Paul authored
    When reprobing an MST topology during resume, we have to account for the
    fact that while we were suspended it's possible that mstbs may have been
    removed from any ports in the topology. Since iterating downwards in the
    topology requires that we hold &mgr->lock, destroying MSTBs from this
    context would result in attempting to lock &mgr->lock a second time and
    deadlocking.
    
    So, fix this by first moving destruction of MSTBs into
    destroy_connector_work, then rename destroy_connector_work and friends
    to reflect that they now destroy both ports and mstbs.
    
    Note that even though this means that MSTBs will still be accessible for
    a short period of time between their removal from the topology and
    delayed destruction, we are still protected against referencing a MSTB
    with a refcount of 0 since we use kref_get_unless_zero() in most places.
    
    Changes since v1:
    * s/destroy_connector_list/destroy_port_list/
      s/connector_destroy_lock/delayed_destroy_lock/
      s/connector_destroy_work/delayed_destroy_work/
      s/drm_dp_finish_destroy_branch_device/drm_dp_delayed_destroy_mstb/
      s/drm_dp_finish_destroy_port/drm_dp_delayed_destroy_port/
      - danvet
    * Use two loops in drm_dp_delayed_destroy_work() - danvet
    * Better explain why we need to do this - danvet
    * Use cancel_work_sync() instead of flush_work() - flush_work() doesn't
      account for work requeing
    
    Cc: Juston Li <juston.li@intel.com>
    Cc: Imre Deak <imre.deak@intel.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Harry Wentland <hwentlan@amd.com>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Reviewed-by: default avatarSean Paul <sean@poorly.run>
    Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20191022023641.8026-2-lyude@redhat.com
    7cb12d48
drm_dp_mst_helper.h 22.1 KB