unsigned int has_global_gtt_mapping:1;
 
        struct page **pages;
+       int pages_pin_count;
 
        /**
         * DMAR support
 void i915_gem_lastclose(struct drm_device *dev);
 
 int __must_check i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
+static inline void i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
+{
+       BUG_ON(obj->pages == NULL);
+       obj->pages_pin_count++;
+}
+static inline void i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
+{
+       BUG_ON(obj->pages_pin_count == 0);
+       obj->pages_pin_count--;
+}
+
 int __must_check i915_mutex_lock_interruptible(struct drm_device *dev);
 int i915_gem_object_sync(struct drm_i915_gem_object *obj,
                         struct intel_ring_buffer *to);
 
 
        BUG_ON(obj->gtt_space);
 
+       if (obj->pages_pin_count)
+               return -EBUSY;
+
        ops->put_pages(obj);
 
        list_del(&obj->gtt_list);
        if (obj->sg_table || obj->pages)
                return 0;
 
+       BUG_ON(obj->pages_pin_count);
+
        ret = ops->get_pages(obj);
        if (ret)
                return ret;
                dev_priv->mm.interruptible = was_interruptible;
        }
 
+       obj->pages_pin_count = 0;
        i915_gem_object_put_pages(obj);
        i915_gem_object_free_mmap_offset(obj);
 
 
        cnt = 0;
        list_for_each_entry(obj, &dev_priv->mm.unbound_list, gtt_list)
-               cnt += obj->base.size >> PAGE_SHIFT;
+               if (obj->pages_pin_count == 0)
+                       cnt += obj->base.size >> PAGE_SHIFT;
        list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list)
-               if (obj->pin_count == 0)
+               if (obj->pin_count == 0 && obj->pages_pin_count == 0)
                        cnt += obj->base.size >> PAGE_SHIFT;
 
        mutex_unlock(&dev->struct_mutex);
 
        /* link the pages into an SG then map the sg */
        sg = drm_prime_pages_to_sg(obj->pages, npages);
        nents = dma_map_sg(attachment->dev, sg->sgl, sg->nents, dir);
+       i915_gem_object_pin_pages(obj);
+
 out:
        mutex_unlock(&dev->struct_mutex);
        return sg;
        }
 
        obj->vmapping_count = 1;
+       i915_gem_object_pin_pages(obj);
 out_unlock:
        mutex_unlock(&dev->struct_mutex);
        return obj->dma_buf_vmapping;
        if (ret)
                return;
 
-       --obj->vmapping_count;
-       if (obj->vmapping_count == 0) {
+       if (--obj->vmapping_count == 0) {
                vunmap(obj->dma_buf_vmapping);
                obj->dma_buf_vmapping = NULL;
+
+               i915_gem_object_unpin_pages(obj);
        }
        mutex_unlock(&dev->struct_mutex);
 }