diff options
-rw-r--r-- | drivers/gpu/drm/drm_gem.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_internal.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_prime.c | 56 |
3 files changed, 10 insertions, 49 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index a0a3b6baa569..a8c1c7b7be6c 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -282,7 +282,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) if (obj->funcs->close) obj->funcs->close(obj, file_priv); - drm_prime_remove_buf_handle(&file_priv->prime, id); + drm_prime_remove_buf_handle(&file_priv->prime, obj->dma_buf, id); drm_vma_node_revoke(&obj->vma_node, file_priv); drm_gem_object_handle_put_unlocked(obj); diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h index 442eb31351dd..1572b8af543f 100644 --- a/drivers/gpu/drm/drm_internal.h +++ b/drivers/gpu/drm/drm_internal.h @@ -86,6 +86,7 @@ int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data, void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv); void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv); void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, + struct dma_buf *dma_buf, uint32_t handle); /* drm_managed.c */ diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index b703f83874e1..1d93b44c00c4 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -90,7 +90,6 @@ struct drm_prime_member { uint32_t handle; struct rb_node dmabuf_rb; - struct rb_node handle_rb; }; static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv, @@ -122,45 +121,9 @@ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv, rb_link_node(&member->dmabuf_rb, rb, p); rb_insert_color(&member->dmabuf_rb, &prime_fpriv->dmabufs); - rb = NULL; - p = &prime_fpriv->handles.rb_node; - while (*p) { - struct drm_prime_member *pos; - - rb = *p; - pos = rb_entry(rb, struct drm_prime_member, handle_rb); - if (handle > pos->handle) - p = &rb->rb_right; - else - p = &rb->rb_left; - } - rb_link_node(&member->handle_rb, rb, p); - rb_insert_color(&member->handle_rb, &prime_fpriv->handles); - return 0; } -static struct dma_buf *drm_prime_lookup_buf_by_handle(struct drm_prime_file_private *prime_fpriv, - uint32_t handle) -{ - struct rb_node *rb; - - rb = prime_fpriv->handles.rb_node; - while (rb) { - struct drm_prime_member *member; - - member = rb_entry(rb, struct drm_prime_member, handle_rb); - if (member->handle == handle) - return member->dma_buf; - else if (member->handle < handle) - rb = rb->rb_right; - else - rb = rb->rb_left; - } - - return NULL; -} - static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t *handle) @@ -186,25 +149,28 @@ static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpri } void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, + struct dma_buf *dma_buf, uint32_t handle) { struct rb_node *rb; + if (!dma_buf) + return; + mutex_lock(&prime_fpriv->lock); - rb = prime_fpriv->handles.rb_node; + rb = prime_fpriv->dmabufs.rb_node; while (rb) { struct drm_prime_member *member; - member = rb_entry(rb, struct drm_prime_member, handle_rb); - if (member->handle == handle) { - rb_erase(&member->handle_rb, &prime_fpriv->handles); + member = rb_entry(rb, struct drm_prime_member, dmabuf_rb); + if (member->dma_buf == dma_buf && member->handle == handle) { rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs); dma_buf_put(member->dma_buf); kfree(member); break; - } else if (member->handle < handle) { + } else if (member->dma_buf < dma_buf) { rb = rb->rb_right; } else { rb = rb->rb_left; @@ -446,12 +412,6 @@ struct dma_buf *drm_gem_prime_handle_to_dmabuf(struct drm_device *dev, goto out_unlock; } - dmabuf = drm_prime_lookup_buf_by_handle(&file_priv->prime, handle); - if (dmabuf) { - get_dma_buf(dmabuf); - goto out; - } - mutex_lock(&dev->object_name_lock); /* re-export the original imported/exported object */ if (obj->dma_buf) { |