diff options
Diffstat (limited to 'drivers/gpu/drm/drm_syncobj.c')
| -rw-r--r-- | drivers/gpu/drm/drm_syncobj.c | 80 | 
1 files changed, 22 insertions, 58 deletions
| diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 5c2091dbd230..db30a0e89db8 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -56,22 +56,6 @@  #include "drm_internal.h"  #include <drm/drm_syncobj.h> -struct drm_syncobj_stub_fence { -	struct dma_fence base; -	spinlock_t lock; -}; - -static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence) -{ -        return "syncobjstub"; -} - -static const struct dma_fence_ops drm_syncobj_stub_fence_ops = { -	.get_driver_name = drm_syncobj_stub_fence_get_name, -	.get_timeline_name = drm_syncobj_stub_fence_get_name, -}; - -  /**   * drm_syncobj_find - lookup and reference a sync object.   * @file_private: drm file private pointer @@ -113,8 +97,6 @@ static int drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj,  {  	int ret; -	WARN_ON(*fence); -  	*fence = drm_syncobj_fence_get(syncobj);  	if (*fence)  		return 1; @@ -158,13 +140,11 @@ void drm_syncobj_remove_callback(struct drm_syncobj *syncobj,  /**   * drm_syncobj_replace_fence - replace fence in a sync object.   * @syncobj: Sync object to replace fence in - * @point: timeline point   * @fence: fence to install in sync file.   * - * This replaces the fence on a sync object, or a timeline point fence. + * This replaces the fence on a sync object.   */  void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, -			       u64 point,  			       struct dma_fence *fence)  {  	struct dma_fence *old_fence; @@ -192,23 +172,18 @@ void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,  }  EXPORT_SYMBOL(drm_syncobj_replace_fence); -static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) +/** + * drm_syncobj_assign_null_handle - assign a stub fence to the sync object + * @syncobj: sync object to assign the fence on + * + * Assign a already signaled stub fence to the sync object. + */ +static void drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)  { -	struct drm_syncobj_stub_fence *fence; -	fence = kzalloc(sizeof(*fence), GFP_KERNEL); -	if (fence == NULL) -		return -ENOMEM; - -	spin_lock_init(&fence->lock); -	dma_fence_init(&fence->base, &drm_syncobj_stub_fence_ops, -		       &fence->lock, 0, 0); -	dma_fence_signal(&fence->base); - -	drm_syncobj_replace_fence(syncobj, 0, &fence->base); - -	dma_fence_put(&fence->base); +	struct dma_fence *fence = dma_fence_get_stub(); -	return 0; +	drm_syncobj_replace_fence(syncobj, fence); +	dma_fence_put(fence);  }  /** @@ -216,6 +191,7 @@ static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)   * @file_private: drm file private pointer   * @handle: sync object handle to lookup.   * @point: timeline point + * @flags: DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT or not   * @fence: out parameter for the fence   *   * This is just a convenience function that combines drm_syncobj_find() and @@ -226,7 +202,7 @@ static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)   * dma_fence_put().   */  int drm_syncobj_find_fence(struct drm_file *file_private, -			   u32 handle, u64 point, +			   u32 handle, u64 point, u64 flags,  			   struct dma_fence **fence)  {  	struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle); @@ -255,7 +231,7 @@ void drm_syncobj_free(struct kref *kref)  	struct drm_syncobj *syncobj = container_of(kref,  						   struct drm_syncobj,  						   refcount); -	drm_syncobj_replace_fence(syncobj, 0, NULL); +	drm_syncobj_replace_fence(syncobj, NULL);  	kfree(syncobj);  }  EXPORT_SYMBOL(drm_syncobj_free); @@ -275,7 +251,6 @@ EXPORT_SYMBOL(drm_syncobj_free);  int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,  		       struct dma_fence *fence)  { -	int ret;  	struct drm_syncobj *syncobj;  	syncobj = kzalloc(sizeof(struct drm_syncobj), GFP_KERNEL); @@ -286,16 +261,11 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,  	INIT_LIST_HEAD(&syncobj->cb_list);  	spin_lock_init(&syncobj->lock); -	if (flags & DRM_SYNCOBJ_CREATE_SIGNALED) { -		ret = drm_syncobj_assign_null_handle(syncobj); -		if (ret < 0) { -			drm_syncobj_put(syncobj); -			return ret; -		} -	} +	if (flags & DRM_SYNCOBJ_CREATE_SIGNALED) +		drm_syncobj_assign_null_handle(syncobj);  	if (fence) -		drm_syncobj_replace_fence(syncobj, 0, fence); +		drm_syncobj_replace_fence(syncobj, fence);  	*out_syncobj = syncobj;  	return 0; @@ -480,7 +450,7 @@ static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,  		return -ENOENT;  	} -	drm_syncobj_replace_fence(syncobj, 0, fence); +	drm_syncobj_replace_fence(syncobj, fence);  	dma_fence_put(fence);  	drm_syncobj_put(syncobj);  	return 0; @@ -497,7 +467,7 @@ static int drm_syncobj_export_sync_file(struct drm_file *file_private,  	if (fd < 0)  		return fd; -	ret = drm_syncobj_find_fence(file_private, handle, 0, &fence); +	ret = drm_syncobj_find_fence(file_private, handle, 0, 0, &fence);  	if (ret)  		goto err_put_fd; @@ -719,9 +689,6 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,  	if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {  		for (i = 0; i < count; ++i) { -			if (entries[i].fence) -				continue; -  			drm_syncobj_fence_get_or_add_callback(syncobjs[i],  							      &entries[i].fence,  							      &entries[i].syncobj_cb, @@ -954,7 +921,7 @@ drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,  		return ret;  	for (i = 0; i < args->count_handles; i++) -		drm_syncobj_replace_fence(syncobjs[i], 0, NULL); +		drm_syncobj_replace_fence(syncobjs[i], NULL);  	drm_syncobj_array_free(syncobjs, args->count_handles); @@ -986,11 +953,8 @@ drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,  	if (ret < 0)  		return ret; -	for (i = 0; i < args->count_handles; i++) { -		ret = drm_syncobj_assign_null_handle(syncobjs[i]); -		if (ret < 0) -			break; -	} +	for (i = 0; i < args->count_handles; i++) +		drm_syncobj_assign_null_handle(syncobjs[i]);  	drm_syncobj_array_free(syncobjs, args->count_handles); | 
