drm: introduce drm_dev_{get/put} functions

Reference counting functions in the kernel typically use get/put suffixes. For
maintaining coding style consistency, introduce drm_dev_{get/put} functions. All
callers of drm_dev_ref() API have been converted in this patch and hence it has
been dropped while the drm_dev_unref() API with non-trivial number of users
remains for compatibility.

The semantic patch scripts/coccinelle/api/drm-get-put.cocci has been updated
with the new helper for conversion of drm_dev_unref() to drm_dev_put()

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/6babda56134035a98220d5d37a4fd4048df214ce.1506413698.git.aishpant@gmail.com
This commit is contained in:
Aishwarya Pant 2017-09-26 13:58:49 +05:30 committed by Daniel Vetter
parent f2a44dd023
commit 9a96f55034
4 changed files with 41 additions and 22 deletions

View file

@ -286,13 +286,13 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
spin_lock_irqsave(&drm_minor_lock, flags); spin_lock_irqsave(&drm_minor_lock, flags);
minor = idr_find(&drm_minors_idr, minor_id); minor = idr_find(&drm_minors_idr, minor_id);
if (minor) if (minor)
drm_dev_ref(minor->dev); drm_dev_get(minor->dev);
spin_unlock_irqrestore(&drm_minor_lock, flags); spin_unlock_irqrestore(&drm_minor_lock, flags);
if (!minor) { if (!minor) {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} else if (drm_dev_is_unplugged(minor->dev)) { } else if (drm_dev_is_unplugged(minor->dev)) {
drm_dev_unref(minor->dev); drm_dev_put(minor->dev);
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
@ -301,7 +301,7 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
void drm_minor_release(struct drm_minor *minor) void drm_minor_release(struct drm_minor *minor)
{ {
drm_dev_unref(minor->dev); drm_dev_put(minor->dev);
} }
/** /**
@ -326,11 +326,11 @@ void drm_minor_release(struct drm_minor *minor)
* When cleaning up a device instance everything needs to be done in reverse: * When cleaning up a device instance everything needs to be done in reverse:
* First unpublish the device instance with drm_dev_unregister(). Then clean up * First unpublish the device instance with drm_dev_unregister(). Then clean up
* any other resources allocated at device initialization and drop the driver's * any other resources allocated at device initialization and drop the driver's
* reference to &drm_device using drm_dev_unref(). * reference to &drm_device using drm_dev_put().
* *
* Note that the lifetime rules for &drm_device instance has still a lot of * Note that the lifetime rules for &drm_device instance has still a lot of
* historical baggage. Hence use the reference counting provided by * historical baggage. Hence use the reference counting provided by
* drm_dev_ref() and drm_dev_unref() only carefully. * drm_dev_get() and drm_dev_put() only carefully.
* *
* It is recommended that drivers embed &struct drm_device into their own device * It is recommended that drivers embed &struct drm_device into their own device
* structure, which is supported through drm_dev_init(). * structure, which is supported through drm_dev_init().
@ -345,7 +345,7 @@ void drm_minor_release(struct drm_minor *minor)
* Cleans up all DRM device, calling drm_lastclose(). * Cleans up all DRM device, calling drm_lastclose().
* *
* Note: Use of this function is deprecated. It will eventually go away * Note: Use of this function is deprecated. It will eventually go away
* completely. Please use drm_dev_unregister() and drm_dev_unref() explicitly * completely. Please use drm_dev_unregister() and drm_dev_put() explicitly
* instead to make sure that the device isn't userspace accessible any more * instead to make sure that the device isn't userspace accessible any more
* while teardown is in progress, ensuring that userspace can't access an * while teardown is in progress, ensuring that userspace can't access an
* inconsistent state. * inconsistent state.
@ -360,7 +360,7 @@ void drm_put_dev(struct drm_device *dev)
} }
drm_dev_unregister(dev); drm_dev_unregister(dev);
drm_dev_unref(dev); drm_dev_put(dev);
} }
EXPORT_SYMBOL(drm_put_dev); EXPORT_SYMBOL(drm_put_dev);
@ -386,7 +386,7 @@ void drm_dev_unplug(struct drm_device *dev)
mutex_lock(&drm_global_mutex); mutex_lock(&drm_global_mutex);
drm_device_set_unplugged(dev); drm_device_set_unplugged(dev);
if (dev->open_count == 0) if (dev->open_count == 0)
drm_dev_unref(dev); drm_dev_put(dev);
mutex_unlock(&drm_global_mutex); mutex_unlock(&drm_global_mutex);
} }
EXPORT_SYMBOL(drm_dev_unplug); EXPORT_SYMBOL(drm_dev_unplug);
@ -475,8 +475,8 @@ static void drm_fs_inode_free(struct inode *inode)
* initialization sequence to make sure userspace can't access an inconsistent * initialization sequence to make sure userspace can't access an inconsistent
* state. * state.
* *
* The initial ref-count of the object is 1. Use drm_dev_ref() and * The initial ref-count of the object is 1. Use drm_dev_get() and
* drm_dev_unref() to take and drop further ref-counts. * drm_dev_put() to take and drop further ref-counts.
* *
* Note that for purely virtual devices @parent can be NULL. * Note that for purely virtual devices @parent can be NULL.
* *
@ -626,8 +626,8 @@ EXPORT_SYMBOL(drm_dev_fini);
* initialization sequence to make sure userspace can't access an inconsistent * initialization sequence to make sure userspace can't access an inconsistent
* state. * state.
* *
* The initial ref-count of the object is 1. Use drm_dev_ref() and * The initial ref-count of the object is 1. Use drm_dev_get() and
* drm_dev_unref() to take and drop further ref-counts. * drm_dev_put() to take and drop further ref-counts.
* *
* Note that for purely virtual devices @parent can be NULL. * Note that for purely virtual devices @parent can be NULL.
* *
@ -670,36 +670,49 @@ static void drm_dev_release(struct kref *ref)
} }
/** /**
* drm_dev_ref - Take reference of a DRM device * drm_dev_get - Take reference of a DRM device
* @dev: device to take reference of or NULL * @dev: device to take reference of or NULL
* *
* This increases the ref-count of @dev by one. You *must* already own a * This increases the ref-count of @dev by one. You *must* already own a
* reference when calling this. Use drm_dev_unref() to drop this reference * reference when calling this. Use drm_dev_put() to drop this reference
* again. * again.
* *
* This function never fails. However, this function does not provide *any* * This function never fails. However, this function does not provide *any*
* guarantee whether the device is alive or running. It only provides a * guarantee whether the device is alive or running. It only provides a
* reference to the object and the memory associated with it. * reference to the object and the memory associated with it.
*/ */
void drm_dev_ref(struct drm_device *dev) void drm_dev_get(struct drm_device *dev)
{ {
if (dev) if (dev)
kref_get(&dev->ref); kref_get(&dev->ref);
} }
EXPORT_SYMBOL(drm_dev_ref); EXPORT_SYMBOL(drm_dev_get);
/** /**
* drm_dev_unref - Drop reference of a DRM device * drm_dev_put - Drop reference of a DRM device
* @dev: device to drop reference of or NULL * @dev: device to drop reference of or NULL
* *
* This decreases the ref-count of @dev by one. The device is destroyed if the * This decreases the ref-count of @dev by one. The device is destroyed if the
* ref-count drops to zero. * ref-count drops to zero.
*/ */
void drm_dev_unref(struct drm_device *dev) void drm_dev_put(struct drm_device *dev)
{ {
if (dev) if (dev)
kref_put(&dev->ref, drm_dev_release); kref_put(&dev->ref, drm_dev_release);
} }
EXPORT_SYMBOL(drm_dev_put);
/**
* drm_dev_unref - Drop reference of a DRM device
* @dev: device to drop reference of or NULL
*
* This is a compatibility alias for drm_dev_put() and should not be used by new
* code.
*/
void drm_dev_unref(struct drm_device *dev)
{
drm_dev_put(dev);
}
EXPORT_SYMBOL(drm_dev_unref); EXPORT_SYMBOL(drm_dev_unref);
static int create_compat_control_link(struct drm_device *dev) static int create_compat_control_link(struct drm_device *dev)
@ -839,7 +852,7 @@ EXPORT_SYMBOL(drm_dev_register);
* *
* Unregister the DRM device from the system. This does the reverse of * Unregister the DRM device from the system. This does the reverse of
* drm_dev_register() but does not deallocate the device. The caller must call * drm_dev_register() but does not deallocate the device. The caller must call
* drm_dev_unref() to drop their final reference. * drm_dev_put() to drop their final reference.
* *
* A special form of unregistering for hotpluggable devices is drm_dev_unplug(), * A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
* which can be called while there are still open users of @dev. * which can be called while there are still open users of @dev.

View file

@ -318,7 +318,7 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
if (IS_ERR(dma_buf)) if (IS_ERR(dma_buf))
return dma_buf; return dma_buf;
drm_dev_ref(dev); drm_dev_get(dev);
drm_gem_object_get(exp_info->priv); drm_gem_object_get(exp_info->priv);
return dma_buf; return dma_buf;

View file

@ -155,7 +155,7 @@ struct drm_driver {
* reverse order of the initialization. Similarly to the load * reverse order of the initialization. Similarly to the load
* hook, this handler is deprecated and its usage should be * hook, this handler is deprecated and its usage should be
* dropped in favor of an open-coded teardown function at the * dropped in favor of an open-coded teardown function at the
* driver layer. See drm_dev_unregister() and drm_dev_unref() * driver layer. See drm_dev_unregister() and drm_dev_put()
* for the proper way to remove a &struct drm_device. * for the proper way to remove a &struct drm_device.
* *
* The unload() hook is called right after unregistering * The unload() hook is called right after unregistering
@ -611,7 +611,8 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
int drm_dev_register(struct drm_device *dev, unsigned long flags); int drm_dev_register(struct drm_device *dev, unsigned long flags);
void drm_dev_unregister(struct drm_device *dev); void drm_dev_unregister(struct drm_device *dev);
void drm_dev_ref(struct drm_device *dev); void drm_dev_get(struct drm_device *dev);
void drm_dev_put(struct drm_device *dev);
void drm_dev_unref(struct drm_device *dev); void drm_dev_unref(struct drm_device *dev);
void drm_put_dev(struct drm_device *dev); void drm_put_dev(struct drm_device *dev);
void drm_dev_unplug(struct drm_device *dev); void drm_dev_unplug(struct drm_device *dev);

View file

@ -50,6 +50,9 @@ expression object;
| |
- drm_property_unreference_blob(object) - drm_property_unreference_blob(object)
+ drm_property_blob_put(object) + drm_property_blob_put(object)
|
- drm_dev_unref(object)
+ drm_dev_put(object)
) )
@r depends on report@ @r depends on report@
@ -81,6 +84,8 @@ drm_gem_object_unreference_unlocked(object)
drm_property_unreference_blob@p(object) drm_property_unreference_blob@p(object)
| |
drm_property_reference_blob@p(object) drm_property_reference_blob@p(object)
|
drm_dev_unref@p(object)
) )
@script:python depends on report@ @script:python depends on report@