diff options
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo.c')
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 8d5a646ebe6a..07e02c4bf5a8 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
@@ -151,7 +151,7 @@ static void ttm_bo_release_list(struct kref *list_kref) | |||
151 | atomic_dec(&bo->glob->bo_count); | 151 | atomic_dec(&bo->glob->bo_count); |
152 | if (bo->resv == &bo->ttm_resv) | 152 | if (bo->resv == &bo->ttm_resv) |
153 | reservation_object_fini(&bo->ttm_resv); | 153 | reservation_object_fini(&bo->ttm_resv); |
154 | 154 | mutex_destroy(&bo->wu_mutex); | |
155 | if (bo->destroy) | 155 | if (bo->destroy) |
156 | bo->destroy(bo); | 156 | bo->destroy(bo); |
157 | else { | 157 | else { |
@@ -1123,6 +1123,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev, | |||
1123 | INIT_LIST_HEAD(&bo->ddestroy); | 1123 | INIT_LIST_HEAD(&bo->ddestroy); |
1124 | INIT_LIST_HEAD(&bo->swap); | 1124 | INIT_LIST_HEAD(&bo->swap); |
1125 | INIT_LIST_HEAD(&bo->io_reserve_lru); | 1125 | INIT_LIST_HEAD(&bo->io_reserve_lru); |
1126 | mutex_init(&bo->wu_mutex); | ||
1126 | bo->bdev = bdev; | 1127 | bo->bdev = bdev; |
1127 | bo->glob = bdev->glob; | 1128 | bo->glob = bdev->glob; |
1128 | bo->type = type; | 1129 | bo->type = type; |
@@ -1704,3 +1705,35 @@ void ttm_bo_swapout_all(struct ttm_bo_device *bdev) | |||
1704 | ; | 1705 | ; |
1705 | } | 1706 | } |
1706 | EXPORT_SYMBOL(ttm_bo_swapout_all); | 1707 | EXPORT_SYMBOL(ttm_bo_swapout_all); |
1708 | |||
1709 | /** | ||
1710 | * ttm_bo_wait_unreserved - interruptible wait for a buffer object to become | ||
1711 | * unreserved | ||
1712 | * | ||
1713 | * @bo: Pointer to buffer | ||
1714 | */ | ||
1715 | int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo) | ||
1716 | { | ||
1717 | int ret; | ||
1718 | |||
1719 | /* | ||
1720 | * In the absense of a wait_unlocked API, | ||
1721 | * Use the bo::wu_mutex to avoid triggering livelocks due to | ||
1722 | * concurrent use of this function. Note that this use of | ||
1723 | * bo::wu_mutex can go away if we change locking order to | ||
1724 | * mmap_sem -> bo::reserve. | ||
1725 | */ | ||
1726 | ret = mutex_lock_interruptible(&bo->wu_mutex); | ||
1727 | if (unlikely(ret != 0)) | ||
1728 | return -ERESTARTSYS; | ||
1729 | if (!ww_mutex_is_locked(&bo->resv->lock)) | ||
1730 | goto out_unlock; | ||
1731 | ret = ttm_bo_reserve_nolru(bo, true, false, false, NULL); | ||
1732 | if (unlikely(ret != 0)) | ||
1733 | goto out_unlock; | ||
1734 | ww_mutex_unlock(&bo->resv->lock); | ||
1735 | |||
1736 | out_unlock: | ||
1737 | mutex_unlock(&bo->wu_mutex); | ||
1738 | return ret; | ||
1739 | } | ||