Message ID | 1462249706-4759-3-git-send-email-airlied@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, May 03, 2016 at 02:28:23PM +1000, Dave Airlie wrote: > From: Dave Airlie <airlied@redhat.com> > > This takes a reference count when fbdev adds the connector, > and drops it when it removes the connector. > > It also drops the now unneeded code to find connectors > and remove the from the modeset as they are reference counted. > > v2: drop references when removing all connectors at end. > > Signed-off-by: Dave Airlie <airlied@redhat.com> Yeah I think this looks good now. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> > --- > drivers/gpu/drm/drm_fb_helper.c | 38 +++++--------------------------------- > 1 file changed, 5 insertions(+), 33 deletions(-) > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index 855108e..19a7a71 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -153,40 +153,13 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_ > if (!fb_helper_connector) > return -ENOMEM; > > + drm_connector_reference(connector); > fb_helper_connector->connector = connector; > fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; > return 0; > } > EXPORT_SYMBOL(drm_fb_helper_add_one_connector); > > -static void remove_from_modeset(struct drm_mode_set *set, > - struct drm_connector *connector) > -{ > - int i, j; > - > - for (i = 0; i < set->num_connectors; i++) { > - if (set->connectors[i] == connector) > - break; > - } > - > - if (i == set->num_connectors) > - return; > - > - for (j = i + 1; j < set->num_connectors; j++) { > - set->connectors[j - 1] = set->connectors[j]; > - } > - set->num_connectors--; > - > - /* > - * TODO maybe need to makes sure we set it back to !=NULL somewhere? > - */ > - if (set->num_connectors == 0) { > - set->fb = NULL; > - drm_mode_destroy(connector->dev, set->mode); > - set->mode = NULL; > - } > -} > - > int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, > struct drm_connector *connector) > { > @@ -206,6 +179,7 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, > if (i == fb_helper->connector_count) > return -EINVAL; > fb_helper_connector = fb_helper->connector_info[i]; > + drm_connector_unreference(fb_helper_connector->connector); > > for (j = i + 1; j < fb_helper->connector_count; j++) { > fb_helper->connector_info[j - 1] = fb_helper->connector_info[j]; > @@ -213,10 +187,6 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, > fb_helper->connector_count--; > kfree(fb_helper_connector); > > - /* also cleanup dangling references to the connector: */ > - for (i = 0; i < fb_helper->crtc_count; i++) > - remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector); > - > return 0; > } > EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); > @@ -626,8 +596,10 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper) > { > int i; > > - for (i = 0; i < helper->connector_count; i++) > + for (i = 0; i < helper->connector_count; i++) { > + drm_connector_unreference(helper->connector_info[i]->connector); > kfree(helper->connector_info[i]); > + } > kfree(helper->connector_info); > for (i = 0; i < helper->crtc_count; i++) { > kfree(helper->crtc_info[i].mode_set.connectors); > -- > 2.5.5 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 855108e..19a7a71 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -153,40 +153,13 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_ if (!fb_helper_connector) return -ENOMEM; + drm_connector_reference(connector); fb_helper_connector->connector = connector; fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; return 0; } EXPORT_SYMBOL(drm_fb_helper_add_one_connector); -static void remove_from_modeset(struct drm_mode_set *set, - struct drm_connector *connector) -{ - int i, j; - - for (i = 0; i < set->num_connectors; i++) { - if (set->connectors[i] == connector) - break; - } - - if (i == set->num_connectors) - return; - - for (j = i + 1; j < set->num_connectors; j++) { - set->connectors[j - 1] = set->connectors[j]; - } - set->num_connectors--; - - /* - * TODO maybe need to makes sure we set it back to !=NULL somewhere? - */ - if (set->num_connectors == 0) { - set->fb = NULL; - drm_mode_destroy(connector->dev, set->mode); - set->mode = NULL; - } -} - int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector) { @@ -206,6 +179,7 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, if (i == fb_helper->connector_count) return -EINVAL; fb_helper_connector = fb_helper->connector_info[i]; + drm_connector_unreference(fb_helper_connector->connector); for (j = i + 1; j < fb_helper->connector_count; j++) { fb_helper->connector_info[j - 1] = fb_helper->connector_info[j]; @@ -213,10 +187,6 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, fb_helper->connector_count--; kfree(fb_helper_connector); - /* also cleanup dangling references to the connector: */ - for (i = 0; i < fb_helper->crtc_count; i++) - remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector); - return 0; } EXPORT_SYMBOL(drm_fb_helper_remove_one_connector); @@ -626,8 +596,10 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper) { int i; - for (i = 0; i < helper->connector_count; i++) + for (i = 0; i < helper->connector_count; i++) { + drm_connector_unreference(helper->connector_info[i]->connector); kfree(helper->connector_info[i]); + } kfree(helper->connector_info); for (i = 0; i < helper->crtc_count; i++) { kfree(helper->crtc_info[i].mode_set.connectors);