struct ttm_bo_device *bdev = bo->bdev;
        struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type];
 
+       write_lock(&bdev->vm_lock);
        if (likely(bo->vm_node != NULL)) {
                rb_erase(&bo->vm_rb, &bdev->addr_space_rb);
                drm_mm_put_block(bo->vm_node);
        ttm_mem_io_unlock(man);
        ttm_bo_cleanup_refs_or_queue(bo);
        kref_put(&bo->list_kref, ttm_bo_release_list);
-       write_lock(&bdev->vm_lock);
 }
 
 void ttm_bo_unref(struct ttm_buffer_object **p_bo)
 {
        struct ttm_buffer_object *bo = *p_bo;
-       struct ttm_bo_device *bdev = bo->bdev;
 
        *p_bo = NULL;
-       write_lock(&bdev->vm_lock);
        kref_put(&bo->kref, ttm_bo_release);
-       write_unlock(&bdev->vm_lock);
 }
 EXPORT_SYMBOL(ttm_bo_unref);
 
 
        read_lock(&bdev->vm_lock);
        bo = ttm_bo_vm_lookup_rb(bdev, vma->vm_pgoff,
                                 (vma->vm_end - vma->vm_start) >> PAGE_SHIFT);
-       if (likely(bo != NULL))
-               ttm_bo_reference(bo);
+       if (likely(bo != NULL) && !kref_get_unless_zero(&bo->kref))
+               bo = NULL;
        read_unlock(&bdev->vm_lock);
 
        if (unlikely(bo == NULL)) {