Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Revert "drm/prime: remove drm_prime_lookup_buf_by_handle"

This reverts commit c2aa5603af309968a10f8e0d929ec7662ada5f78.

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Simona Vetter <simona.vetter@ffwll.ch>
Link: https://lore.kernel.org/r/aEwls5hPP9p-DPtt@phenom.ffwll.local

+49 -10
+1 -1
drivers/gpu/drm/drm_gem.c
··· 282 282 if (obj->funcs->close) 283 283 obj->funcs->close(obj, file_priv); 284 284 285 - drm_prime_remove_buf_handle(&file_priv->prime, obj->dma_buf, id); 285 + drm_prime_remove_buf_handle(&file_priv->prime, id); 286 286 drm_vma_node_revoke(&obj->vma_node, file_priv); 287 287 288 288 drm_gem_object_handle_put_unlocked(obj);
-1
drivers/gpu/drm/drm_internal.h
··· 86 86 void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv); 87 87 void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv); 88 88 void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, 89 - struct dma_buf *dma_buf, 90 89 uint32_t handle); 91 90 92 91 /* drm_managed.c */
+48 -8
drivers/gpu/drm/drm_prime.c
··· 90 90 uint32_t handle; 91 91 92 92 struct rb_node dmabuf_rb; 93 + struct rb_node handle_rb; 93 94 }; 94 95 95 96 static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv, ··· 122 121 rb_link_node(&member->dmabuf_rb, rb, p); 123 122 rb_insert_color(&member->dmabuf_rb, &prime_fpriv->dmabufs); 124 123 124 + rb = NULL; 125 + p = &prime_fpriv->handles.rb_node; 126 + while (*p) { 127 + struct drm_prime_member *pos; 128 + 129 + rb = *p; 130 + pos = rb_entry(rb, struct drm_prime_member, handle_rb); 131 + if (handle > pos->handle) 132 + p = &rb->rb_right; 133 + else 134 + p = &rb->rb_left; 135 + } 136 + rb_link_node(&member->handle_rb, rb, p); 137 + rb_insert_color(&member->handle_rb, &prime_fpriv->handles); 138 + 125 139 return 0; 140 + } 141 + 142 + static struct dma_buf *drm_prime_lookup_buf_by_handle(struct drm_prime_file_private *prime_fpriv, 143 + uint32_t handle) 144 + { 145 + struct rb_node *rb; 146 + 147 + rb = prime_fpriv->handles.rb_node; 148 + while (rb) { 149 + struct drm_prime_member *member; 150 + 151 + member = rb_entry(rb, struct drm_prime_member, handle_rb); 152 + if (member->handle == handle) 153 + return member->dma_buf; 154 + else if (member->handle < handle) 155 + rb = rb->rb_right; 156 + else 157 + rb = rb->rb_left; 158 + } 159 + 160 + return NULL; 126 161 } 127 162 128 163 static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpriv, ··· 186 149 } 187 150 188 151 void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, 189 - struct dma_buf *dma_buf, 190 152 uint32_t handle) 191 153 { 192 154 struct rb_node *rb; 193 155 194 - if (!dma_buf) 195 - return; 196 - 197 156 mutex_lock(&prime_fpriv->lock); 198 157 199 - rb = prime_fpriv->dmabufs.rb_node; 158 + rb = prime_fpriv->handles.rb_node; 200 159 while (rb) { 201 160 struct drm_prime_member *member; 202 161 203 - member = rb_entry(rb, struct drm_prime_member, dmabuf_rb); 204 - if (member->dma_buf == dma_buf && member->handle == handle) { 162 + member = rb_entry(rb, struct drm_prime_member, handle_rb); 163 + if (member->handle == handle) { 164 + rb_erase(&member->handle_rb, &prime_fpriv->handles); 205 165 rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs); 206 166 207 167 dma_buf_put(member->dma_buf); 208 168 kfree(member); 209 169 break; 210 - } else if (member->dma_buf < dma_buf) { 170 + } else if (member->handle < handle) { 211 171 rb = rb->rb_right; 212 172 } else { 213 173 rb = rb->rb_left; ··· 444 410 if (!obj) { 445 411 dmabuf = ERR_PTR(-ENOENT); 446 412 goto out_unlock; 413 + } 414 + 415 + dmabuf = drm_prime_lookup_buf_by_handle(&file_priv->prime, handle); 416 + if (dmabuf) { 417 + get_dma_buf(dmabuf); 418 + goto out; 447 419 } 448 420 449 421 mutex_lock(&dev->object_name_lock);