.. | .. |
---|
252 | 252 | } |
---|
253 | 253 | EXPORT_SYMBOL(drm_gem_map_detach); |
---|
254 | 254 | |
---|
255 | | -void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv, |
---|
256 | | - struct dma_buf *dma_buf) |
---|
| 255 | +void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, |
---|
| 256 | + uint32_t handle) |
---|
257 | 257 | { |
---|
258 | 258 | struct rb_node *rb; |
---|
259 | 259 | |
---|
260 | | - rb = prime_fpriv->dmabufs.rb_node; |
---|
| 260 | + mutex_lock(&prime_fpriv->lock); |
---|
| 261 | + |
---|
| 262 | + rb = prime_fpriv->handles.rb_node; |
---|
261 | 263 | while (rb) { |
---|
262 | 264 | struct drm_prime_member *member; |
---|
263 | 265 | |
---|
264 | | - member = rb_entry(rb, struct drm_prime_member, dmabuf_rb); |
---|
265 | | - if (member->dma_buf == dma_buf) { |
---|
| 266 | + member = rb_entry(rb, struct drm_prime_member, handle_rb); |
---|
| 267 | + if (member->handle == handle) { |
---|
266 | 268 | rb_erase(&member->handle_rb, &prime_fpriv->handles); |
---|
267 | 269 | rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs); |
---|
268 | 270 | |
---|
269 | | - dma_buf_put(dma_buf); |
---|
| 271 | + dma_buf_put(member->dma_buf); |
---|
270 | 272 | kfree(member); |
---|
271 | | - return; |
---|
272 | | - } else if (member->dma_buf < dma_buf) { |
---|
| 273 | + break; |
---|
| 274 | + } else if (member->handle < handle) { |
---|
273 | 275 | rb = rb->rb_right; |
---|
274 | 276 | } else { |
---|
275 | 277 | rb = rb->rb_left; |
---|
276 | 278 | } |
---|
277 | 279 | } |
---|
| 280 | + |
---|
| 281 | + mutex_unlock(&prime_fpriv->lock); |
---|
278 | 282 | } |
---|
279 | 283 | |
---|
280 | 284 | /** |
---|