diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2012-11-21 09:53:21 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-11-28 03:37:59 -0500 |
commit | 82fe50bcc87e508e85250c87b745296a36a07897 (patch) | |
tree | 6fd205d9d0a92391e9bf5cf31a442a54992fe0b5 /drivers/gpu/drm/ttm | |
parent | 5293908afa04b651cc8a7e85ba0938b71f97c2f8 (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.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_vm.c | 4 |
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 | ||
713 | void ttm_bo_unref(struct ttm_buffer_object **p_bo) | 713 | void 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 | } |
723 | EXPORT_SYMBOL(ttm_bo_unref); | 720 | EXPORT_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)) { |