[PATCH 2/6] drm: Introduce drm_mode_object_{get,put}()

Sean Paul seanpaul at chromium.org
Wed Feb 8 19:28:14 UTC 2017


On Wed, Feb 08, 2017 at 07:24:04PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding at nvidia.com>
> 
> For consistency with other reference counting APIs in the kernel, add
> drm_mode_object_get() and drm_mode_object_put() to reference count DRM
> mode objects.
> 
> 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.
> 

drm code looks good and is 

Reviewed-by: Sean Paul <seanpaul at chromium.org>

> A semantic patch is provided that can be used to convert all drivers to
> the new helpers.

I'm not convinced we need to commit the cocci patch. I think including it in
your cover letter and then following up with a follow on series to actually make
the change is sufficient (See: ickle's s/fence/dma_fence/ series).

Sean

> 
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
>  drivers/gpu/drm/drm_atomic.c             | 14 +++++------
>  drivers/gpu/drm/drm_mode_object.c        | 26 ++++++++++----------
>  drivers/gpu/drm/drm_property.c           |  6 ++---
>  include/drm/drm_mode_object.h            | 36 ++++++++++++++++++++++-----
>  scripts/coccinelle/api/drm-get-put.cocci | 42 ++++++++++++++++++++++++++++++++
>  5 files changed, 95 insertions(+), 29 deletions(-)
>  create mode 100644 scripts/coccinelle/api/drm-get-put.cocci
> 
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index a5673107db26..2bb0a759e8ec 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -2122,13 +2122,13 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>  		}
>  
>  		if (!obj->properties) {
> -			drm_mode_object_unreference(obj);
> +			drm_mode_object_put(obj);
>  			ret = -ENOENT;
>  			goto out;
>  		}
>  
>  		if (get_user(count_props, count_props_ptr + copied_objs)) {
> -			drm_mode_object_unreference(obj);
> +			drm_mode_object_put(obj);
>  			ret = -EFAULT;
>  			goto out;
>  		}
> @@ -2141,14 +2141,14 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>  			struct drm_property *prop;
>  
>  			if (get_user(prop_id, props_ptr + copied_props)) {
> -				drm_mode_object_unreference(obj);
> +				drm_mode_object_put(obj);
>  				ret = -EFAULT;
>  				goto out;
>  			}
>  
>  			prop = drm_mode_obj_find_prop_id(obj, prop_id);
>  			if (!prop) {
> -				drm_mode_object_unreference(obj);
> +				drm_mode_object_put(obj);
>  				ret = -ENOENT;
>  				goto out;
>  			}
> @@ -2156,14 +2156,14 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>  			if (copy_from_user(&prop_value,
>  					   prop_values_ptr + copied_props,
>  					   sizeof(prop_value))) {
> -				drm_mode_object_unreference(obj);
> +				drm_mode_object_put(obj);
>  				ret = -EFAULT;
>  				goto out;
>  			}
>  
>  			ret = atomic_set_prop(state, obj, prop, prop_value);
>  			if (ret) {
> -				drm_mode_object_unreference(obj);
> +				drm_mode_object_put(obj);
>  				goto out;
>  			}
>  
> @@ -2176,7 +2176,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>  			plane_mask |= (1 << drm_plane_index(plane));
>  			plane->old_fb = plane->fb;
>  		}
> -		drm_mode_object_unreference(obj);
> +		drm_mode_object_put(obj);
>  	}
>  
>  	ret = prepare_crtc_signaling(dev, state, arg, file_priv, &fence_state,
> diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
> index 3b405dbf1b8d..da9a9adbcc98 100644
> --- a/drivers/gpu/drm/drm_mode_object.c
> +++ b/drivers/gpu/drm/drm_mode_object.c
> @@ -133,7 +133,7 @@ struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev,
>   *
>   * This function is used to look up a modeset object. It will acquire a
>   * reference for reference counted objects. This reference must be dropped again
> - * by callind drm_mode_object_unreference().
> + * by callind drm_mode_object_put().
>   */
>  struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
>  		uint32_t id, uint32_t type)
> @@ -146,38 +146,38 @@ struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
>  EXPORT_SYMBOL(drm_mode_object_find);
>  
>  /**
> - * drm_mode_object_unreference - decr the object refcnt
> - * @obj: mode_object
> + * drm_mode_object_put - release a mode object reference
> + * @obj: DRM mode object
>   *
>   * This function decrements the object's refcount if it is a refcounted modeset
>   * object. It is a no-op on any other object. This is used to drop references
> - * acquired with drm_mode_object_reference().
> + * acquired with drm_mode_object_get().
>   */
> -void drm_mode_object_unreference(struct drm_mode_object *obj)
> +void drm_mode_object_put(struct drm_mode_object *obj)
>  {
>  	if (obj->free_cb) {
>  		DRM_DEBUG("OBJ ID: %d (%d)\n", obj->id, kref_read(&obj->refcount));
>  		kref_put(&obj->refcount, obj->free_cb);
>  	}
>  }
> -EXPORT_SYMBOL(drm_mode_object_unreference);
> +EXPORT_SYMBOL(drm_mode_object_put);
>  
>  /**
> - * drm_mode_object_reference - incr the object refcnt
> - * @obj: mode_object
> + * drm_mode_object_get - acquire a mode object reference
> + * @obj: DRM mode object
>   *
>   * This function increments the object's refcount if it is a refcounted modeset
>   * object. It is a no-op on any other object. References should be dropped again
> - * by calling drm_mode_object_unreference().
> + * by calling drm_mode_object_put().
>   */
> -void drm_mode_object_reference(struct drm_mode_object *obj)
> +void drm_mode_object_get(struct drm_mode_object *obj)
>  {
>  	if (obj->free_cb) {
>  		DRM_DEBUG("OBJ ID: %d (%d)\n", obj->id, kref_read(&obj->refcount));
>  		kref_get(&obj->refcount);
>  	}
>  }
> -EXPORT_SYMBOL(drm_mode_object_reference);
> +EXPORT_SYMBOL(drm_mode_object_get);
>  
>  /**
>   * drm_object_attach_property - attach a property to a modeset object
> @@ -363,7 +363,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
>  			&arg->count_props);
>  
>  out_unref:
> -	drm_mode_object_unreference(obj);
> +	drm_mode_object_put(obj);
>  out:
>  	drm_modeset_unlock_all(dev);
>  	return ret;
> @@ -428,7 +428,7 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
>  	drm_property_change_valid_put(property, ref);
>  
>  out_unref:
> -	drm_mode_object_unreference(arg_obj);
> +	drm_mode_object_put(arg_obj);
>  out:
>  	drm_modeset_unlock_all(dev);
>  	return ret;
> diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c
> index 411e470369c0..15af0d42e8be 100644
> --- a/drivers/gpu/drm/drm_property.c
> +++ b/drivers/gpu/drm/drm_property.c
> @@ -597,7 +597,7 @@ void drm_property_unreference_blob(struct drm_property_blob *blob)
>  	if (!blob)
>  		return;
>  
> -	drm_mode_object_unreference(&blob->base);
> +	drm_mode_object_put(&blob->base);
>  }
>  EXPORT_SYMBOL(drm_property_unreference_blob);
>  
> @@ -625,7 +625,7 @@ void drm_property_destroy_user_blobs(struct drm_device *dev,
>   */
>  struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob)
>  {
> -	drm_mode_object_reference(&blob->base);
> +	drm_mode_object_get(&blob->base);
>  	return blob;
>  }
>  EXPORT_SYMBOL(drm_property_reference_blob);
> @@ -906,7 +906,7 @@ void drm_property_change_valid_put(struct drm_property *property,
>  		return;
>  
>  	if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
> -		drm_mode_object_unreference(ref);
> +		drm_mode_object_put(ref);
>  	} else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB))
>  		drm_property_unreference_blob(obj_to_blob(ref));
>  }
> diff --git a/include/drm/drm_mode_object.h b/include/drm/drm_mode_object.h
> index 2c017adf6d74..a767b4a30a6d 100644
> --- a/include/drm/drm_mode_object.h
> +++ b/include/drm/drm_mode_object.h
> @@ -45,10 +45,10 @@ struct drm_device;
>   *   drm_object_attach_property() before the object is visible to userspace.
>   *
>   * - For objects with dynamic lifetimes (as indicated by a non-NULL @free_cb) it
> - *   provides reference counting through drm_mode_object_reference() and
> - *   drm_mode_object_unreference(). This is used by &drm_framebuffer,
> - *   &drm_connector and &drm_property_blob. These objects provide specialized
> - *   reference counting wrappers.
> + *   provides reference counting through drm_mode_object_get() and
> + *   drm_mode_object_put(). This is used by &drm_framebuffer, &drm_connector
> + *   and &drm_property_blob. These objects provide specialized reference
> + *   counting wrappers.
>   */
>  struct drm_mode_object {
>  	uint32_t id;
> @@ -114,8 +114,32 @@ struct drm_object_properties {
>  
>  struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
>  					     uint32_t id, uint32_t type);
> -void drm_mode_object_reference(struct drm_mode_object *obj);
> -void drm_mode_object_unreference(struct drm_mode_object *obj);
> +void drm_mode_object_get(struct drm_mode_object *obj);
> +void drm_mode_object_put(struct drm_mode_object *obj);
> +
> +/**
> + * drm_mode_object_reference - acquire a mode object reference
> + * @obj: DRM mode object
> + *
> + * This is a compatibility alias for drm_mode_object_get() and should not be
> + * used by new code.
> + */
> +static inline void drm_mode_object_reference(struct drm_mode_object *obj)
> +{
> +	drm_mode_object_get(obj);
> +}
> +
> +/**
> + * drm_mode_object_unreference - release a mode object reference
> + * @obj: DRM mode object
> + *
> + * This is a compatibility alias for drm_mode_object_put() and should not be
> + * used by new code.
> + */
> +static inline void drm_mode_object_unreference(struct drm_mode_object *obj)
> +{
> +	drm_mode_object_put(obj);
> +}
>  
>  int drm_object_property_set_value(struct drm_mode_object *obj,
>  				  struct drm_property *property,
> diff --git a/scripts/coccinelle/api/drm-get-put.cocci b/scripts/coccinelle/api/drm-get-put.cocci
> new file mode 100644
> index 000000000000..a3742447c981
> --- /dev/null
> +++ b/scripts/coccinelle/api/drm-get-put.cocci
> @@ -0,0 +1,42 @@
> +///
> +/// Use drm_*_get() and drm_*_put() helpers instead of drm_*_reference() and
> +/// drm_*_unreference() helpers.
> +///
> +// Confidence: High
> +// Copyright: (C) 2017 NVIDIA Corporation
> +// Options: --no-includes --include-headers
> +//
> +
> +virtual patch
> +virtual report
> +
> + at depends on patch@
> +expression object;
> +@@
> +
> +(
> +- drm_mode_object_reference(object)
> ++ drm_mode_object_get(object)
> +|
> +- drm_mode_object_unreference(object)
> ++ drm_mode_object_put(object)
> +)
> +
> + at r depends on report@
> +expression object;
> +position p;
> +@@
> +
> +(
> +drm_mode_object_unreference at p(object)
> +|
> +drm_mode_object_reference at p(object)
> +)
> +
> + at script:python depends on report@
> +object << r.object;
> +p << r.p;
> +@@
> +
> +msg="WARNING: use get/put helpers to reference and dereference %s" % (object)
> +coccilib.report.print_report(p[0], msg)
> -- 
> 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