diff options
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
-rw-r--r-- | drivers/gpu/drm/drm_gem.c | 21 |
1 files changed, 5 insertions, 16 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 4018b3bfc72e..aa89d4b0b4c4 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
@@ -192,9 +192,7 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle) | |||
192 | idr_remove(&filp->object_idr, handle); | 192 | idr_remove(&filp->object_idr, handle); |
193 | spin_unlock(&filp->table_lock); | 193 | spin_unlock(&filp->table_lock); |
194 | 194 | ||
195 | mutex_lock(&dev->struct_mutex); | 195 | drm_gem_object_handle_unreference_unlocked(obj); |
196 | drm_gem_object_handle_unreference(obj); | ||
197 | mutex_unlock(&dev->struct_mutex); | ||
198 | 196 | ||
199 | return 0; | 197 | return 0; |
200 | } | 198 | } |
@@ -325,9 +323,7 @@ again: | |||
325 | } | 323 | } |
326 | 324 | ||
327 | err: | 325 | err: |
328 | mutex_lock(&dev->struct_mutex); | 326 | drm_gem_object_unreference_unlocked(obj); |
329 | drm_gem_object_unreference(obj); | ||
330 | mutex_unlock(&dev->struct_mutex); | ||
331 | return ret; | 327 | return ret; |
332 | } | 328 | } |
333 | 329 | ||
@@ -358,9 +354,7 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data, | |||
358 | return -ENOENT; | 354 | return -ENOENT; |
359 | 355 | ||
360 | ret = drm_gem_handle_create(file_priv, obj, &handle); | 356 | ret = drm_gem_handle_create(file_priv, obj, &handle); |
361 | mutex_lock(&dev->struct_mutex); | 357 | drm_gem_object_unreference_unlocked(obj); |
362 | drm_gem_object_unreference(obj); | ||
363 | mutex_unlock(&dev->struct_mutex); | ||
364 | if (ret) | 358 | if (ret) |
365 | return ret; | 359 | return ret; |
366 | 360 | ||
@@ -390,7 +384,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) | |||
390 | { | 384 | { |
391 | struct drm_gem_object *obj = ptr; | 385 | struct drm_gem_object *obj = ptr; |
392 | 386 | ||
393 | drm_gem_object_handle_unreference(obj); | 387 | drm_gem_object_handle_unreference_unlocked(obj); |
394 | 388 | ||
395 | return 0; | 389 | return 0; |
396 | } | 390 | } |
@@ -403,12 +397,10 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) | |||
403 | void | 397 | void |
404 | drm_gem_release(struct drm_device *dev, struct drm_file *file_private) | 398 | drm_gem_release(struct drm_device *dev, struct drm_file *file_private) |
405 | { | 399 | { |
406 | mutex_lock(&dev->struct_mutex); | ||
407 | idr_for_each(&file_private->object_idr, | 400 | idr_for_each(&file_private->object_idr, |
408 | &drm_gem_object_release_handle, NULL); | 401 | &drm_gem_object_release_handle, NULL); |
409 | 402 | ||
410 | idr_destroy(&file_private->object_idr); | 403 | idr_destroy(&file_private->object_idr); |
411 | mutex_unlock(&dev->struct_mutex); | ||
412 | } | 404 | } |
413 | 405 | ||
414 | static void | 406 | static void |
@@ -516,11 +508,8 @@ EXPORT_SYMBOL(drm_gem_vm_open); | |||
516 | void drm_gem_vm_close(struct vm_area_struct *vma) | 508 | void drm_gem_vm_close(struct vm_area_struct *vma) |
517 | { | 509 | { |
518 | struct drm_gem_object *obj = vma->vm_private_data; | 510 | struct drm_gem_object *obj = vma->vm_private_data; |
519 | struct drm_device *dev = obj->dev; | ||
520 | 511 | ||
521 | mutex_lock(&dev->struct_mutex); | 512 | drm_gem_object_unreference_unlocked(obj); |
522 | drm_gem_object_unreference(obj); | ||
523 | mutex_unlock(&dev->struct_mutex); | ||
524 | } | 513 | } |
525 | EXPORT_SYMBOL(drm_gem_vm_close); | 514 | EXPORT_SYMBOL(drm_gem_vm_close); |
526 | 515 | ||