Commit 832fd395 authored by Daniel Vetter's avatar Daniel Vetter

drm: Fix getconnector connection_mutex locking

I've fumbled my own idea and enthusiastically wrapped all the
getconnector code with the connection_mutex. But we only need it to
chase the connector->encoder link. Even there it's not really needed
since races with userspace won't matter, but better paranoid and
consistent about this stuff.

If we grap it everywhere connector probe callbacks can't grab it
themselves, which means they'll deadlock. i915 does that for the load
detect pipe. Furthermore i915 needs to do a ww dance since we also
need to grab the mutex of the load detect crtc.

This is a regression from

commit 6e9f798d
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Thu May 29 23:54:47 2014 +0200

    drm: Split connection_mutex out of mode_config.mutex (v3)

Cc: Rob Clark <robdclark@gmail.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reported-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarRob Clark <robdclark@gmail.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 562d55d9
...@@ -1838,7 +1838,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, ...@@ -1838,7 +1838,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id);
mutex_lock(&dev->mode_config.mutex); mutex_lock(&dev->mode_config.mutex);
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
connector = drm_connector_find(dev, out_resp->connector_id); connector = drm_connector_find(dev, out_resp->connector_id);
if (!connector) { if (!connector) {
...@@ -1872,10 +1871,12 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, ...@@ -1872,10 +1871,12 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
out_resp->mm_height = connector->display_info.height_mm; out_resp->mm_height = connector->display_info.height_mm;
out_resp->subpixel = connector->display_info.subpixel_order; out_resp->subpixel = connector->display_info.subpixel_order;
out_resp->connection = connector->status; out_resp->connection = connector->status;
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
if (connector->encoder) if (connector->encoder)
out_resp->encoder_id = connector->encoder->base.id; out_resp->encoder_id = connector->encoder->base.id;
else else
out_resp->encoder_id = 0; out_resp->encoder_id = 0;
drm_modeset_unlock(&dev->mode_config.connection_mutex);
/* /*
* This ioctl is called twice, once to determine how much space is * This ioctl is called twice, once to determine how much space is
...@@ -1937,7 +1938,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, ...@@ -1937,7 +1938,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
out_resp->count_encoders = encoders_count; out_resp->count_encoders = encoders_count;
out: out:
drm_modeset_unlock(&dev->mode_config.connection_mutex);
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment