aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ttm
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2012-11-21 09:53:21 -0500
committerDave Airlie <airlied@redhat.com>2012-11-28 03:37:59 -0500
commit82fe50bcc87e508e85250c87b745296a36a07897 (patch)
tree6fd205d9d0a92391e9bf5cf31a442a54992fe0b5 /drivers/gpu/drm/ttm
parent5293908afa04b651cc8a7e85ba0938b71f97c2f8 (diff)
drm/ttm: Optimize vm locking using kref_get_unless_zero v3
Removes the need for a write lock each time we call ttm_bo_unref(). v2: Remove an unused variable. v3: Really remove the unused variable. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/ttm')
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c5
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_vm.c4
2 files changed, 3 insertions, 6 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 7426fe59108e..2c54c3d414b3 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -696,6 +696,7 @@ static void ttm_bo_release(struct kref *kref)
696 struct ttm_bo_device *bdev = bo->bdev; 696 struct ttm_bo_device *bdev = bo->bdev;
697 struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type]; 697 struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type];
698 698
699 write_lock(&bdev->vm_lock);
699 if (likely(bo->vm_node != NULL)) { 700 if (likely(bo->vm_node != NULL)) {
700 rb_erase(&bo->vm_rb, &bdev->addr_space_rb); 701 rb_erase(&bo->vm_rb, &bdev->addr_space_rb);
701 drm_mm_put_block(bo->vm_node); 702 drm_mm_put_block(bo->vm_node);
@@ -707,18 +708,14 @@ static void ttm_bo_release(struct kref *kref)
707 ttm_mem_io_unlock(man); 708 ttm_mem_io_unlock(man);
708 ttm_bo_cleanup_refs_or_queue(bo); 709 ttm_bo_cleanup_refs_or_queue(bo);
709 kref_put(&bo->list_kref, ttm_bo_release_list); 710 kref_put(&bo->list_kref, ttm_bo_release_list);
710 write_lock(&bdev->vm_lock);
711} 711}
712 712
713void ttm_bo_unref(struct ttm_buffer_object **p_bo) 713void ttm_bo_unref(struct ttm_buffer_object **p_bo)
714{ 714{
715 struct ttm_buffer_object *bo = *p_bo; 715 struct ttm_buffer_object *bo = *p_bo;
716 struct ttm_bo_device *bdev = bo->bdev;
717 716
718 *p_bo = NULL; 717 *p_bo = NULL;
719 write_lock(&bdev->vm_lock);
720 kref_put(&bo->kref, ttm_bo_release); 718 kref_put(&bo->kref, ttm_bo_release);
721 write_unlock(&bdev->vm_lock);
722} 719}
723EXPORT_SYMBOL(ttm_bo_unref); 720EXPORT_SYMBOL(ttm_bo_unref);
724 721
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index 3ba72dbdc4bd..74705f329d99 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -259,8 +259,8 @@ int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
259 read_lock(&bdev->vm_lock); 259 read_lock(&bdev->vm_lock);
260 bo = ttm_bo_vm_lookup_rb(bdev, vma->vm_pgoff, 260 bo = ttm_bo_vm_lookup_rb(bdev, vma->vm_pgoff,
261 (vma->vm_end - vma->vm_start) >> PAGE_SHIFT); 261 (vma->vm_end - vma->vm_start) >> PAGE_SHIFT);
262 if (likely(bo != NULL)) 262 if (likely(bo != NULL) && !kref_get_unless_zero(&bo->kref))
263 ttm_bo_reference(bo); 263 bo = NULL;
264 read_unlock(&bdev->vm_lock); 264 read_unlock(&bdev->vm_lock);
265 265
266 if (unlikely(bo == NULL)) { 266 if (unlikely(bo == NULL)) {