]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
drm/ttm: add support for different pool sizes
authorChristian König <christian.koenig@amd.com>
Tue, 4 Jul 2017 14:56:24 +0000 (16:56 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 6 Oct 2017 21:44:16 +0000 (17:44 -0400)
Correctly handle different page sizes in the memory accounting.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/ttm/ttm_memory.c
drivers/gpu/drm/ttm/ttm_page_alloc.c
drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
include/drm/ttm/ttm_memory.h

index 4f9978cbc5bc857b707389e6798057dc14f3ae42..e963749903986b8c3ea1296052422a79fc71646d 100644 (file)
@@ -546,7 +546,7 @@ int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
 EXPORT_SYMBOL(ttm_mem_global_alloc);
 
 int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
-                             struct page *page)
+                             struct page *page, uint64_t size)
 {
 
        struct ttm_mem_zone *zone = NULL;
@@ -563,10 +563,11 @@ int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
        if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL)
                zone = glob->zone_kernel;
 #endif
-       return ttm_mem_global_alloc_zone(glob, zone, PAGE_SIZE, false, false);
+       return ttm_mem_global_alloc_zone(glob, zone, size, false, false);
 }
 
-void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page)
+void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page,
+                             uint64_t size)
 {
        struct ttm_mem_zone *zone = NULL;
 
@@ -577,10 +578,9 @@ void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page)
        if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL)
                zone = glob->zone_kernel;
 #endif
-       ttm_mem_global_free_zone(glob, zone, PAGE_SIZE);
+       ttm_mem_global_free_zone(glob, zone, size);
 }
 
-
 size_t ttm_round_pot(size_t size)
 {
        if ((size & (size - 1)) == 0)
index 74f465ea914b95a27eb9f2b900eb818a6d7f5a9a..e11fd76e06f43d2365eb07a17066927675ff302e 100644 (file)
@@ -882,7 +882,8 @@ int ttm_pool_populate(struct ttm_tt *ttm)
                        return -ENOMEM;
                }
 
-               ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i]);
+               ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
+                                               PAGE_SIZE);
                if (unlikely(ret != 0)) {
                        ttm_pool_unpopulate(ttm);
                        return -ENOMEM;
@@ -909,7 +910,7 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm)
        for (i = 0; i < ttm->num_pages; ++i) {
                if (ttm->pages[i]) {
                        ttm_mem_global_free_page(ttm->glob->mem_glob,
-                                                ttm->pages[i]);
+                                                ttm->pages[i], PAGE_SIZE);
                        ttm_put_pages(&ttm->pages[i], 1,
                                      ttm->page_flags,
                                      ttm->caching_state);
index b8905bdd4143d38c4e8de30f3657a719b47e7468..53626578004c4872346cae14560b0c845c97a669 100644 (file)
@@ -902,7 +902,8 @@ int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
                        return -ENOMEM;
                }
 
-               ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i]);
+               ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
+                                               pool->size);
                if (unlikely(ret != 0)) {
                        ttm_dma_unpopulate(ttm_dma, dev);
                        return -ENOMEM;
@@ -967,13 +968,13 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev)
        if (is_cached) {
                list_for_each_entry_safe(d_page, next, &ttm_dma->pages_list, page_list) {
                        ttm_mem_global_free_page(ttm->glob->mem_glob,
-                                                d_page->p);
+                                                d_page->p, pool->size);
                        ttm_dma_page_put(pool, d_page);
                }
        } else {
                for (i = 0; i < count; i++) {
                        ttm_mem_global_free_page(ttm->glob->mem_glob,
-                                                ttm->pages[i]);
+                                                ttm->pages[i], pool->size);
                }
        }
 
index 8184ff144176663cf28d8fc9bc48a3b4317d52b4..2c1e3598effe35d15cc139dd1a68f0b87f5a14fd 100644 (file)
@@ -150,9 +150,9 @@ extern int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
 extern void ttm_mem_global_free(struct ttm_mem_global *glob,
                                uint64_t amount);
 extern int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
-                                    struct page *page);
+                                    struct page *page, uint64_t size);
 extern void ttm_mem_global_free_page(struct ttm_mem_global *glob,
-                                    struct page *page);
+                                    struct page *page, uint64_t size);
 extern size_t ttm_round_pot(size_t size);
 extern uint64_t ttm_get_kernel_zone_memory_size(struct ttm_mem_global *glob);
 #endif