Change-Id: Ic20c016eb3043d7cfedc2e3648790a017168da6c
Signed-off-by: Roger He <hongbo...@amd.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c 
b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index de64209..37c2f2f 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -285,20 +285,27 @@ static struct ttm_page_pool *ttm_get_pool(int flags, bool 
huge,
 }
 
 /* set memory back to wb and free the pages. */
+#define STATIC_BUF_PUT_SIZE 512
 static void ttm_pages_put(struct page *pages[], unsigned npages,
-               unsigned int order)
+               unsigned int order, bool use_static)
 {
+       static struct page *static_buf_put[STATIC_BUF_PUT_SIZE];
        struct page **pages_to_free = NULL;
        struct page **pages_array;
        struct page *p;
        unsigned int i, j, pages_nr = (1 << order);
 
+       BUG_ON(use_static && pages_nr > STATIC_BUF_PUT_SIZE);
        if (order > 0) {
-               pages_to_free = kmalloc_array(pages_nr, sizeof(struct page *),
-                                       GFP_KERNEL);
-               if (!pages_to_free) {
-                       pr_err("Failed to allocate memory for ttm pages put 
operation\n");
-                       return;
+               if (use_static)
+                       pages_to_free = static_buf_put;
+               else {
+                       pages_to_free = kmalloc_array(pages_nr,
+                               sizeof(struct page *), GFP_KERNEL);
+                       if (!pages_to_free) {
+                               pr_err("Failed to allocate memory for ttm pages 
put operation\n");
+                               return;
+                       }
                }
        }
 
@@ -317,7 +324,8 @@ static void ttm_pages_put(struct page *pages[], unsigned 
npages,
                __free_pages(pages[i], order);
        }
 
-       kfree(pages_to_free);
+       if (!use_static)
+               kfree(pages_to_free);
 }
 
 static void ttm_pool_update_free_locked(struct ttm_page_pool *pool,
@@ -380,7 +388,8 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, 
unsigned nr_free,
                         */
                        spin_unlock_irqrestore(&pool->lock, irq_flags);
 
-                       ttm_pages_put(pages_to_free, freed_pages, pool->order);
+                       ttm_pages_put(pages_to_free, freed_pages, pool->order,
+                                       use_static);
                        if (likely(nr_free != FREE_ALL_PAGES))
                                nr_free -= freed_pages;
 
@@ -415,7 +424,8 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, 
unsigned nr_free,
        spin_unlock_irqrestore(&pool->lock, irq_flags);
 
        if (freed_pages)
-               ttm_pages_put(pages_to_free, freed_pages, pool->order);
+               ttm_pages_put(pages_to_free, freed_pages, pool->order,
+                       use_static);
 out:
        if (pages_to_free != static_buf)
                kfree(pages_to_free);
-- 
2.7.4

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

Reply via email to