struct ttm_bo_device *bdev = bo->bdev;
        struct ttm_resource_manager *man;
 
-       if (!list_empty(&bo->lru))
+       if (!list_empty(&bo->lru) || bo->pin_count)
                return;
 
        if (mem->placement & TTM_PL_FLAG_NO_EVICT)
        ttm_bo_del_from_lru(bo);
        ttm_bo_add_mem_to_lru(bo, &bo->mem);
 
-       if (bulk && !(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) {
+       if (bulk && !(bo->mem.placement & TTM_PL_FLAG_NO_EVICT) &&
+           !bo->pin_count) {
                switch (bo->mem.mem_type) {
                case TTM_PL_TT:
                        ttm_bo_bulk_move_set_pos(&bulk->tt[bo->priority], bo);
                 * shrinkers, now that they are queued for
                 * destruction.
                 */
-               if (bo->mem.placement & TTM_PL_FLAG_NO_EVICT) {
+               if (bo->mem.placement & TTM_PL_FLAG_NO_EVICT || bo->pin_count) {
                        bo->mem.placement &= ~TTM_PL_FLAG_NO_EVICT;
+                       bo->pin_count = 0;
                        ttm_bo_del_from_lru(bo);
                        ttm_bo_add_mem_to_lru(bo, &bo->mem);
                }
        bo->moving = NULL;
        bo->mem.placement = TTM_PL_FLAG_CACHED;
        bo->acc_size = acc_size;
+       bo->pin_count = 0;
        bo->sg = sg;
        if (resv) {
                bo->base.resv = resv;
 
                return -ENOMEM;
 
        fbo->base = *bo;
-       fbo->base.mem.placement |= TTM_PL_FLAG_NO_EVICT;
 
        ttm_bo_get(bo);
        fbo->bo = bo;
        kref_init(&fbo->base.kref);
        fbo->base.destroy = &ttm_transfered_destroy;
        fbo->base.acc_size = 0;
+       fbo->base.pin_count = 1;
        if (bo->type != ttm_bo_type_sg)
                fbo->base.base.resv = &fbo->base.base._resv;
 
 
 
        struct dma_fence *moving;
        unsigned priority;
+       unsigned pin_count;
 
        /**
         * Special members that are protected by the reserve lock
        return bo->base.dev != NULL;
 }
 
+/**
+ * ttm_bo_pin - Pin the buffer object.
+ * @bo: The buffer object to pin
+ *
+ * Make sure the buffer is not evicted any more during memory pressure.
+ */
+static inline void ttm_bo_pin(struct ttm_buffer_object *bo)
+{
+       dma_resv_assert_held(bo->base.resv);
+       ++bo->pin_count;
+}
+
+/**
+ * ttm_bo_unpin - Unpin the buffer object.
+ * @bo: The buffer object to unpin
+ *
+ * Allows the buffer object to be evicted again during memory pressure.
+ */
+static inline void ttm_bo_unpin(struct ttm_buffer_object *bo)
+{
+       dma_resv_assert_held(bo->base.resv);
+       WARN_ON_ONCE(!bo->pin_count);
+       --bo->pin_count;
+}
+
 int ttm_mem_evict_first(struct ttm_bo_device *bdev,
                        struct ttm_resource_manager *man,
                        const struct ttm_place *place,