From: Rob Clark <r...@ti.com>

Signed-off-by: Rob Clark <r...@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;
 }
 
-- 
1.7.5.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to