diff options
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 44 |
1 files changed, 14 insertions, 30 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index ef223d581a70..9a479885bf59 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
| @@ -1813,41 +1813,25 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink) | |||
| 1813 | uint32_t swap_placement = (TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM); | 1813 | uint32_t swap_placement = (TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM); |
| 1814 | 1814 | ||
| 1815 | spin_lock(&glob->lru_lock); | 1815 | spin_lock(&glob->lru_lock); |
| 1816 | while (ret == -EBUSY) { | 1816 | list_for_each_entry(bo, &glob->swap_lru, swap) { |
| 1817 | if (unlikely(list_empty(&glob->swap_lru))) { | 1817 | ret = ttm_bo_reserve_locked(bo, false, true, false, 0); |
| 1818 | spin_unlock(&glob->lru_lock); | 1818 | if (!ret) |
| 1819 | return -EBUSY; | 1819 | break; |
| 1820 | } | 1820 | } |
| 1821 | |||
| 1822 | bo = list_first_entry(&glob->swap_lru, | ||
| 1823 | struct ttm_buffer_object, swap); | ||
| 1824 | kref_get(&bo->list_kref); | ||
| 1825 | |||
| 1826 | if (!list_empty(&bo->ddestroy)) { | ||
| 1827 | ttm_bo_reserve_locked(bo, false, false, false, 0); | ||
| 1828 | ttm_bo_cleanup_refs_and_unlock(bo, false, false); | ||
| 1829 | 1821 | ||
| 1830 | kref_put(&bo->list_kref, ttm_bo_release_list); | 1822 | if (ret) { |
| 1831 | spin_lock(&glob->lru_lock); | 1823 | spin_unlock(&glob->lru_lock); |
| 1832 | continue; | 1824 | return ret; |
| 1833 | } | 1825 | } |
| 1834 | 1826 | ||
| 1835 | /** | 1827 | kref_get(&bo->list_kref); |
| 1836 | * Reserve buffer. Since we unlock while sleeping, we need | ||
| 1837 | * to re-check that nobody removed us from the swap-list while | ||
| 1838 | * we slept. | ||
| 1839 | */ | ||
| 1840 | 1828 | ||
| 1841 | ret = ttm_bo_reserve_locked(bo, false, true, false, 0); | 1829 | if (!list_empty(&bo->ddestroy)) { |
| 1842 | if (unlikely(ret == -EBUSY)) { | 1830 | ret = ttm_bo_cleanup_refs_and_unlock(bo, false, false); |
| 1843 | spin_unlock(&glob->lru_lock); | 1831 | kref_put(&bo->list_kref, ttm_bo_release_list); |
| 1844 | ttm_bo_wait_unreserved(bo, false); | 1832 | return ret; |
| 1845 | kref_put(&bo->list_kref, ttm_bo_release_list); | ||
| 1846 | spin_lock(&glob->lru_lock); | ||
| 1847 | } | ||
| 1848 | } | 1833 | } |
| 1849 | 1834 | ||
| 1850 | BUG_ON(ret != 0); | ||
| 1851 | put_count = ttm_bo_del_from_lru(bo); | 1835 | put_count = ttm_bo_del_from_lru(bo); |
| 1852 | spin_unlock(&glob->lru_lock); | 1836 | spin_unlock(&glob->lru_lock); |
| 1853 | 1837 | ||
