• Lyude Paul's avatar
    drm/atomic_helper: Stop modesets on unregistered connectors harder · de9f8eea
    Lyude Paul authored
    Unfortunately, it appears our fix in:
    commit b5d29843 ("drm/atomic_helper: Allow DPMS On<->Off changes
    for unregistered connectors")
    
    Which attempted to work around the problems introduced by:
    commit 4d802739 ("drm/atomic_helper: Disallow new modesets on
    unregistered connectors")
    
    Is still not the right solution, as modesets can still be triggered
    outside of drm_atomic_set_crtc_for_connector().
    
    So in order to fix this, while still being careful that we don't break
    modesets that a driver may perform before being registered with
    userspace, we replace connector->registered with a tristate member,
    connector->registration_state. This allows us to keep track of whether
    or not a connector is still initializing and hasn't been exposed to
    userspace, is currently registered and exposed to userspace, or has been
    legitimately removed from the system after having once been present.
    
    Using this info, we can prevent userspace from performing new modesets
    on unregistered connectors while still allowing the driver to perform
    modesets on unregistered connectors before the driver has finished being
    registered.
    
    Changes since v1:
    - Fix WARN_ON() in drm_connector_cleanup() that CI caught with this
      patchset in igt@drv_module_reload@basic-reload-inject and
      igt@drv_module_reload@basic-reload by checking if the connector is
      registered instead of unregistered, as calling drm_connector_cleanup()
      on a connector that hasn't been registered with userspace yet should
      stay valid.
    - Remove unregistered_connector_check(), and just go back to what we
      were doing before in commit 4d802739 ("drm/atomic_helper: Disallow
      new modesets on unregistered connectors") except replacing
      READ_ONCE(connector->registered) with drm_connector_is_unregistered().
      This gets rid of the behavior of allowing DPMS On<->Off, but that should
      be fine as it's more consistent with the UAPI we had before - danvet
    - s/drm_connector_unregistered/drm_connector_is_unregistered/ - danvet
    - Update documentation, fix some typos.
    
    Fixes: b5d29843 ("drm/atomic_helper: Allow DPMS On<->Off changes for unregistered connectors")
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: stable@vger.kernel.org
    Cc: David Airlie <airlied@linux.ie>
    Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181016203946.9601-1-lyude@redhat.com
    (cherry picked from commit 39b50c60)
    Fixes: e9655095 ("drm/atomic_helper: Disallow new modesets on unregistered connectors")
    Fixes: 34ca26a9 ("drm/atomic_helper: Allow DPMS On<->Off changes for unregistered connectors")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
    de9f8eea
drm_atomic_helper.c 120 KB