aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_gem.c
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2017-02-28 09:46:41 -0500
committerThierry Reding <treding@nvidia.com>2017-02-28 10:16:43 -0500
commite6b62714e87c8811d5564b6a0738dcde63a51774 (patch)
tree295fdcf6c17e379b393de020cd0c0848ba0a872b /drivers/gpu/drm/drm_gem.c
parenta4a69da06bc11a937a6e417938b1bb698ee1fa46 (diff)
drm: Introduce drm_gem_object_{get,put}()
For consistency with other reference counting APIs in the kernel, add drm_gem_object_get() and drm_gem_object_put(), as well as an unlocked variant of the latter, to reference count GEM buffer 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. The existing semantic patch for the DRM subsystem-wide conversion is extended to account for these new helpers. Reviewed-by: Sean Paul <seanpaul@chromium.org> Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170228144643.5668-6-thierry.reding@gmail.com
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
-rw-r--r--drivers/gpu/drm/drm_gem.c44
1 files changed, 22 insertions, 22 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index bc93de308673..b1e28c944637 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -218,7 +218,7 @@ static void drm_gem_object_exported_dma_buf_free(struct drm_gem_object *obj)
218} 218}
219 219
220static void 220static void
221drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj) 221drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
222{ 222{
223 struct drm_device *dev = obj->dev; 223 struct drm_device *dev = obj->dev;
224 bool final = false; 224 bool final = false;
@@ -241,7 +241,7 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
241 mutex_unlock(&dev->object_name_lock); 241 mutex_unlock(&dev->object_name_lock);
242 242
243 if (final) 243 if (final)
244 drm_gem_object_unreference_unlocked(obj); 244 drm_gem_object_put_unlocked(obj);
245} 245}
246 246
247/* 247/*
@@ -262,7 +262,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
262 if (dev->driver->gem_close_object) 262 if (dev->driver->gem_close_object)
263 dev->driver->gem_close_object(obj, file_priv); 263 dev->driver->gem_close_object(obj, file_priv);
264 264
265 drm_gem_object_handle_unreference_unlocked(obj); 265 drm_gem_object_handle_put_unlocked(obj);
266 266
267 return 0; 267 return 0;
268} 268}
@@ -352,7 +352,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
352 352
353 WARN_ON(!mutex_is_locked(&dev->object_name_lock)); 353 WARN_ON(!mutex_is_locked(&dev->object_name_lock));
354 if (obj->handle_count++ == 0) 354 if (obj->handle_count++ == 0)
355 drm_gem_object_reference(obj); 355 drm_gem_object_get(obj);
356 356
357 /* 357 /*
358 * Get the user-visible handle using idr. Preload and perform 358 * Get the user-visible handle using idr. Preload and perform
@@ -392,7 +392,7 @@ err_remove:
392 idr_remove(&file_priv->object_idr, handle); 392 idr_remove(&file_priv->object_idr, handle);
393 spin_unlock(&file_priv->table_lock); 393 spin_unlock(&file_priv->table_lock);
394err_unref: 394err_unref:
395 drm_gem_object_handle_unreference_unlocked(obj); 395 drm_gem_object_handle_put_unlocked(obj);
396 return ret; 396 return ret;
397} 397}
398 398
@@ -606,7 +606,7 @@ drm_gem_object_lookup(struct drm_file *filp, u32 handle)
606 /* Check if we currently have a reference on the object */ 606 /* Check if we currently have a reference on the object */
607 obj = idr_find(&filp->object_idr, handle); 607 obj = idr_find(&filp->object_idr, handle);
608 if (obj) 608 if (obj)
609 drm_gem_object_reference(obj); 609 drm_gem_object_get(obj);
610 610
611 spin_unlock(&filp->table_lock); 611 spin_unlock(&filp->table_lock);
612 612
@@ -683,7 +683,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data,
683 683
684err: 684err:
685 mutex_unlock(&dev->object_name_lock); 685 mutex_unlock(&dev->object_name_lock);
686 drm_gem_object_unreference_unlocked(obj); 686 drm_gem_object_put_unlocked(obj);
687 return ret; 687 return ret;
688} 688}
689 689
@@ -713,7 +713,7 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data,
713 mutex_lock(&dev->object_name_lock); 713 mutex_lock(&dev->object_name_lock);
714 obj = idr_find(&dev->object_name_idr, (int) args->name); 714 obj = idr_find(&dev->object_name_idr, (int) args->name);
715 if (obj) { 715 if (obj) {
716 drm_gem_object_reference(obj); 716 drm_gem_object_get(obj);
717 } else { 717 } else {
718 mutex_unlock(&dev->object_name_lock); 718 mutex_unlock(&dev->object_name_lock);
719 return -ENOENT; 719 return -ENOENT;
@@ -721,7 +721,7 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data,
721 721
722 /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */ 722 /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */
723 ret = drm_gem_handle_create_tail(file_priv, obj, &handle); 723 ret = drm_gem_handle_create_tail(file_priv, obj, &handle);
724 drm_gem_object_unreference_unlocked(obj); 724 drm_gem_object_put_unlocked(obj);
725 if (ret) 725 if (ret)
726 return ret; 726 return ret;
727 727
@@ -809,16 +809,16 @@ drm_gem_object_free(struct kref *kref)
809EXPORT_SYMBOL(drm_gem_object_free); 809EXPORT_SYMBOL(drm_gem_object_free);
810 810
811/** 811/**
812 * drm_gem_object_unreference_unlocked - release a GEM BO reference 812 * drm_gem_object_put_unlocked - drop a GEM buffer object reference
813 * @obj: GEM buffer object 813 * @obj: GEM buffer object
814 * 814 *
815 * This releases a reference to @obj. Callers must not hold the 815 * This releases a reference to @obj. Callers must not hold the
816 * &drm_device.struct_mutex lock when calling this function. 816 * &drm_device.struct_mutex lock when calling this function.
817 * 817 *
818 * See also __drm_gem_object_unreference(). 818 * See also __drm_gem_object_put().
819 */ 819 */
820void 820void
821drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) 821drm_gem_object_put_unlocked(struct drm_gem_object *obj)
822{ 822{
823 struct drm_device *dev; 823 struct drm_device *dev;
824 824
@@ -834,10 +834,10 @@ drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
834 &dev->struct_mutex)) 834 &dev->struct_mutex))
835 mutex_unlock(&dev->struct_mutex); 835 mutex_unlock(&dev->struct_mutex);
836} 836}
837EXPORT_SYMBOL(drm_gem_object_unreference_unlocked); 837EXPORT_SYMBOL(drm_gem_object_put_unlocked);
838 838
839/** 839/**
840 * drm_gem_object_unreference - release a GEM BO reference 840 * drm_gem_object_put - release a GEM buffer object reference
841 * @obj: GEM buffer object 841 * @obj: GEM buffer object
842 * 842 *
843 * This releases a reference to @obj. Callers must hold the 843 * This releases a reference to @obj. Callers must hold the
@@ -845,10 +845,10 @@ EXPORT_SYMBOL(drm_gem_object_unreference_unlocked);
845 * driver doesn't use &drm_device.struct_mutex for anything. 845 * driver doesn't use &drm_device.struct_mutex for anything.
846 * 846 *
847 * For drivers not encumbered with legacy locking use 847 * For drivers not encumbered with legacy locking use
848 * drm_gem_object_unreference_unlocked() instead. 848 * drm_gem_object_put_unlocked() instead.
849 */ 849 */
850void 850void
851drm_gem_object_unreference(struct drm_gem_object *obj) 851drm_gem_object_put(struct drm_gem_object *obj)
852{ 852{
853 if (obj) { 853 if (obj) {
854 WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex)); 854 WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
@@ -856,7 +856,7 @@ drm_gem_object_unreference(struct drm_gem_object *obj)
856 kref_put(&obj->refcount, drm_gem_object_free); 856 kref_put(&obj->refcount, drm_gem_object_free);
857 } 857 }
858} 858}
859EXPORT_SYMBOL(drm_gem_object_unreference); 859EXPORT_SYMBOL(drm_gem_object_put);
860 860
861/** 861/**
862 * drm_gem_vm_open - vma->ops->open implementation for GEM 862 * drm_gem_vm_open - vma->ops->open implementation for GEM
@@ -869,7 +869,7 @@ void drm_gem_vm_open(struct vm_area_struct *vma)
869{ 869{
870 struct drm_gem_object *obj = vma->vm_private_data; 870 struct drm_gem_object *obj = vma->vm_private_data;
871 871
872 drm_gem_object_reference(obj); 872 drm_gem_object_get(obj);
873} 873}
874EXPORT_SYMBOL(drm_gem_vm_open); 874EXPORT_SYMBOL(drm_gem_vm_open);
875 875
@@ -884,7 +884,7 @@ void drm_gem_vm_close(struct vm_area_struct *vma)
884{ 884{
885 struct drm_gem_object *obj = vma->vm_private_data; 885 struct drm_gem_object *obj = vma->vm_private_data;
886 886
887 drm_gem_object_unreference_unlocked(obj); 887 drm_gem_object_put_unlocked(obj);
888} 888}
889EXPORT_SYMBOL(drm_gem_vm_close); 889EXPORT_SYMBOL(drm_gem_vm_close);
890 890
@@ -935,7 +935,7 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
935 * (which should happen whether the vma was created by this call, or 935 * (which should happen whether the vma was created by this call, or
936 * by a vm_open due to mremap or partial unmap or whatever). 936 * by a vm_open due to mremap or partial unmap or whatever).
937 */ 937 */
938 drm_gem_object_reference(obj); 938 drm_gem_object_get(obj);
939 939
940 return 0; 940 return 0;
941} 941}
@@ -992,14 +992,14 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
992 return -EINVAL; 992 return -EINVAL;
993 993
994 if (!drm_vma_node_is_allowed(node, priv)) { 994 if (!drm_vma_node_is_allowed(node, priv)) {
995 drm_gem_object_unreference_unlocked(obj); 995 drm_gem_object_put_unlocked(obj);
996 return -EACCES; 996 return -EACCES;
997 } 997 }
998 998
999 ret = drm_gem_mmap_obj(obj, drm_vma_node_size(node) << PAGE_SHIFT, 999 ret = drm_gem_mmap_obj(obj, drm_vma_node_size(node) << PAGE_SHIFT,
1000 vma); 1000 vma);
1001 1001
1002 drm_gem_object_unreference_unlocked(obj); 1002 drm_gem_object_put_unlocked(obj);
1003 1003
1004 return ret; 1004 return ret;
1005} 1005}