On Wed, Feb 08, 2017 at 07:24:08PM +0100, Thierry Reding wrote:
> From: Thierry Reding <tred...@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 <seanp...@chromium.org>

> Signed-off-by: Thierry Reding <tred...@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@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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to