On Tue, May 03, 2016 at 02:28:23PM +1000, Dave Airlie wrote:
> From: Dave Airlie <airlied at 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 at redhat.com>

Yeah I think this looks good now.

Reviewed-by: Daniel Vetter <daniel.vetter at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

Reply via email to