diff options
| -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 7426fe59108..2c54c3d414b 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)  	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); @@ -707,18 +708,14 @@ static void ttm_bo_release(struct kref *kref)  	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); diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index 3ba72dbdc4b..74705f329d9 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,  	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)) {  |