drm_gem_shmem_put_pages_locked(shmem);
 
                drm_WARN_ON(obj->dev, shmem->pages_use_count);
+               drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_pin_count));
 
                dma_resv_unlock(shmem->base.resv);
        }
 
        drm_WARN_ON(shmem->base.dev, drm_gem_is_imported(&shmem->base));
 
+       if (refcount_inc_not_zero(&shmem->pages_pin_count))
+               return 0;
+
        ret = drm_gem_shmem_get_pages_locked(shmem);
+       if (!ret)
+               refcount_set(&shmem->pages_pin_count, 1);
 
        return ret;
 }
 {
        dma_resv_assert_held(shmem->base.resv);
 
-       drm_gem_shmem_put_pages_locked(shmem);
+       if (refcount_dec_and_test(&shmem->pages_pin_count))
+               drm_gem_shmem_put_pages_locked(shmem);
 }
 EXPORT_SYMBOL(drm_gem_shmem_unpin_locked);
 
 
        drm_WARN_ON(obj->dev, drm_gem_is_imported(obj));
 
+       if (refcount_inc_not_zero(&shmem->pages_pin_count))
+               return 0;
+
        ret = dma_resv_lock_interruptible(shmem->base.resv, NULL);
        if (ret)
                return ret;
 
        drm_WARN_ON(obj->dev, drm_gem_is_imported(obj));
 
+       if (refcount_dec_not_one(&shmem->pages_pin_count))
+               return;
+
        dma_resv_lock(shmem->base.resv, NULL);
        drm_gem_shmem_unpin_locked(shmem);
        dma_resv_unlock(shmem->base.resv);
        if (drm_gem_is_imported(&shmem->base))
                return;
 
+       drm_printf_indent(p, indent, "pages_pin_count=%u\n", refcount_read(&shmem->pages_pin_count));
        drm_printf_indent(p, indent, "pages_use_count=%u\n", shmem->pages_use_count);
        drm_printf_indent(p, indent, "vmap_use_count=%u\n", shmem->vmap_use_count);
        drm_printf_indent(p, indent, "vaddr=%p\n", shmem->vaddr);
 
         */
        unsigned int pages_use_count;
 
+       /**
+        * @pages_pin_count:
+        *
+        * Reference count on the pinned pages table.
+        *
+        * Pages are hard-pinned and reside in memory if count
+        * greater than zero. Otherwise, when count is zero, the pages are
+        * allowed to be evicted and purged by memory shrinker.
+        */
+       refcount_t pages_pin_count;
+
        /**
         * @madv: State for madvise
         *