On Wed, Feb 08, 2017 at 07:24:05PM +0100, Thierry Reding wrote: > From: Thierry Reding <treding@xxxxxxxxxx> > > For consistency with other reference counting APIs in the kernel, add > drm_connector_get() and drm_connector_put() functions to reference count > connectors. > > Compatibility aliases are added to keep existing code working. To help > speed up the transition, all the instances of the old functions in the > DRM core are already replaced in this commit. > > The existing semantic patch for mode object reference count conversion > is extended for these new helpers. > drivers/gpu/drm/* Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > Signed-off-by: Thierry Reding <treding@xxxxxxxxxx> > --- > drivers/gpu/drm/drm_atomic.c | 8 +++---- > drivers/gpu/drm/drm_atomic_helper.c | 4 ++-- > drivers/gpu/drm/drm_connector.c | 10 ++++---- > drivers/gpu/drm/drm_crtc.c | 2 +- > drivers/gpu/drm/drm_crtc_helper.c | 6 ++--- > drivers/gpu/drm/drm_fb_helper.c | 12 +++++----- > drivers/gpu/drm/drm_mode_config.c | 2 +- > include/drm/drm_connector.h | 41 +++++++++++++++++++++++++------- > scripts/coccinelle/api/drm-get-put.cocci | 10 ++++++++ > 9 files changed, 65 insertions(+), 30 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 2bb0a759e8ec..82bad40b2f3e 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -150,7 +150,7 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state) > state->connectors[i].state); > state->connectors[i].ptr = NULL; > state->connectors[i].state = NULL; > - drm_connector_unreference(connector); > + drm_connector_put(connector); > } > > for (i = 0; i < config->num_crtc; i++) { > @@ -1026,7 +1026,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state, > if (!connector_state) > return ERR_PTR(-ENOMEM); > > - drm_connector_reference(connector); > + drm_connector_get(connector); > state->connectors[index].state = connector_state; > state->connectors[index].ptr = connector; > connector_state->state = state; > @@ -1357,7 +1357,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, > crtc_state->connector_mask &= > ~(1 << drm_connector_index(conn_state->connector)); > > - drm_connector_unreference(conn_state->connector); > + drm_connector_put(conn_state->connector); > conn_state->crtc = NULL; > } > > @@ -1369,7 +1369,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, > crtc_state->connector_mask |= > 1 << drm_connector_index(conn_state->connector); > > - drm_connector_reference(conn_state->connector); > + drm_connector_get(conn_state->connector); > conn_state->crtc = crtc; > > DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n", > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > index 9a08445a7a7a..9f2c28ddf948 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -3272,7 +3272,7 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector, > { > memcpy(state, connector->state, sizeof(*state)); > if (state->crtc) > - drm_connector_reference(connector); > + drm_connector_get(connector); > } > EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state); > > @@ -3398,7 +3398,7 @@ void > __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state) > { > if (state->crtc) > - drm_connector_unreference(state->connector); > + drm_connector_put(state->connector); > } > EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state); > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index 0616062b055a..0dc0e5b33f8a 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -35,8 +35,8 @@ > * als fixed panels or anything else that can display pixels in some form. As > * opposed to all other KMS objects representing hardware (like CRTC, encoder or > * plane abstractions) connectors can be hotplugged and unplugged at runtime. > - * Hence they are reference-counted using drm_connector_reference() and > - * drm_connector_unreference(). > + * Hence they are reference-counted using drm_connector_get() and > + * drm_connector_put(). > * > * KMS driver must create, initialize, register and attach at a &struct > * drm_connector for each such sink. The instance is created as other KMS > @@ -545,7 +545,7 @@ drm_connector_list_iter_next(struct drm_connector_list_iter *iter) > spin_unlock_irqrestore(&config->connector_list_lock, flags); > > if (old_conn) > - drm_connector_unreference(old_conn); > + drm_connector_put(old_conn); > > return iter->conn; > } > @@ -564,7 +564,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter) > { > iter->dev = NULL; > if (iter->conn) > - drm_connector_unreference(iter->conn); > + drm_connector_put(iter->conn); > lock_release(&connector_list_iter_dep_map, 0, _RET_IP_); > } > EXPORT_SYMBOL(drm_connector_list_iter_put); > @@ -1249,7 +1249,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, > out: > mutex_unlock(&dev->mode_config.mutex); > out_unref: > - drm_connector_unreference(connector); > + drm_connector_put(connector); > > return ret; > } > diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c > index e2284539f82c..9594c623799b 100644 > --- a/drivers/gpu/drm/drm_crtc.c > +++ b/drivers/gpu/drm/drm_crtc.c > @@ -685,7 +685,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, > if (connector_set) { > for (i = 0; i < crtc_req->count_connectors; i++) { > if (connector_set[i]) > - drm_connector_unreference(connector_set[i]); > + drm_connector_put(connector_set[i]); > } > } > kfree(connector_set); > diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c > index 44ba0e990d6c..536051c627d8 100644 > --- a/drivers/gpu/drm/drm_crtc_helper.c > +++ b/drivers/gpu/drm/drm_crtc_helper.c > @@ -465,7 +465,7 @@ drm_crtc_helper_disable(struct drm_crtc *crtc) > connector->dpms = DRM_MODE_DPMS_OFF; > > /* we keep a reference while the encoder is bound */ > - drm_connector_unreference(connector); > + drm_connector_put(connector); > } > drm_connector_list_iter_put(&conn_iter); > } > @@ -623,7 +623,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) > for (ro = 0; ro < set->num_connectors; ro++) { > if (set->connectors[ro]->encoder) > continue; > - drm_connector_reference(set->connectors[ro]); > + drm_connector_get(set->connectors[ro]); > } > > /* a) traverse passed in connector list and get encoders for them */ > @@ -772,7 +772,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) > for (ro = 0; ro < set->num_connectors; ro++) { > if (set->connectors[ro]->encoder) > continue; > - drm_connector_unreference(set->connectors[ro]); > + drm_connector_put(set->connectors[ro]); > } > > /* Try to restore the config */ > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index f6d4d9700734..ee1361a24b3a 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -141,7 +141,7 @@ int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) > struct drm_fb_helper_connector *fb_helper_connector = > fb_helper->connector_info[i]; > > - drm_connector_unreference(fb_helper_connector->connector); > + drm_connector_put(fb_helper_connector->connector); > > kfree(fb_helper_connector); > fb_helper->connector_info[i] = NULL; > @@ -178,7 +178,7 @@ 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); > + drm_connector_get(connector); > fb_helper_connector->connector = connector; > fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; > return 0; > @@ -204,7 +204,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); > + drm_connector_put(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]; > @@ -626,7 +626,7 @@ static void drm_fb_helper_modeset_release(struct drm_fb_helper *helper, > int i; > > for (i = 0; i < modeset->num_connectors; i++) { > - drm_connector_unreference(modeset->connectors[i]); > + drm_connector_put(modeset->connectors[i]); > modeset->connectors[i] = NULL; > } > modeset->num_connectors = 0; > @@ -643,7 +643,7 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper) > int i; > > for (i = 0; i < helper->connector_count; i++) { > - drm_connector_unreference(helper->connector_info[i]->connector); > + drm_connector_put(helper->connector_info[i]->connector); > kfree(helper->connector_info[i]); > } > kfree(helper->connector_info); > @@ -2184,7 +2184,7 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper, > fb_crtc->y = offset->y; > modeset->mode = drm_mode_duplicate(dev, > fb_crtc->desired_mode); > - drm_connector_reference(connector); > + drm_connector_get(connector); > modeset->connectors[modeset->num_connectors++] = connector; > modeset->fb = fb_helper->fb; > modeset->x = offset->x; > diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c > index 884cc4d26fb5..20aec165abd7 100644 > --- a/drivers/gpu/drm/drm_mode_config.c > +++ b/drivers/gpu/drm/drm_mode_config.c > @@ -418,7 +418,7 @@ void drm_mode_config_cleanup(struct drm_device *dev) > * current connector itself, which means it is inherently safe > * against unreferencing the current connector - but not against > * deleting it right away. */ > - drm_connector_unreference(connector); > + drm_connector_put(connector); > } > drm_connector_list_iter_put(&conn_iter); > if (WARN_ON(!list_empty(&dev->mode_config.connector_list))) { > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index e5e1eddd19fb..d649bec96937 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -795,25 +795,50 @@ static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev, > } > > /** > - * drm_connector_reference - incr the connector refcnt > - * @connector: connector > + * drm_connector_get - acquire a connector reference > + * @connector: DRM connector > * > * This function increments the connector's refcount. > */ > +static inline void drm_connector_get(struct drm_connector *connector) > +{ > + drm_mode_object_get(&connector->base); > +} > + > +/** > + * drm_connector_put - release a connector reference > + * @connector: DRM connector > + * > + * This function decrements the connector's reference count and frees the > + * object if the reference count drops to zero. > + */ > +static inline void drm_connector_put(struct drm_connector *connector) > +{ > + drm_mode_object_put(&connector->base); > +} > + > +/** > + * drm_connector_reference - acquire a connector reference > + * @connector: DRM connector > + * > + * This is a compatibility alias for drm_connector_get() and should not be > + * used by new code. > + */ > static inline void drm_connector_reference(struct drm_connector *connector) > { > - drm_mode_object_reference(&connector->base); > + drm_connector_get(connector); > } > > /** > - * drm_connector_unreference - unref a connector > - * @connector: connector to unref > + * drm_connector_unreference - release a connector reference > + * @connector: DRM connector > * > - * This function decrements the connector's refcount and frees it if it drops to zero. > + * This is a compatibility alias for drm_connector_put() and should not be > + * used by new code. > */ > static inline void drm_connector_unreference(struct drm_connector *connector) > { > - drm_mode_object_unreference(&connector->base); > + drm_connector_put(connector); > } > > const char *drm_get_connector_status_name(enum drm_connector_status status); > @@ -905,7 +930,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter); > * > * Note that @connector is only valid within the list body, if you want to use > * @connector after calling drm_connector_list_iter_put() then you need to grab > - * your own reference first using drm_connector_reference(). > + * your own reference first using drm_connector_get(). > */ > #define drm_for_each_connector_iter(connector, iter) \ > while ((connector = drm_connector_list_iter_next(iter))) > diff --git a/scripts/coccinelle/api/drm-get-put.cocci b/scripts/coccinelle/api/drm-get-put.cocci > index a3742447c981..8a4c2cb7889e 100644 > --- a/scripts/coccinelle/api/drm-get-put.cocci > +++ b/scripts/coccinelle/api/drm-get-put.cocci > @@ -20,6 +20,12 @@ expression object; > | > - drm_mode_object_unreference(object) > + drm_mode_object_put(object) > +| > +- drm_connector_reference(object) > ++ drm_connector_get(object) > +| > +- drm_connector_unreference(object) > ++ drm_connector_put(object) > ) > > @r depends on report@ > @@ -31,6 +37,10 @@ position p; > drm_mode_object_unreference@p(object) > | > drm_mode_object_reference@p(object) > +| > +drm_connector_unreference@p(object) > +| > +drm_connector_reference@p(object) > ) > > @script:python depends on report@ > -- > 2.11.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel