On Thu, Jun 5, 2014 at 5:12 AM, Daniel Vetter <daniel.vetter@xxxxxxxx> wrote: > 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 6e9f798d91c526982cca0026cd451e8fdbf18aaf > Author: Daniel Vetter <daniel.vetter@xxxxxxxx> > Date: Thu May 29 23:54:47 2014 +0200 > > drm: Split connection_mutex out of mode_config.mutex (v3) > > Cc: Rob Clark <robdclark@xxxxxxxxx> > Cc: Dave Airlie <airlied@xxxxxxxxxx> > Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Reported-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> Reviewed-by: Rob Clark <robdclark@xxxxxxxxx> > --- > drivers/gpu/drm/drm_crtc.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c > index b8cc4fe0a0f7..fe94cc10cd35 100644 > --- a/drivers/gpu/drm/drm_crtc.c > +++ b/drivers/gpu/drm/drm_crtc.c > @@ -1838,7 +1838,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, > DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); > > mutex_lock(&dev->mode_config.mutex); > - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); > > connector = drm_connector_find(dev, out_resp->connector_id); > if (!connector) { > @@ -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->subpixel = connector->display_info.subpixel_order; > out_resp->connection = connector->status; > + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); > if (connector->encoder) > out_resp->encoder_id = connector->encoder->base.id; > else > 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 > @@ -1937,7 +1938,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, > out_resp->count_encoders = encoders_count; > > out: > - drm_modeset_unlock(&dev->mode_config.connection_mutex); > mutex_unlock(&dev->mode_config.mutex); > > return ret; > -- > 2.0.0 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel