[PATCH 2/6] drm: Introduce drm_mode_object_{get,put}()
Daniel Vetter
daniel at ffwll.ch
Thu Feb 9 17:08:10 UTC 2017
On Wed, Feb 08, 2017 at 02:28:14PM -0500, Sean Paul wrote:
> 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).
Yeah, if you do a large-scale refactor anyway, I think it's best to just
store the cocci in the commit message. I think storing the cocci is ok if
you have thousands of hits among lots of subsystems, and it's clear it's
going to take at least a few release cycles or maybe even years to clean
it all up. drm is luckily not yet that big :-)
I'll drop this while applying if no one minds ...
-Daniel
>
> 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
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the dri-devel
mailing list