static void i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj, struct sg_table *pages) { struct sgt_iter sgt_iter; struct vm_page *page; BUG_ON(obj->userptr.work != NULL); __i915_gem_userptr_set_active(obj, false); if (obj->mm.madv != I915_MADV_WILLNEED) obj->mm.dirty = false; i915_gem_gtt_finish_pages(obj, pages); for_each_sgt_page(page, sgt_iter, pages) { if (obj->mm.dirty) set_page_dirty(page); mark_page_accessed(page); put_page(page); } obj->mm.dirty = false; sg_free_table(pages); kfree(pages); }
static void i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj, struct sg_table *pages) { struct sgt_iter sgt_iter; struct page *page; /* Cancel any inflight work and force them to restart their gup */ obj->userptr.work = NULL; __i915_gem_userptr_set_active(obj, false); if (!pages) return; __i915_gem_object_release_shmem(obj, pages, true); i915_gem_gtt_finish_pages(obj, pages); for_each_sgt_page(page, sgt_iter, pages) { if (obj->mm.dirty) set_page_dirty(page); mark_page_accessed(page); put_page(page); } obj->mm.dirty = false; sg_free_table(pages); kfree(pages); }
static void huge_put_pages(struct drm_i915_gem_object *obj, struct sg_table *pages) { i915_gem_gtt_finish_pages(obj, pages); huge_free_pages(obj, pages); obj->mm.dirty = false; }
static void i915_gem_object_put_pages_internal(struct drm_i915_gem_object *obj, struct sg_table *pages) { i915_gem_gtt_finish_pages(obj, pages); internal_free_pages(pages); obj->mm.dirty = false; obj->mm.madv = I915_MADV_WILLNEED; }