[PATCH 3/4] drm/ttm: add static buffer for ttm_pages_put to support pool shrink

Roger He Hongbo.He at amd.com
Wed Nov 22 05:36:55 UTC 2017


Change-Id: Ic20c016eb3043d7cfedc2e3648790a017168da6c
Signed-off-by: Roger He <Hongbo.He at 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



More information about the dri-devel mailing list