From: Rob Clark rob@ti.com
Signed-off-by: Rob Clark rob@ti.com --- drivers/gpu/drm/i915/i915_gem.c | 51 +++++++------------------------------- 1 files changed, 10 insertions(+), 41 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index ee59f31..6b49b4e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1450,52 +1450,29 @@ static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj, gfp_t gfpmask) { - int page_count, i; - struct address_space *mapping; - struct inode *inode; - struct page *page; + struct page **pages;
- /* Get the list of pages out of our struct file. They'll be pinned - * at this point until we release them. - */ - page_count = obj->base.size / PAGE_SIZE; BUG_ON(obj->pages != NULL); - obj->pages = drm_malloc_ab(page_count, sizeof(struct page *)); - if (obj->pages == NULL) - return -ENOMEM; - - inode = obj->base.filp->f_path.dentry->d_inode; - mapping = inode->i_mapping; - gfpmask |= mapping_gfp_mask(mapping);
- for (i = 0; i < page_count; i++) { - page = shmem_read_mapping_page_gfp(mapping, i, gfpmask); - if (IS_ERR(page)) - goto err_pages; + pages = drm_gem_get_pages(&obj->base, gfpmask);
- obj->pages[i] = page; + if (IS_ERR(pages)) { + dev_err(obj->base.dev->dev, + "could not get pages: %ld\n", PTR_ERR(pages)); + return PTR_ERR(pages); }
if (obj->tiling_mode != I915_TILING_NONE) i915_gem_object_do_bit_17_swizzle(obj);
- return 0; - -err_pages: - while (i--) - page_cache_release(obj->pages[i]); + obj->pages = pages;
- drm_free_large(obj->pages); - obj->pages = NULL; - return PTR_ERR(page); + return 0; }
static void i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) { - int page_count = obj->base.size / PAGE_SIZE; - int i; - BUG_ON(obj->madv == __I915_MADV_PURGED);
if (obj->tiling_mode != I915_TILING_NONE) @@ -1504,18 +1481,10 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj) if (obj->madv == I915_MADV_DONTNEED) obj->dirty = 0;
- for (i = 0; i < page_count; i++) { - if (obj->dirty) - set_page_dirty(obj->pages[i]); - - if (obj->madv == I915_MADV_WILLNEED) - mark_page_accessed(obj->pages[i]); + drm_gem_put_pages(&obj->base, obj->pages, obj->dirty, + obj->madv == I915_MADV_WILLNEED);
- page_cache_release(obj->pages[i]); - } obj->dirty = 0; - - drm_free_large(obj->pages); obj->pages = NULL; }