On Wed, Feb 08, 2017 at 07:24:08PM +0100, Thierry Reding wrote: > From: Thierry Reding <treding@xxxxxxxxxx> > > For consistency with other reference counting APIs in the kernel, add > drm_property_blob_get() and drm_property_blob_put() to reference count > DRM blob properties. > > 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. > > A semantic patch is provided that can be used to convert all drivers to > the new helpers. > Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > Signed-off-by: Thierry Reding <treding@xxxxxxxxxx> > --- > drivers/gpu/drm/drm_atomic.c | 16 ++++++------- > drivers/gpu/drm/drm_atomic_helper.c | 18 +++++++------- > drivers/gpu/drm/drm_mode_config.c | 2 +- > drivers/gpu/drm/drm_property.c | 40 ++++++++++++++++---------------- > include/drm/drm_property.h | 35 ++++++++++++++++++++++++---- > scripts/coccinelle/api/drm-get-put.cocci | 10 ++++++++ > 6 files changed, 78 insertions(+), 43 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 740650b450c5..ff5f1756a7ff 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -322,7 +322,7 @@ int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, > if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) > return 0; > > - drm_property_unreference_blob(state->mode_blob); > + drm_property_blob_put(state->mode_blob); > state->mode_blob = NULL; > > if (mode) { > @@ -368,7 +368,7 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state, > if (blob == state->mode_blob) > return 0; > > - drm_property_unreference_blob(state->mode_blob); > + drm_property_blob_put(state->mode_blob); > state->mode_blob = NULL; > > memset(&state->mode, 0, sizeof(state->mode)); > @@ -380,7 +380,7 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state, > blob->data)) > return -EINVAL; > > - state->mode_blob = drm_property_reference_blob(blob); > + state->mode_blob = drm_property_blob_get(blob); > state->enable = true; > DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n", > state->mode.name, state); > @@ -413,9 +413,9 @@ drm_atomic_replace_property_blob(struct drm_property_blob **blob, > if (old_blob == new_blob) > return; > > - drm_property_unreference_blob(old_blob); > + drm_property_blob_put(old_blob); > if (new_blob) > - drm_property_reference_blob(new_blob); > + drm_property_blob_get(new_blob); > *blob = new_blob; > *replaced = true; > > @@ -437,13 +437,13 @@ drm_atomic_replace_property_blob_from_id(struct drm_crtc *crtc, > return -EINVAL; > > if (expected_size > 0 && expected_size != new_blob->length) { > - drm_property_unreference_blob(new_blob); > + drm_property_blob_put(new_blob); > return -EINVAL; > } > } > > drm_atomic_replace_property_blob(blob, new_blob, replaced); > - drm_property_unreference_blob(new_blob); > + drm_property_blob_put(new_blob); > > return 0; > } > @@ -478,7 +478,7 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc, > struct drm_property_blob *mode = > drm_property_lookup_blob(dev, val); > ret = drm_atomic_set_mode_prop_for_crtc(state, mode); > - drm_property_unreference_blob(mode); > + drm_property_blob_put(mode); > return ret; > } else if (property == config->degamma_lut_property) { > ret = drm_atomic_replace_property_blob_from_id(crtc, > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > index 4dcd64ca34c8..863f302b5bf9 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -3042,13 +3042,13 @@ void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc, > memcpy(state, crtc->state, sizeof(*state)); > > if (state->mode_blob) > - drm_property_reference_blob(state->mode_blob); > + drm_property_blob_get(state->mode_blob); > if (state->degamma_lut) > - drm_property_reference_blob(state->degamma_lut); > + drm_property_blob_get(state->degamma_lut); > if (state->ctm) > - drm_property_reference_blob(state->ctm); > + drm_property_blob_get(state->ctm); > if (state->gamma_lut) > - drm_property_reference_blob(state->gamma_lut); > + drm_property_blob_get(state->gamma_lut); > state->mode_changed = false; > state->active_changed = false; > state->planes_changed = false; > @@ -3092,10 +3092,10 @@ EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state); > */ > void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state) > { > - drm_property_unreference_blob(state->mode_blob); > - drm_property_unreference_blob(state->degamma_lut); > - drm_property_unreference_blob(state->ctm); > - drm_property_unreference_blob(state->gamma_lut); > + drm_property_blob_put(state->mode_blob); > + drm_property_blob_put(state->degamma_lut); > + drm_property_blob_put(state->ctm); > + drm_property_blob_put(state->gamma_lut); > } > EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state); > > @@ -3493,7 +3493,7 @@ int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc, > goto backoff; > > drm_atomic_state_put(state); > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > return ret; > > backoff: > diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c > index 20aec165abd7..37779b9f0c1e 100644 > --- a/drivers/gpu/drm/drm_mode_config.c > +++ b/drivers/gpu/drm/drm_mode_config.c > @@ -444,7 +444,7 @@ void drm_mode_config_cleanup(struct drm_device *dev) > > list_for_each_entry_safe(blob, bt, &dev->mode_config.property_blob_list, > head_global) { > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > } > > /* > diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c > index 15af0d42e8be..b17959c3e099 100644 > --- a/drivers/gpu/drm/drm_property.c > +++ b/drivers/gpu/drm/drm_property.c > @@ -587,19 +587,19 @@ drm_property_create_blob(struct drm_device *dev, size_t length, > EXPORT_SYMBOL(drm_property_create_blob); > > /** > - * drm_property_unreference_blob - Unreference a blob property > - * @blob: Pointer to blob property > + * drm_property_blob_put - release a blob property reference > + * @blob: DRM blob property > * > - * Drop a reference on a blob property. May free the object. > + * Releases a reference to a blob property. May free the object. > */ > -void drm_property_unreference_blob(struct drm_property_blob *blob) > +void drm_property_blob_put(struct drm_property_blob *blob) > { > if (!blob) > return; > > drm_mode_object_put(&blob->base); > } > -EXPORT_SYMBOL(drm_property_unreference_blob); > +EXPORT_SYMBOL(drm_property_blob_put); > > void drm_property_destroy_user_blobs(struct drm_device *dev, > struct drm_file *file_priv) > @@ -612,23 +612,23 @@ void drm_property_destroy_user_blobs(struct drm_device *dev, > */ > list_for_each_entry_safe(blob, bt, &file_priv->blobs, head_file) { > list_del_init(&blob->head_file); > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > } > } > > /** > - * drm_property_reference_blob - Take a reference on an existing property > - * @blob: Pointer to blob property > + * drm_property_blob_get - acquire blob property reference > + * @blob: DRM blob property > * > - * Take a new reference on an existing blob property. Returns @blob, which > + * Acquires a reference to an existing blob property. Returns @blob, which > * allows this to be used as a shorthand in assignments. > */ > -struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob) > +struct drm_property_blob *drm_property_blob_get(struct drm_property_blob *blob) > { > drm_mode_object_get(&blob->base); > return blob; > } > -EXPORT_SYMBOL(drm_property_reference_blob); > +EXPORT_SYMBOL(drm_property_blob_get); > > /** > * drm_property_lookup_blob - look up a blob property and take a reference > @@ -637,7 +637,7 @@ EXPORT_SYMBOL(drm_property_reference_blob); > * > * If successful, this takes an additional reference to the blob property. > * callers need to make sure to eventually unreference the returned property > - * again, using @drm_property_unreference_blob. > + * again, using drm_property_blob_put(). > * > * Return: > * NULL on failure, pointer to the blob on success. > @@ -712,13 +712,13 @@ int drm_property_replace_global_blob(struct drm_device *dev, > goto err_created; > } > > - drm_property_unreference_blob(old_blob); > + drm_property_blob_put(old_blob); > *replace = new_blob; > > return 0; > > err_created: > - drm_property_unreference_blob(new_blob); > + drm_property_blob_put(new_blob); > return ret; > } > EXPORT_SYMBOL(drm_property_replace_global_blob); > @@ -747,7 +747,7 @@ int drm_mode_getblob_ioctl(struct drm_device *dev, > } > out_resp->length = blob->length; > unref: > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > > return ret; > } > @@ -784,7 +784,7 @@ int drm_mode_createblob_ioctl(struct drm_device *dev, > return 0; > > out_blob: > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > return ret; > } > > @@ -823,14 +823,14 @@ int drm_mode_destroyblob_ioctl(struct drm_device *dev, > mutex_unlock(&dev->mode_config.blob_lock); > > /* One reference from lookup, and one from the filp. */ > - drm_property_unreference_blob(blob); > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > + drm_property_blob_put(blob); > > return 0; > > err: > mutex_unlock(&dev->mode_config.blob_lock); > - drm_property_unreference_blob(blob); > + drm_property_blob_put(blob); > > return ret; > } > @@ -908,5 +908,5 @@ void drm_property_change_valid_put(struct drm_property *property, > if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) { > drm_mode_object_put(ref); > } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB)) > - drm_property_unreference_blob(obj_to_blob(ref)); > + drm_property_blob_put(obj_to_blob(ref)); > } > diff --git a/include/drm/drm_property.h b/include/drm/drm_property.h > index f66fdb47551c..13e8c17d1c79 100644 > --- a/include/drm/drm_property.h > +++ b/include/drm/drm_property.h > @@ -200,9 +200,8 @@ struct drm_property { > * Blobs are used to store bigger values than what fits directly into the 64 > * bits available for a &drm_property. > * > - * Blobs are reference counted using drm_property_reference_blob() and > - * drm_property_unreference_blob(). They are created using > - * drm_property_create_blob(). > + * Blobs are reference counted using drm_property_blob_get() and > + * drm_property_blob_put(). They are created using drm_property_create_blob(). > */ > struct drm_property_blob { > struct drm_mode_object base; > @@ -274,8 +273,34 @@ int drm_property_replace_global_blob(struct drm_device *dev, > const void *data, > struct drm_mode_object *obj_holds_id, > struct drm_property *prop_holds_id); > -struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob); > -void drm_property_unreference_blob(struct drm_property_blob *blob); > +struct drm_property_blob *drm_property_blob_get(struct drm_property_blob *blob); > +void drm_property_blob_put(struct drm_property_blob *blob); > + > +/** > + * drm_property_reference_blob - acquire a blob property reference > + * @blob: DRM blob property > + * > + * This is a compatibility alias for drm_property_blob_get() and should not be > + * used by new code. > + */ > +static inline struct drm_property_blob * > +drm_property_reference_blob(struct drm_property_blob *blob) > +{ > + return drm_property_blob_get(blob); > +} > + > +/** > + * drm_property_unreference_blob - release a blob property reference > + * @blob: DRM blob property > + * > + * This is a compatibility alias for drm_property_blob_put() and should not be > + * used by new code. > + */ > +static inline void > +drm_property_unreference_blob(struct drm_property_blob *blob) > +{ > + drm_property_blob_put(blob); > +} > > /** > * drm_connector_find - find property object > diff --git a/scripts/coccinelle/api/drm-get-put.cocci b/scripts/coccinelle/api/drm-get-put.cocci > index 24882547b4d1..0c7a9265c07e 100644 > --- a/scripts/coccinelle/api/drm-get-put.cocci > +++ b/scripts/coccinelle/api/drm-get-put.cocci > @@ -44,6 +44,12 @@ expression object; > | > - drm_gem_object_unreference_unlocked(object) > + drm_gem_object_put_unlocked(object) > +| > +- drm_property_reference_blob(object) > ++ drm_property_blob_get(object) > +| > +- drm_property_unreference_blob(object) > ++ drm_property_blob_put(object) > ) > > @r depends on report@ > @@ -71,6 +77,10 @@ drm_gem_object_reference@p(object) > __drm_gem_object_unreference(object) > | > drm_gem_object_unreference_unlocked(object) > +| > +drm_property_unreference_blob@p(object) > +| > +drm_property_reference_blob@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