Commit 82fe50bc authored by Thomas Hellstrom's avatar Thomas Hellstrom Committed by Dave Airlie

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 5293908a
...@@ -696,6 +696,7 @@ static void ttm_bo_release(struct kref *kref) ...@@ -696,6 +696,7 @@ static void ttm_bo_release(struct kref *kref)
struct ttm_bo_device *bdev = bo->bdev; struct ttm_bo_device *bdev = bo->bdev;
struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type]; struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type];
write_lock(&bdev->vm_lock);
if (likely(bo->vm_node != NULL)) { if (likely(bo->vm_node != NULL)) {
rb_erase(&bo->vm_rb, &bdev->addr_space_rb); rb_erase(&bo->vm_rb, &bdev->addr_space_rb);
drm_mm_put_block(bo->vm_node); drm_mm_put_block(bo->vm_node);
...@@ -707,18 +708,14 @@ static void ttm_bo_release(struct kref *kref) ...@@ -707,18 +708,14 @@ static void ttm_bo_release(struct kref *kref)
ttm_mem_io_unlock(man); ttm_mem_io_unlock(man);
ttm_bo_cleanup_refs_or_queue(bo); ttm_bo_cleanup_refs_or_queue(bo);
kref_put(&bo->list_kref, ttm_bo_release_list); kref_put(&bo->list_kref, ttm_bo_release_list);
write_lock(&bdev->vm_lock);
} }
void ttm_bo_unref(struct ttm_buffer_object **p_bo) void ttm_bo_unref(struct ttm_buffer_object **p_bo)
{ {
struct ttm_buffer_object *bo = *p_bo; struct ttm_buffer_object *bo = *p_bo;
struct ttm_bo_device *bdev = bo->bdev;
*p_bo = NULL; *p_bo = NULL;
write_lock(&bdev->vm_lock);
kref_put(&bo->kref, ttm_bo_release); kref_put(&bo->kref, ttm_bo_release);
write_unlock(&bdev->vm_lock);
} }
EXPORT_SYMBOL(ttm_bo_unref); EXPORT_SYMBOL(ttm_bo_unref);
......
...@@ -259,8 +259,8 @@ int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma, ...@@ -259,8 +259,8 @@ int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
read_lock(&bdev->vm_lock); read_lock(&bdev->vm_lock);
bo = ttm_bo_vm_lookup_rb(bdev, vma->vm_pgoff, bo = ttm_bo_vm_lookup_rb(bdev, vma->vm_pgoff,
(vma->vm_end - vma->vm_start) >> PAGE_SHIFT); (vma->vm_end - vma->vm_start) >> PAGE_SHIFT);
if (likely(bo != NULL)) if (likely(bo != NULL) && !kref_get_unless_zero(&bo->kref))
ttm_bo_reference(bo); bo = NULL;
read_unlock(&bdev->vm_lock); read_unlock(&bdev->vm_lock);
if (unlikely(bo == NULL)) { if (unlikely(bo == NULL)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment