diff options
Diffstat (limited to 'include/drm/drmP.h')
| -rw-r--r-- | include/drm/drmP.h | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 774e1d49509..07e4726a4ee 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -612,7 +612,7 @@ struct drm_gem_object {  	struct kref refcount;  	/** Handle count of this object. Each handle also holds a reference */ -	struct kref handlecount; +	atomic_t handle_count; /* number of handles on this object */  	/** Related drm device */  	struct drm_device *dev; @@ -1461,7 +1461,7 @@ struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,  					    size_t size);  int drm_gem_object_init(struct drm_device *dev,  			struct drm_gem_object *obj, size_t size); -void drm_gem_object_handle_free(struct kref *kref); +void drm_gem_object_handle_free(struct drm_gem_object *obj);  void drm_gem_vm_open(struct vm_area_struct *vma);  void drm_gem_vm_close(struct vm_area_struct *vma);  int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); @@ -1496,7 +1496,7 @@ static inline void  drm_gem_object_handle_reference(struct drm_gem_object *obj)  {  	drm_gem_object_reference(obj); -	kref_get(&obj->handlecount); +	atomic_inc(&obj->handle_count);  }  static inline void @@ -1505,12 +1505,15 @@ drm_gem_object_handle_unreference(struct drm_gem_object *obj)  	if (obj == NULL)  		return; +	if (atomic_read(&obj->handle_count) == 0) +		return;  	/*  	 * Must bump handle count first as this may be the last  	 * ref, in which case the object would disappear before we  	 * checked for a name  	 */ -	kref_put(&obj->handlecount, drm_gem_object_handle_free); +	if (atomic_dec_and_test(&obj->handle_count)) +		drm_gem_object_handle_free(obj);  	drm_gem_object_unreference(obj);  } @@ -1520,12 +1523,17 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)  	if (obj == NULL)  		return; +	if (atomic_read(&obj->handle_count) == 0) +		return; +  	/*  	* Must bump handle count first as this may be the last  	* ref, in which case the object would disappear before we  	* checked for a name  	*/ -	kref_put(&obj->handlecount, drm_gem_object_handle_free); + +	if (atomic_dec_and_test(&obj->handle_count)) +		drm_gem_object_handle_free(obj);  	drm_gem_object_unreference_unlocked(obj);  }  |