From: Christian König <christian.koe...@amd.com>

Totally surprisingly this is more efficient than doing it page by page.

Signed-off-by: Christian König <christian.koe...@amd.com>
Acked-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c 
b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index e11fd76..482dd9a 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -873,15 +873,14 @@ int ttm_pool_populate(struct ttm_tt *ttm)
        if (ttm->state != tt_unpopulated)
                return 0;
 
-       for (i = 0; i < ttm->num_pages; ++i) {
-               ret = ttm_get_pages(&ttm->pages[i], 1,
-                                   ttm->page_flags,
-                                   ttm->caching_state);
-               if (ret != 0) {
-                       ttm_pool_unpopulate(ttm);
-                       return -ENOMEM;
-               }
+       ret = ttm_get_pages(ttm->pages, ttm->num_pages, ttm->page_flags,
+                           ttm->caching_state);
+       if (unlikely(ret != 0)) {
+               ttm_pool_unpopulate(ttm);
+               return ret;
+       }
 
+       for (i = 0; i < ttm->num_pages; ++i) {
                ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
                                                PAGE_SIZE);
                if (unlikely(ret != 0)) {
@@ -908,14 +907,14 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm)
        unsigned i;
 
        for (i = 0; i < ttm->num_pages; ++i) {
-               if (ttm->pages[i]) {
-                       ttm_mem_global_free_page(ttm->glob->mem_glob,
-                                                ttm->pages[i], PAGE_SIZE);
-                       ttm_put_pages(&ttm->pages[i], 1,
-                                     ttm->page_flags,
-                                     ttm->caching_state);
-               }
+               if (!ttm->pages[i])
+                       continue;
+
+               ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i],
+                                        PAGE_SIZE);
        }
+       ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags,
+                     ttm->caching_state);
        ttm->state = tt_unpopulated;
 }
 EXPORT_SYMBOL(ttm_pool_unpopulate);
-- 
2.7.4

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

Reply via email to