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);