[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