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>
This commit is contained in:
Родитель
5293908afa
Коммит
82fe50bcc8
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче