diff options
Diffstat (limited to 'drivers/gpu/drm/drm_prime.c')
| -rw-r--r-- | drivers/gpu/drm/drm_prime.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index a3f180653b8b..eb09e86044c6 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -190,29 +190,33 @@ static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpri  	return -ENOENT;  } -void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv, -					struct dma_buf *dma_buf) +void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, +				 uint32_t handle)  {  	struct rb_node *rb; -	rb = prime_fpriv->dmabufs.rb_node; +	mutex_lock(&prime_fpriv->lock); + +	rb = prime_fpriv->handles.rb_node;  	while (rb) {  		struct drm_prime_member *member; -		member = rb_entry(rb, struct drm_prime_member, dmabuf_rb); -		if (member->dma_buf == dma_buf) { +		member = rb_entry(rb, struct drm_prime_member, handle_rb); +		if (member->handle == handle) {  			rb_erase(&member->handle_rb, &prime_fpriv->handles);  			rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs); -			dma_buf_put(dma_buf); +			dma_buf_put(member->dma_buf);  			kfree(member); -			return; -		} else if (member->dma_buf < dma_buf) { +			break; +		} else if (member->handle < handle) {  			rb = rb->rb_right;  		} else {  			rb = rb->rb_left;  		}  	} + +	mutex_unlock(&prime_fpriv->lock);  }  void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)  | 
