[PATCH 6/6] drm: Introduce drm_property_blob_{get,put}()
Sean Paul
seanpaul at chromium.org
Wed Feb 8 19:45:08 UTC 2017
On Wed, Feb 08, 2017 at 07:24:08PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding at nvidia.com>
>
> 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 at chromium.org>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
> 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 at p(object)
> __drm_gem_object_unreference(object)
> |
> drm_gem_object_unreference_unlocked(object)
> +|
> +drm_property_unreference_blob at p(object)
> +|
> +drm_property_reference_blob at p(object)
> )
>
> @script:python depends on report@
> --
> 2.11.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Sean Paul, Software Engineer, Google / Chromium OS
More information about the dri-devel
mailing list